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.

Atmega 32 problem z przerwaniem timer0

lordadam 30 Maj 2009 21:22 2443 2
  • #1 30 Maj 2009 21:22
    lordadam
    Poziom 9  

    Witam ,napisałem sobie następujący program który ma pełnić funkcję prowizorycznego zegarka. W obsłudze przerwania timer inkrementuję sobie sekundy , ale gdy chce wyświetlić je w main ciągle wyświetla zero na led. Natomiast gdy ostatnią linijkę kodu zamieszczę w obsłudze przerwania działa ok . W związku z tym moje pytanie jak zrobić, żeby przekazywać sekunde do main . Zamieszczam ponizej kod:

    Code:
    #include <avr\io.h>
    
    #include <avr\interrupt.h>
    #include <avr\signal.h>
    #include <avr\delay.h>

    #define tau0 6;   //stała czasowa timera0


    //********************  zmienne globalne  *******************
    int licznik;   //Licznik rewersyjny, którego stan jest
       //wyświetlany na linijce LED-ów
    int sekunda=0;
    int dsekunda = 0;
    int minuta = 0;
    int dminuta = 0;
    int kolumna=1;

    int convertion(int dana)
    {
       int zwracana=0;
       switch(dana)
       {
          case 0:
             zwracana = 3;
          break;

          case 1:
             zwracana = 159;
          break;

          case 2:
             zwracana = 37;
          break;

          case 3:
             zwracana = 13;
          break;

          case 4:
             zwracana = 153;
          break;

          case 5:
             zwracana = 73;
          break;

          case 6:
             zwracana = 65;
          break;

          case 7:
             zwracana = 31;
          break;

          case 8:
             zwracana = 1;
          break;

          case 9:
             zwracana = 9;
          break;
       }
       return zwracana;
    }         

    int ktorakolumna(int k)
    {
       int zwrkolumna=0;
       switch(k)
       {
          case 1:
             zwrkolumna = 7;
          break;

          case 2:




             zwrkolumna = 11;
          break;

          case 3:
             zwrkolumna = 13;
          break;               

          case 4:
             zwrkolumna = 14;
          break;
       }
       return zwrkolumna;
    }


    SIGNAL (SIG_OVERFLOW0)   //obsługa przerwania
       //od przepełnienia timera0
    {
     TCNT0=tau0;           
           if(--licznik == 0)
          {
             PORTA^=0x01;
             licznik = 4000;
             sekunda ++;
             if (sekunda>=10)
             {
                sekunda = 0;
                dsekunda++;
                if(dsekunda>=7)
                {
                   dsekunda=0;
                   minuta++;
                   if(minuta>=10)
                   {
                      minuta=0;
                      dminuta++;
                      if(dminuta>=7)
                      {
                         dminuta++;
                      }
                   }
                }
             }


          }
    }



    int main(void)
    {
     licznik=4000;
     //sekunda=0;
     //kolumna=1;

     DDRA = 0xFF;
     DDRB = 0xFF;
     DDRD = 0xFF;
     TIMSK=1<<TOIE0;
     TCNT0=tau0;           
     TCCR0=1;           
       
     sei();               
     
     while(1)
     {
       PORTD = ktorakolumna(kolumna);
       kolumna++;
       _delay_us(100);
       if (kolumna==5)
       {
          kolumna =1;
       }

             PORTB = convertion(sekunda);
       
     }
    }



    Za odpowiedź z góry dziękuję.

    0 2
  • Pomocny post
    #2 30 Maj 2009 21:41
    dawid512
    Poziom 32  

    Wpisać magiczne "volatile"

    Code:
    volatile int sekunda=0; 

    0
  • #3 30 Maj 2009 21:48
    lordadam
    Poziom 9  

    Dzięki podziałało

    0