[ATmega32][c/AVR] Odbiór Protokołu RC5

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
tomekg321
-
Posty: 1
Rejestracja: 30 lis 2009, 8:34
Lokalizacja: Białystok
Kontakt:

[ATmega32][c/AVR] Odbiór Protokołu RC5

Post autor: tomekg321 » 30 lis 2009, 8:42

Witam,

Wiem, że RC5 ten wątek był poruszany wiele razy na forum, ale chcę sie nauczyć programować w C, wiec chciałem wykorzystać odbiornik podczerwieni z mojego zestawu(ZL3AVR) i napisać protokół do RC5

Pracuje na kwarcu 16MHz i ATmega32. Odbiornik podczerwieni podłączyłem do PD3

Kod: Zaznacz cały

#include <avr/io.h>                // dostęp do rejestrów
#include <avr/interrupt.h>
#define F_CPU 16000000


volatile uint8_t RC5cmd;
volatile uint8_t RC5addr;
//volatile unsigned char T;
volatile unsigned char ready;
volatile unsigned long int tmp;

SIGNAL(INT1_vect)
{
   //unsigned int tmp = 0;
   uint16_t ilosc_bitow = 0;
   uint8_t liczba_zboczy = 0;
   unsigned char mem_bit;
   uint8_t i = 1; // Jezeli nie ma bledu i = 1, jezeli jest => i = 0;


   GICR &= ~_BV(INT1); //zamaskowanie przerwania INT1
   TCCR0 = (1<<WGM01); //tryb CTC
   TCCR0 = (1<<CS02); //preskaler 256
   TCNT0 = 0; OCR0 = 81;// T=1,296ms ==> f=771,605Hz

   tmp = 0;

   while(i)
   {
      mem_bit=(!(PIND & 0x08));
      liczba_zboczy = 0;
      
      TIFR |= (1<<OCF0); //kasowanie flagi przerwania przez wpisanie jedynki      

      while(!OCF0)
      {
         if(mem_bit != ((!(PIND & 0x08))))
         {
            liczba_zboczy++;
            mem_bit=(!(PIND & 0x08));

            if(liczba_zboczy>1) //wiecej niz jedno zbocze
            {
               //ERROR
               i=0;
               GICR |= (1<<INT1);  //odblokowanie przerwania INT1
               return;
            }
         }
      }
      
      tmp<<=1;// przesuniecie wszystkich bitow o jeden w lewo
      tmp |= mem_bit; //tmp |=(!(PIND & 0x08));
      TIFR |= (1<<OCF0); //kasowanie flagi przerwania przez wpisanie jedynki
      
      ilosc_bitow++;
   
      if(ilosc_bitow == 13)
      {
      
         RC5cmd = tmp&0x3f;
         RC5addr = (tmp>>6) & 0x1f;
         ready = 1;
         GICR |= (1<<INT1);  //odblokowanie przerwania INT1   
         //T = ;
         i=0;
         return;   
      }
      
   /*   while(mem_bit == ((!(PIND & 0x08)))
      {
         //trzeba odczekac 1/4T
         //na zbocze
         GICR |= (1<<INT1);  //odblokowanie przerwania INT1
         i=0;
         return;
      }
   */
      TCNT0 = 0; OCR0 = 81;// T=1,296ms ==> f=771,605Hz

   }
}

int main(void)
{
   DDRA = 0xff; //wyjscia dla diod
   DDRD = 0x00; //wejscia
    GICR |= (1<<INT1);  //odblokowanie przerwania INT1   
    MCUCR |= (1<<ISC11); // Zbocze opadajace na INT1 wywola przerwanie
   sei();


   while(1)
   {
   
      if(ready)
      {
         PORTA = RC5cmd;
      
         ready = 0;
         

      }
   }
} 
Proszę o sprawdzenie kodu, bo ciągle mam to samo (same jedynki) niezależnie od tego, który przycisk na pilocie wybiorę.

Sądzę, że problem jest podczas odczytu z PORTD (PD3)

Z góry dzięki za pomoc!!!

ODPOWIEDZ