Problem jest następujący. Dziś zacząłem się uczyć obsługiwać wyświetlacze LED. Przeczytałem tutorial na wkrętaku, zaimplementowałem u mnie i jak zwykle coś nie tak...
Specjalnie spowolniłem wszystko, żeby widzieć co się dzieje. Wyświetlacze zapalają się po koleji, ale zawsze wyświetlają wartość 0.
Zauważyłem, że jeśli przeniosę kod
przed pętle while to wyświetli wartość 124. Jak jest on w środku to tylko 000.
#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
#include <wyswietlacze.h>
#include <avr/interrupt.h>
unsigned char jednosci;
unsigned char dziesiatki;
unsigned char setki;
unsigned char aktywna_cyfra=0; // zmienna pokazuje który wyswietlacz jest aktywny
ISR(TIMER1_COMPA_vect)
{
switch (aktywna_cyfra)
{
case 0:
PORTB |= (1 << 0); //ustawia bit 0 portu B - włącza wyświetlacz nr 0
PORTB &= ~(1 << 1); //zeruje bit 1 portu B - wyłącza wyświetlacz nr 1
PORTB &= ~(1 << 2); //zeruje bit 2 portu B - wyłącza wyświetlacz nr 2
PORTD = cyfra(setki);
aktywna_cyfra++;
break;
case 1:
PORTB &= ~(1 << 0); //zeruje bit 0 portu B - wyłącza wyświetlacz nr 0
PORTB |= (1 << 1); //ustawia bit 1 portu B - włącza wyświetlacz nr 1
PORTB &= ~(1 << 2); //zeruje bit 2 portu B - wyłącza wyświetlacz nr 2
PORTD = cyfra(dziesiatki);
aktywna_cyfra++;
break;
case 2:
PORTB &= ~(1 << 0); //zeruje bit 0 portu B - wyłącza wyświetlacz nr 0
PORTB &= ~(1 << 1); //zeruje bit 1 portu B - wyłącza wyświetlacz nr 1
PORTB |= (1 << 2); //ustawia bit 2 portu B - włącza wyświetlacz nr 2
PORTD = cyfra(jednosci);
aktywna_cyfra=0;
break;
}
}
// ----- funkcja główna ------------------------------------------------------------
int main(void)
{
// Wszystkie linie portu D będą wyjściami dla segmentów wyświetlacza
DDRD = 0xff;
DDRB = 0x07; // 3 pierwsze bity to wyjścia dla kluczy wyświetlaczy, PB3 to wejście dla switcha programowania
PORTB = 0x08;
unsigned int wartosc=124; // wyswietlana wartosc
TCCR1B |= (1 << WGM12); // Ustawia timer1 w tryb CTC
OCR1A = 5208; // Ustawia wartość pożądaną na 3Hz dla preskalera 64
TCCR1B |= ((1 << CS10) | (1 << CS11)); // Ustawia timer z preskalerem Fcpu/64
TIMSK |= (1 << OCIE1A); // Zezwolenie na przerwania dla CTC
sei(); // Zezwolenie globalne na przerwania
//----------------------------------------------------------------------------
while(1)
{
setki=wartosc/100;
dziesiatki = (wartosc/10) % 10;
jednosci = wartosc % 10;
if (wartosc == 999) {wartosc = 0;} else {wartosc++;}
_delay_ms(500);
}
}Specjalnie spowolniłem wszystko, żeby widzieć co się dzieje. Wyświetlacze zapalają się po koleji, ale zawsze wyświetlają wartość 0.
Zauważyłem, że jeśli przeniosę kod
setki=wartosc/100;
dziesiatki = (wartosc/10) % 10;
jednosci = wartosc % 10;przed pętle while to wyświetli wartość 124. Jak jest on w środku to tylko 000.
