roboforum.ru

Технический форум по робототехнике.

Проблема в переносе прошивки с Mega16 на tiny2313

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Проблема в переносе прошивки с Mega16 на tiny2313

Сообщение Dima_Krasnoyarsk » 18 апр 2009, 13:53

Сделал устройство которое принимает сигнал с пульта телевизора, и управляет нагрузкой.

На mega16 все работает отлично, но вот при переносе на tiny2313 возникли проблемы. Единственное место где я считаю могут быть косяки, это в управлении таймерами.

Для управления таймерами в прошивке для mega16 я делал так:
TCNT0=0x00; // обнулял значение таймера, отсюда же брал значение сколько протикал таймер.
TCСR0=0х04; // запускал таймер

В tiny2313
TCNT0=0x00; // обнулял значение таймера, отсюда же брал значение сколько протикал таймер.
TCCR0B=0x04; // запускал таймер

Может гденибудь еще могут быть различия в управлении таймерами там и там?
Dima_Krasnoyarsk
 
Сообщения: 60
Зарегистрирован: 02 сен 2007, 13:39
Откуда: Красноярск

Re: Проблема в переносе прошивки с Mega16 на tiny2313

Сообщение avr123.nm.ru » 18 апр 2009, 13:59

Надо всю прогу просмотреть на наличие разных регистров в этих МК.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Проблема в переносе прошивки с Mega16 на tiny2313

Сообщение Dima_Krasnoyarsk » 18 апр 2009, 14:10

Я уже все проверил раз 5. Вот код для mega16
Код: Выделить всёРазвернуть
#include <mega16.h> 
#include <delay.h> 
#include <stdio.h>

bit power=0;       // 0-выключено 1-включено
bit direction=0;   // 0-влево 1-вправо
bit run=0;         // 0-стоп 1-крутим
bit pause_flag=0;  // для выдерживания паузы перед переключением   


unsigned char cnt_bit = 0;              //счетчик принятых бит
unsigned char code [14];                //принятый код

unsigned char counter = 0;              //"тики" таймера

#define l_min    73                  //диапазон для "длинного" (long) интервала в посылке, в "тиках" таймера, 1,28..2,176мс
#define l_max    125
#define s_min    40                  //диапазон для "короткого" (short) интервала в посылке, в "тиках" таймера, 0,704..1,088мс
#define s_max    62

bit state =  0;                                 //флаг состояния линии приема
bit error = 0;                                  //флаг ошибки

//переменные структуры посылки, всего 14 бит
unsigned char startbit1 = 0;                    //первый стартовый бит, д.б. = 1
unsigned char startbit2 = 0;                    //второй стартовый бит, д.б. = 1                   
unsigned char toggle = 0;                       //триггерный бит, инвертируется в посылке при нажатии кнопки, при удержании - не инв.!
unsigned char address = 0;                      //адрес устройства, 5 бит
unsigned char command = 0;                      //команда (данные), 6 бит



interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
pause_flag=0; // разрешаем переключение питания
run=0;
TCCR1B=0x00;  // останавливаем таймер

}

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
        {
       
        counter = TCNT0;
                                                //сохраяем значение таймера-счетчика
        TCNT0 = 0x00;                           //обнуляем таймер
        error = 1;                              //поставили ошибку - потом сбросим в теле, если все ок
           
        if (cnt_bit == 0)                       //старт посылки   
                {
                TCCR0 = 0x04;                           //запускаем таймер, частота 31250кГц (или надо править диапазоны тиков для интервалов)
                code [cnt_bit] = !PIND.2;               //записываем бит кода, PIND.2 - входная нога, прерывание 0
                cnt_bit++;                              //увеличиваем счетчик принятых бит
                state = 1;                              //ставим флаг, т.к. была 1
                }
                 
                else                                        //в других случаях (не первое срабатывание прерывания)
                        {
                        if ((counter>s_min) && (counter<s_max)) //проверка короткого промежутка
                                {
                                if (state)                      //если была 1
                                        {
                                        state = 0;              //обнуляем состояние
                                        error = 0;              //и ошибку, т.к. все корректно
                                        }
                                        else                    //если был 0
                                                {
                                                state = 1;                      //ставим флаг, т.к. теперь - 1
                                                code[cnt_bit] = !PIND.2;        //записываем данные - состояние линии
                                                cnt_bit++;                      //увеличиваем счетчик приема
                                                error=0;                        //обнуляем ошибку, т.к. все корректно
                                                };
                                };     
                   
                        if ((counter>l_min) && (counter<l_max)) //проверка длинного промежутка
                                {
                                code[cnt_bit] = !PIND.2;        //записываем данные - состояние линии
                                cnt_bit++;                      //увеличиваем счетчик приема
                                error = 0;                      //обнуляем ошибку, т.к. все корректно
                                };
                                                 
                        if (error == 1)                         //если не попали ни в один из промежутков, то
                                {
                                char i = 0;                     //внутренняя переменная
                               
                                TCCR0 = 0x00;                   //останавливаем таймер
                                TCNT0 = 0x00;                   //обнуляем таймер
                                counter = 0;                    //обнуляем счетчик
                                cnt_bit = 0;                    //обнуляем счетчик принятых бит
                                for (i=0; i<14; i++) code[i]=0; //обнуляем массив принятого кода
                                };
                   
                        if (cnt_bit == 14)                      //если приняли все 14 бит
                                {
                                char i = 0;                     //внутренняя переменная
                                TCCR0 = 0x00;                   //останавливаем таймер
                                TCNT0 = 0x00;;                  //обнуляем таймер
                                cnt_bit = 0;                    //обнуляем счетчик принятых бит
                               
                                startbit1 = code[0];            //первый стартовый бит
                                startbit2 = code[1];            //второй стартовый бит
                                toggle = code[2];               //триггер-бит
                                                                //формируем переменные адреса и команды
                                address = (code[3] << 4)|(code[4] << 3)|(code[5] << 2)|(code[6] << 1)|code[7];                   
                                command = (code[8] << 5)|(code[9] << 4)|(code[10] << 3 )|(code[11] << 2)|(code[12] << 1)|code[13];
                               
                                if (command==12)
                                {
                                PORTB.0^=1; // инвертируем состояние включено/выключено;
                                                       
                                }
                                     
                                for (i=0; i<14; i++) code[i]=0; //обнуляем массив принятого кода
                                };
                        };                                                                               
        }

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
        {
        char i = 0;                     //внутренняя переменная
       
        TCCR0 = 0x00;                   //останавливаем таймер
        TCNT0 = 0x00;                   //обнуляем таймер
        counter = 0;                    //обнуляем счетчик
        cnt_bit = 0;                    //обнуляем счетчик принятых бит
        for (i=0; i<14; i++) code[i]=0; //обнуляем массив принятого кода
        }



void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=0
PORTB=0x00;
DDRB=0x07;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 14,400 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x01;
MCUCSR=0x00;
GIFR=0x40;
             
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x5F;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x05;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
      {
      };
}
Dima_Krasnoyarsk
 
Сообщения: 60
Зарегистрирован: 02 сен 2007, 13:39
Откуда: Красноярск

Re: Проблема в переносе прошивки с Mega16 на tiny2313

Сообщение galex1981 » 18 апр 2009, 14:41

а для tiny2313 где код?
if(!Operate) Read(pDatasheet);
Аватара пользователя
galex1981
 
Сообщения: 4363
Зарегистрирован: 04 дек 2008, 22:44
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович

Re: Проблема в переносе прошивки с Mega16 на tiny2313

Сообщение Krik99 » 21 апр 2009, 22:58

Аватара пользователя
Krik99
 
Сообщения: 17
Зарегистрирован: 02 янв 2008, 22:03
Откуда: Одесса
прог. языки: Си

Re: Проблема в переносе прошивки с Mega16 на tiny2313

Сообщение Dima_Krasnoyarsk » 28 апр 2009, 17:40

Похоже ошибка была в том что при остановке таймера в тини а не обнулял регистр GIMSK|=0x00;
Dima_Krasnoyarsk
 
Сообщения: 60
Зарегистрирован: 02 сен 2007, 13:39
Откуда: Красноярск


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7