Без предисловий к делу: нужна Ваша помощь.
Дано: от одного самого умного инженера досталась плата на меге с ик-приемником (TSOP-31236) и кучей обвеса.
Сей премудрый инженер умудрился повесить приемник НЕ на внешнее прерывание, а на ногу PB.0
Программист написал под это дело программу, работает. Пришло время править код - у программиста аврал, не до того. Запрягли самого близко знакомого с мегами
Плата находится в массовом производстве, исправлять трассировку - нельзя.
Начал практиччески с нуля вспоминать си и меги в частности... Сам работаю для удовольствия в джаве.
Для лучшего понимания начал писать программу с нуля, а не перепиливать имеющуюся...
Итак...
Частота процессора 11059200 гц. Соответствующая константа FCLK наличествует в заголовке основого файла, и в проекте указана (CodeVision).
Есть старый код обработки данных:
Код: Выделить всё
//#define DivOvfTC2 37 // Константа выверена для FCLK=11059200 уточнена для FCLK=16MHz
//#define DivOvfTC2 (FCLK/296296) // 37 для FCLK=11059200
#define DivOvfTC2 (FCLK/291031) // 38 для FCLK=11059200
unsigned char cntOvfTC2=0,rc5command;
unsigned char RC5cnt14=0,RC5prev1=0x1,RC5prev2=0x1;
unsigned int RC5code=0xFFFF,RC5temp=0xFFFF,RC5delay=0;
// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void){
unsigned char RC5tek;
cntOvfTC2++;
if (cntOvfTC2>=DivOvfTC2){
// Константа DivOvfTC2 выверена для кварца на 11059200 МГц... (определена в RC5_T2.h)
RC5delay++;
if (RC5delay>562){
RC5tek=PINRC5 & (1<<DD_RC5);
if ((RC5tek==0) || (RC5prev1==0) || (RC5prev2==0)){
RC5cnt14++;
if ((RC5cnt14 & 1)==0){ // Есть очередной разряд
RC5temp<<=1; // Накопление результата
if (RC5prev1==0) RC5temp|=1;
}
if ((RC5cnt14==28) && ((RC5temp & 0xF0)!=0xF0)){
RC5code=RC5temp;
RC5delay=0;
rc5command=RC5code&0x3F;
}
RC5prev2=RC5prev1; RC5prev1=RC5tek;
}else{
RC5cnt14=0; RC5temp=0x00;
}
}
cntOvfTC2=0;
}
}Далее в основном цикле программы опрашиваются переменные и выводится полученная команда на экран:
Код: Выделить всё
if (RC5code != 0xFFFF){
clearBuffer();
flushBuffer();
delay_ms(100);
putNumberIntoBuffer(0,rc5command,4);
RC5code=0xFFFF; // Нажатие кнопки ПДУ отработано...
flushBuffer();
}
Но, работает это дело очень криво: часть кнопок не работает. Если сработало - выдает не всегда одинаковый код на дисплей.
Есть ли у кого-нибудь опыт "разборок" с RC5 без внешнего прерывания, чисто по таймерам?
Буду очень благодарен за помощь!
only pure true norwegian blackx 