Вчера просидел всю ночь но так и не разобрался, еще больше стало вопросов. Вобщем методом «тыка» с горем пополам выяснил на какой строчке меня выкидывает в ошибку
Прошу направить на путь «истинный»
1. строка while((time_out›0) and (ACSR & 0x20)==0))-- time_out; // Wait for first impulse
Было под Мегу 8 while((--time_out)&&(!ACSR.5)); // Wait for first impulse
Тут вроде работает…
Далее дошел до строк
2. time_imp=TCNT1H; // Здесь заведомо не правильно
time_imp=TCNT1L; // Здесь заведомо не правильно
//Под Мегу8 было time_imp=TCNT1 но такой вариант у меня не прокатывает в CodeAVR
// анализ длительности
if ((time_imp›T0_MIN)&&(time_imp‹T0_MAX)) где (#define T0_MAX 428
#define T0_MIN 22
отсюда меня «посылают очень далеко»
На данный момент ни фига не понял как работает счетчик, что он пишет в time_imp вобщем я думаю если разобраться с этой строчкой должно хоть что-то заработать.
Но оно меня достало?
Код:
|
unsigned char read_IR(void) // возращает ошибки приема ИК порта. =0 - no error. =1 - timeout. =2 - не соотв. длительность импульса. Принятый байт - ByteIR
{
unsigned char read_byte, i;
unsigned int time_out, time_imp;
// инициализация портов компаратора
DDRD.6=0; // порт на вход
PORTD.6=0; // pull-up disable
DDRD.7=0; // порт на вход
PORTD.7=0; // pull-up disable
// Analog Comparator initialization
// Analog Comparator: On
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x00;
GTCCR = 0;
ADCSRB = 0;
MCUCR = 0;
//SFIOR=0x00; //Это то что было под Мегу8
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00; // останов таймера
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
read_byte=0;
ByteIR=0;
// Старший бит принимается первым
//7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit
TCNT1H=0x0000; // обнуление регистра счетчика
TCNT1L=0x0000; // обнуление регистра счетчика
//if (IR_TIME_OUT›3250)
// time_out=65000;
// else
// time_out=IR_TIME_OUT*20; // IR_TIME_OUT=1600 -› 10 сек таймаут ожидания первого импульса
time_out=65000;
Вот тут изменил
while((time_out›0) and (ACSR & 0x20)==0))-- time_out; // Wait for first impulse
TCCR1B=0x01; // запуск таймера f=32768/1 Гц
if (!time_out)
{
TCCR1B=0x00; // останов таймера
return 1; // ошибка - timeout
};
// ждем окончания импульса или таймаута
time_out=IR_TIME_OUT;
while((time_out›0) and (ACSR & 0x20)==0))-- time_out; // Wait for first impulse
TCCR1B=0x00; // останов таймера
if (!time_out)
return 1; // ошибка - timeout
1 с этого места начинаются Проблемы
time_imp=TCNT1H;
time_imp=TCNT1L;
// анализ длительности
if ((time_imp›T0_MIN)&&(time_imp‹T0_MAX))
read_byte=0;
else
{
if ((time_imp›T1_MIN)&&(time_imp‹T1_MAX))
read_byte=1;
else
return 2; // ошибка - не соотв. длительность импульса
}
//7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit
for(i=0;i‹7;i++) // читаем оставшиеся 7 бит
{
time_out=IR_TIME_OUT;
TCNT1H = 0;
TCNT1L = 0;
//TCNT1=0x0000; // обнуление регистра счетчика
while((--time_out)&&((ACSR & 0x20)==0)); // Wait for next impulse or timeout
TCCR1B=0x01; // запуск таймера f=32768/1 Гц
if (!time_out)
{
TCCR1B=0x00; // останов таймера
return 1; // ошибка - timeout
};
// ждем окончания импульса или таймаута
time_out=IR_TIME_OUT;
while((time_out›0) and (ACSR & 0x20)==0))-- time_out; // Wait for first impulse
TCCR1B=0x00; // останов таймера
if (!time_out)
return 1; // ошибка - timeout
time_imp=TCNT1H;
time_imp=TCNT1L;
read_byte‹‹=1;
// анализ длительности
if ((time_imp›T0_MIN)&&(time_imp‹T0_MAX))
{
read_byte+=0;
}
else
{
if ((time_imp›T1_MIN)&&(time_imp‹T1_MAX))
{
read_byte+=1;
}
else
return 2; // ошибка - не соотв. длительность импульса
}
}
ByteIR = read_byte;
return 0; // успех
} |