Заголовок сообщения: [?] RC5+mega БЕЗ внешнего прерывания?
Добавлено: Пн фев 18, 2013 08:18:10
Встал на лапы
Зарегистрирован: Чт мар 05, 2009 08:15:25 Сообщений: 93
Рейтинг сообщения:0
Здравствуйте, премногоуважаемые коты!
Без предисловий к делу: нужна Ваша помощь.
Дано: от одного самого умного инженера досталась плата на меге с ик-приемником (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);
Сей премудрый инженер умудрился повесить приемник НЕ на внешнее прерывание, а на ногу PB.0
Какой камень, может на PB0 имеется всетаки какое прерывание? Обязательно INTn использовать чтоли, можно любой вектор использовать, а событие обрабатывать уже как угодно.
Сей премудрый инженер умудрился повесить приемник НЕ на внешнее прерывание, а на ногу PB.0
Я тоже делал декодирование не по внешнему прерыванию, все отлично работает (мне даже больше нравится такой вариант чем по внешнему прерыванию), просто настраиваеш таймер счетчик на частоту в 10 раз больше чем частота RC5 и в каждом прерывании анализируеш состояние линии.....
Почему? В меге 8 есть поддержка внешнего прерывания (ноги PD2 и PD3).
Если вы имели ввиду конкретно пин PB0, то по нему тоже можно прерывание сгенерить. Его альтернативная функция - ICP1 - Input Capture Pin 1.
Atmel datashit писал(а):
When a change of the logic level (an event) occurs on the Input Capture Pin (ICP1), alternatively on the Analog Comparator Output (ACO), and this change confirms to the setting of the edge detector, a capture will be triggered. When a capture is triggered, the 16-bit value of the counter (TCNT1) is written to the Input Capture Register (ICR1). The Input Capture Flag (ICF1) is set at the same system clock as the TCNT1 value is copied into ICR1 Register. If enabled (TICIE1 = 1), the Input Capture Flag generates an Input Capture interrupt. The ICF1 Flag is automatically cleared when the interrupt is executed. Alternatively the ICF1 Flag can be cleared by software by writing a logical one to its I/O bit location.
При изменении уровня на ноге происходит копирование значения TCNT1 в регистр ICR1, одновмеренно устанавливается флаг ICF1, и если TICIE1 = 1 то генерируется прерывание.
В сообщении ниже также уже ответили, собственно
_________________ only pure true norwegian blackx
Последний раз редактировалось blackx Пн фев 18, 2013 11:39:24, всего редактировалось 2 раз(а).
Заголовок сообщения: Re: [?] RC5+mega БЕЗ внешнего прерывания?
Добавлено: Чт фев 21, 2013 12:42:34
Встал на лапы
Зарегистрирован: Чт мар 05, 2009 08:15:25 Сообщений: 93
Рейтинг сообщения:0
Вообщем, нашел исходник, слегка переделал его на прерывание ICP1... Работает даже более, чем идеально: команды посылаются каждые 114мс, и слишком часто обрабатываются нажатия.
Пока решил эту проблему простым таймаутом, но хотелось бы более правильно: обработкой третьего бита команды.
Полностью "переварить" код пока не могу, прощу помощи.
Итак, код, который работает:
Код:
unsigned char rc5command,rc5temp1,rc5temp2; unsigned int rc5time,rc5data;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения