Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Przeniesienie kodu z Atmega8 na Attiny26, odbieranie komend w RC5

brzydal91 25 Maj 2012 02:19 719 0
  • #1 25 Maj 2012 02:19
    brzydal91
    Poziom 12  

    Witam wszystkich.
    Mam kod zaczerpnięty z którejś ze stron w internecie. Działał on w pełni na mikrokotrolerze Atmega8 z kwarcem 8Mhz. Mój projekt jednak potrzebuje mniejszego procka i próbuję ten sam program przenieść na Attiny26. Nie mogę zlokalizować ostatniej, tak mi się wydaje że ostatniej, z różnic w kodzie. Program ma za zadanie odebrać komendę w kodzie RC5 oraz w razie odczytu zmienić stan flagi co spowoduje zapalenie diody. Na razie program w wersji tylko do przetestowania transmisji. Niestety odbieram tylko kilka pierwszych bitów. Podejrzewam, że nie potrafię ustawić timera tak by ustawienie odpowiadało temu z Atmega8 czyli okres równy 32 mikrosekundy. Przerwanie INT0 działa.
    Oto kod:

    Code:

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>

    #define F_CPU 8000000ul

    extern int flaga = 0;

    //-----------------------------------------------------------------------------
    ISR(INT0_vect)
    {
       static unsigned char n, pb;
       static unsigned int code, out;
       switch(n)
       {
          case 0:
       
             if(MCUCR&(1<<ISC00))
             {
                MCUCR &= ~(1<<ISC00);
           TCNT0 = 0x00; TIFR |= (1<<TOV0);
             }
             else
             {
           if((TCNT0>112)||(TIFR&(1<<TOV0))) // 112 = 3,6ms
           {      
                   pb=0;      
              code = 0x03;
                   TCNT0  = 0x00; TIFR |= (1<<TOV0);
                   n = 1;
           }
                MCUCR |= (1<<ISC00);
        }
          break;

          case 1:
          case 2:   
             if((TCNT0>14)&&(TCNT0<42))  // 14 = 0.4ms, 42 = 1.35ms
        {
                MCUCR ^= (1<<ISC00);
                TCNT0  = 0x00; TIFR |= (1<<TOV0);
           n++;
        }
        else n = 0;

          break;





          default: 
             if((TCNT0>14)&&(TCNT0<42))
        {
                 if(!pb)
                 {           
               pb = 1;
                    code <<= 1;
          if(code&0x2) code |= 1;
                 }
            else
                 {
                    pb = 0;
          n++;
            }

            TCNT0 = 0x00; TIFR |= (1<<TOV0);
        }
        else if((TCNT0>42)&&(TCNT0<70)) // 70=2.25ms
        {
                 code <<= 1;
            if(!(code&0x2)) code |= 1;
          
            TCNT0 = 0x00; TIFR |= (1<<TOV0);
                 n++;
        }
             else  n = 0;      

             MCUCR ^= (1<<ISC00);

        if(n==15)
        {
            n = 0;

               out = (code & (1<<11)) >> 5;
               out |= code & 0x3f;
                      
            switch (out)
            {
              case 0x4c:
              {
                 flaga = 1;
                
                 break;
              }
              case 0x0c:
              {
                 flaga = 0;
                
                 break;
              }
              case 0x20:
              {
                
                  _delay_ms( 100 );   
                 break;
              }
              case 0x60:
              {
                
                  _delay_ms( 100 );   
                 break;
              }
              case 0x21:
              {
                
                  _delay_ms( 100 );   
                 break;
              }
              case 0x61:
              {
                
                  _delay_ms( 100 );   
                 break;
              }
           }
             
          
        }

          break;
       }
    }

    //-----------------------------------------------------------------------------

    int main(void)
    {
       DDRA = 0x08;
       //
           MCUCR |= (1<<ISC01); // opadajace zbocze
           GIMSK  |= (1<<INTF0);   
           //
       TCCR0 = (1<<CS02); // prescaler 256
           TIFR |= (1<<TOV0);
       sei();
       while(1)
       {
          if ( flaga == 1 )
             PORTA = 0x08;
          else
             PORTA = 0x00;
       }

        return 0;
    }


    Z góry dziękuję za pomoc

    0 0