Witam.
Problemem jest nie działająca instrukcja volaitile. Dopiero zaczynam programowanie w C jednak zanim rozpocząłem pisać nowy temat to przeszukałem zasoby neta - z marnym skutkiem i dlatego pytam bardziej doświadczonych kolegów.
Program jest prostym zegarem na AT90S2313 i wykorzystuje T0 do multipleksowania wyświetlaczy 7 -segmentowych(są 4 sztuki
a T1 odlicza 1s. Do sprawdzania poprawności wyświetlanych cyfr stosuje instrukcje w pętli while(1) (w obecnej formie program kompiluje bez błędów,ostrzeżeń lecz nie działa na układzie). Przesunięcie tych instrukcji do obsługi przerwania ISR(TIMER1_OVF1_vect) powoduje, że układ pracuje poprawnie. Przypuszczam iż powodem jest zmienna volatile unsigned char sekundy.
Oto listing:
Problemem jest nie działająca instrukcja volaitile. Dopiero zaczynam programowanie w C jednak zanim rozpocząłem pisać nowy temat to przeszukałem zasoby neta - z marnym skutkiem i dlatego pytam bardziej doświadczonych kolegów.
Program jest prostym zegarem na AT90S2313 i wykorzystuje T0 do multipleksowania wyświetlaczy 7 -segmentowych(są 4 sztuki
Oto listing:
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned char display,liczba1,liczba2,liczba3,liczba4; //deklaracja zmiennych-godzina,nr wyswietlacza
unsigned char liczba[10] = {192,249,164,176,153,146,130,248,128,144}; //deklaracja cyfr arabskich na 7seg
volatile unsigned char sekundy;
ISR(TIMER0_OVF0_vect )
{
TCNT0 = 178;
PORTD |= (1<<3)|(1<<4)|(1<<5)|(1<<6);
switch(display) //włączanie wyświetlaczy
{
case 0:
PORTB = liczba[liczba1];
PORTD &= ~(1<<3);
break;
case 1:
PORTB = liczba[liczba2];
PORTD &= ~(1<<4);
break;
case 2:
PORTB = liczba[liczba3];
PORTD &= ~(1<<5);
break;
case 3:
PORTB = liczba[liczba4];
PORTD &= ~(1<<6);
break;
}
display += 1;
if (display == 4) display = 0;
}
ISR(TIMER1_OVF1_vect)
{
TCNT1 = 3026;
sekundy += 1;
}
int main(void)
{
DDRB = 0xff;
PORTB = 0xff;
DDRD |= (1<<3)|(1<<4)|(1<<5)|(1<<6);
PORTD |= (1<<3)|(1<<4)|(1<<5)|(1<<6);
sekundy = 0;
display = 0;
liczba1 = 0; //minuty
liczba2 = 0;
liczba3 = 0; //godziny
liczba4 = 0;
TCNT1 = 3026; //Wartość początkowa aby T1 odmierzył 1s
TCCR1B |= (1<<CS10)|(1<<CS11); //Ustawienie T1 na sygnał fck = 4MHz/64
TIMSK |= (1<<TOIE1); //Odblokowanie przerwania od T1
TCNT0 = 178; //Wartość początkowa aby T0 odmierzył 5ms
TCCR0 |= (1<<CS12); //Ustawienie T0 na sygnał fck = 4MHz/256
TIMSK |= (1<<TOIE0); //Odblokowanie przerwania od T0
sei();
while(1)
{
if (sekundy >= 60)
{
sekundy = 0;
liczba1 += 1;
}
if (liczba1 == 10)
{
liczba1 = 0;
liczba2 += 1;
if (liczba2 == 6)
{
liczba2 = 0;
liczba3 += 1;
}
}
if (liczba3 == 10)
{
liczba3 = 0;
liczba4 += 1;
if (liczba4 == 2)
{
if (liczba3 == 4)
{
liczba3 = 0;
liczba4 = 0;
}
}
}
}
}