Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

RC-5 без использования внешнего прерывания (?)

Сб авг 04, 2012 17:25:28

Здравствуйте, уважаемые коты!

Скажите, возможна ли реализация чтения протокола RC-5 (пульты ИК) без использования внешнего прерывания МК?
Может, кто-нибудь делал такое?

Re: RC-5 без использования внешнего прерывания (?)

Сб авг 04, 2012 21:41:12

Можно, только сигнал с приемника придется программно отслеживать.

Re: RC-5 без использования внешнего прерывания (?)

Сб авг 04, 2012 21:59:18

очень себе таки и можно.....например повесить на АЦП или на компаратор ... или на ногу захвата таймера.....это всё тоже косвенные возможности реагировать мгновенно на внешнее событие

Re: RC-5 без использования внешнего прерывания (?)

Вс авг 05, 2012 04:33:48

Ясно, спасибо...
Просто до паяльника смогу добраться только в конце недели, а железка лежит себе рядом, так и просит запрограммироваться. :)
Только вот ИК-датчик повесил по дурости куда придется, а не на прерывание...

Re: RC-5 без использования внешнего прерывания (?)

Вс авг 05, 2012 08:14:01

можно программно - заводите опорный таймер на 10..50кГц и в прерывании опрашивайте вход.
считайте длительность постоянного уровня до изменения на входе, эти длительности декодируйте в 0/1 и складывайте в буфер.
по заполнению буфера нужным числом перепадов - получите код посылки.

Re: RC-5 без использования внешнего прерывания (?)

Вс авг 05, 2012 09:06:50

qwerky писал(а):можно программно - заводите опорный таймер на 10..50кГц и в прерывании опрашивайте вход.
считайте длительность постоянного уровня до изменения на входе, эти длительности декодируйте в 0/1 и складывайте в буфер.
по заполнению буфера нужным числом перепадов - получите код посылки.
+1
Я именно так и делал.
Мало того, если контроллер особо ни чего не делает, просто дождаться команды и чегото там вкл\выкл, то можно и без таймера, прям в основном цикле задержками организовать опрос входа и обработку данных.

Re: RC-5 без использования внешнего прерывания (?)

Вс авг 05, 2012 09:15:22

С RC5 еще не сталкивался, но Sony (протокол SIRC), и Samsung (протокол NEC/JVC или похожий) декодируется на ура.
Можно сделать дополнительную прослойку-декодер в общую кодировку - тогда можно совместить в одном куске работу с пульта и локальной клавиатуры.

Re: RC-5 без использования внешнего прерывания (?)

Вс авг 05, 2012 09:40:31

Всё можно, но смысл? Они заняты? Тогда что за контроллер? У более современных серий AVR есть еще PCINT прерывания, раскиданные почти по всем ногам.

Re: RC-5 без использования внешнего прерывания (?)

Вс авг 05, 2012 20:09:06

МК 8535, порты внешних прерываний не заняты, но по глупости при проектировке запаял дитчик не туда. А до паяльника смогу добраться только к середине недели...

Re: RC-5 без использования внешнего прерывания (?)

Вс авг 05, 2012 22:13:38

Johnson писал(а):МК 8535, порты внешних прерываний не заняты, но по глупости при проектировке запаял дитчик не туда. А до паяльника смогу добраться только к середине недели...

На какую ногу запаял, какие на ней есть аппаратные функции, может через них можно и аппаратно следить?

Re: RC-5 без использования внешнего прерывания (?)

Пн авг 06, 2012 04:56:43

PD6 (ICP1)

Пофиг, сползаю седня до паяльника, переделаю как у всех...

Re: RC-5 без использования внешнего прерывания (?)

Пн авг 06, 2012 07:14:45

Этот пин вроде, можно использовать как внешнее прерывание захвата счетчика таймера1, вектор прерывания TIMER1 CAPT указываешь на свою процедуру, и делай там че хочешь. Ну естественно нужно настроить соотв. регистры управления, чтобы прерывания срабатывали.

Re: RC-5 без использования внешнего прерывания (?)

Пн авг 06, 2012 07:22:39

Дла срабатывания этого прерывания, нужно включить вит TICIE1 в регистре TIMSK

Re: RC-5 без использования внешнего прерывания (?)

Пн авг 06, 2012 10:45:51

Да ладно, запаял уже на INT0...
Буду теперь по примерам разбираться как устроено всё это. :)

Re: RC-5 без использования внешнего прерывания (?)

Пн авг 06, 2012 11:13:19

На INT0 конечно же лучше, т.к. INT0 можно настроить на срабатывание по положительному + по отрицательному фронту, а вот ICP1 только по отрицательному.

Re: RC-5 без использования внешнего прерывания (?)

Пн авг 06, 2012 14:18:22

Хм... Пульт оказался мертвым... Выдавал всегда только одиночный импульс и не повторялся.
Взял другой пульт, он оказался с протоколом NEC.
Взял примеры в инете, но ни как не могу победить их.
Складывается такое ощущение, что таймер не так запускаю.
Подскажите, пожалуйста, ошибку.

Спойлер
Код:


void tmr_reset() {
    TCCR0=0; //Выключаем счетчик
    TCNT0=0; //Сбрасываем счетчик
    evt_cnt=0;
}
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
    tmr_reset(); //Если счетчик переполнен, выключаем и обнуляем его
    PORTD.3 = 1;
     
}

interrupt [EXT_INT0] void ext_int0_isr(void){
     
   if (evt_cnt == 0) TCCR0=4; //Если первое событие включаем счетчик, 15.625КГц
   if (evt_cnt == 1 && ( TCNT0 < 130 || TCNT0 > 150 )){
        tmr_reset(); //Второе событие, если импульс не входит в интервал, выключаем счетчик
        //LCD_draw_char(1,0,'=');
        //LCD_draw_digit(1,10,TCNT0/100);
        //LCD_draw_char(1,0,'-');
    }
   if (evt_cnt == 2) {
      if (TCNT0 < 60 || TCNT0 > 80) { //Проверка на удержание клавиши
         tmr_reset();
         if (TCNT0 < 60 && pvk[2] != 0){
                LCD_draw_char(0,0,pvkc);
                LCD_draw_char(0,0,pvk[1]);
                //keypress(pvkc,pvk[1]); //Вызываем функцию удержания клавиши
            }
      }else{ //Если первое нажатие сбрасываем значения
         pvkc=0;
         pvk[0]=0;
         pvk[1]=0;
         pvk[2]=0;
      }
   }
   if (TCCR0 != 0) { //Если счетчик включен
      if (evt_cnt > 3 && evt_cnt < 67 && (evt_cnt & 1) == 0) {
         if (evt_cnt < 36) {
            if (TCNT0 > 21) pvkc |= 1<<(17-(evt_cnt>>1)); //Собираем по биту CUSTOM code
         }else if(evt_cnt<52) {
            if (TCNT0>21) pvk[1]|=1<<(25-(evt_cnt>>1)); //DATA code
         }else{
            if (TCNT0>21) pvk[0]|=1<<(33-(evt_cnt>>1)); //invert DATA code
         }
      }
      evt_cnt++; //Инкриминируем счетчик событий
      if (evt_cnt > 67) {
         tmr_reset(); //Выключам счетчик
         if (pvk[1]==(pvk[0]^0xff)) { //Проверяем DATA code   
            pvk[2]=1; //Значит Ок
            //keydown(pvkc,pvk[1]); //Вызываем функцию нажатия клавиши
                //LCD_draw_char(0,0,pvkc);
                //LCD_draw_char(0,0,pvk[1]);
         }
      }
      TCNT0=0; //Сбрасываем счетчик
   }

}

//////////////////////////////////////////////////////////
    TCCR2=0b00000100; //250 kHz
   
    TIMSK=0b01000001;   // TIM2-overflow, TIM0-overflow
    ACSR =0b10000000;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
    GICR|=0x40;
    MCUCR=0x01;
    MCUCSR=0x00;
    GIFR=0x40;


По закомментированным кускам в прерывании видно, что я пытался отследить, какое значение имеет TCNT0, но он всегда возвращал "0", и в случае TCNT0/10 и в случае TCNT0/100

Подскажите, где я опять споткнулся?

А ещё был бы очень благодарен за ссылку на статью о таймерах и рассчете их таймингов.
К примеру, таймер установлен на 15кГц. Это он переполняться будет с частотой 15кГц, или инкрементировать счетчик?

Re: RC-5 без использования внешнего прерывания (?)

Пн авг 06, 2012 15:47:00

Johnson писал(а):По закомментированным кускам в прерывании видно, что я пытался отследить, какое значение имеет TCNT0, но он всегда возвращал "0", и в случае TCNT0/10 и в случае TCNT0/100

Подскажите, где я опять споткнулся?

А ещё был бы очень благодарен за ссылку на статью о таймерах и рассчете их таймингов.
К примеру, таймер установлен на 15кГц. Это он переполняться будет с частотой 15кГц, или инкрементировать счетчик?


Когда таймер ловишь при переполнении, то он всегда будет выдавать "0", потому что он переполнился, по нулю в таймере и определяется его переполнение, тут надо расчитывать значение таймера "от обратного", т.е. 256 минусуем то что нужно и остается столько, сколько нужно записать в TCNT0.
Частота таймера: Частота МК делим на прескалер и делим на (256 минус значение TCNT0)

Re: RC-5 без использования внешнего прерывания (?)

Пн авг 06, 2012 16:08:57

Ловлю не при переполнении таймера, а по внешнему прерываиню, срабатывающему от ИК-датчика.
Там по коду даже мне понятно как устроено, только вот не работает ни черта :)

Re: RC-5 без использования внешнего прерывания (?)

Пн авг 06, 2012 16:37:48

Какая частота МК и что за МК? А то вот эти две вещи как-то несовместимы:
....
if (evt_cnt == 0) TCCR0=4; //Если первое событие включаем счетчик, 15.625КГц
....
TCCR2=0b00000100; //250 kHz
....

ATmega16
прескалер для таймера0, таймера1:
001=1:1, 010=1:8, 011=1:64, 100=1:256, 101=1:1024

прескалер для таймера2:
001=1:1, 010=1:8, 011=1:32, 100=1:64, 101=1:128, 110=1:256, 111=1:1024

Re: RC-5 без использования внешнего прерывания (?)

Пн авг 06, 2012 17:24:23

zero648 писал(а):Какая частота МК и что за МК? А то вот эти две вещи как-то несовместимы:
....
if (evt_cnt == 0) TCCR0=4; //Если первое событие включаем счетчик, 15.625КГц
....
TCCR2=0b00000100; //250 kHz
....

ATmega16
прескалер для таймера0, таймера1:
001=1:1, 010=1:8, 011=1:64, 100=1:256, 101=1:1024

прескалер для таймера2:
001=1:1, 010=1:8, 011=1:32, 100=1:64, 101=1:128, 110=1:256, 111=1:1024



Как не совместимы? Прискалер для таймера0 и таймера2 как бы...

МК у меня 8535, частота 16мГц
Тема закрыта