Страница 1 из 1

Снова Переход с Меги8 на Мегу88

Добавлено: Вт дек 23, 2008 12:23:07
FedorChek
Вобщем методом «тыка» с горем пополам выяснил на какой строчке меня выкидывает в ошибку
Прошу направить на путь «истинный»
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>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>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>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>T0_MIN)&&(time_imp<T0_MAX>T1_MIN)&&(time_imp<T1_MAX))
{
read_byte+=1;
}
else
return 2; // ошибка - не соотв. длительность импульса
}
}
ByteIR = read_byte;
return 0; // успех
}

Добавлено: Ср дек 24, 2008 18:47:17
pirotehnick
Не знаю что требуется от этой программы, но при чтении 16-разрядных регистров таймера первым должен быть прочитан младший байт, т.е. TCNT1L.

Добавлено: Ср дек 24, 2008 19:01:25
OBIVAN
Или в 16 разрядную переменную temp=TCNT1

Добавлено: Пт дек 26, 2008 10:55:22
FedorChek
А как это реализовать ?

Добавлено: Сб дек 27, 2008 02:23:38
OBIVAN
У Вас скорее переход не с меги8 ,а с одного компилятора на другой, отсюда и проблемы , winavr если я не ошибаюсь умеет так делать, что касается cvavr то там надо как написал pirotehnick постом выше.