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:
Za odpowiedź z góry dziękuję.
#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ę.