Witam
Próbuję zrealizować multipleksowanie wyświetlaczy 7-seg.(dwóch) na atmega8, piszę w C, korzystam z WinAVR, mam wyświetlacze ze wspólną anodą, wykorzystałem tranzystory PNP. Z częstotliwością zegara nic nie kombinowałem więc mega pracuje na 1MHz. Napisałem taki kod:
Po skompilowaniu i wgraniu programu świecą się całe dwa wyświetlacze. Wydaje mi się, że kod jest taki jaki powinien być, chyba, że się mylę.
Zaobserwowałem jeszcze coś takiego, że jak zamiast
dam
to wtedy niby działa, wyświetla się oczekiwana liczba 12 ale mruga i zmiana częstotliwości wyświetlania(na mniejszą czy większą) nic nie zmienia. No ale patrzę w datasheet to WGM12 jest w TCCR1B.
Połączenia układu są OK bo jak napiszę jakiś prosty program bez użycia przerwań/timerów to wyświetlacze dobrze działają.
Widzi ktoś jakiś błąd?
Z góry dzięki.
Pozdrawiam
Przeniosłem z Programowanie początkujący.
[Dr.Vee]
Próbuję zrealizować multipleksowanie wyświetlaczy 7-seg.(dwóch) na atmega8, piszę w C, korzystam z WinAVR, mam wyświetlacze ze wspólną anodą, wykorzystałem tranzystory PNP. Z częstotliwością zegara nic nie kombinowałem więc mega pracuje na 1MHz. Napisałem taki kod:
#include <avr/io.h>
#include <avr/interrupt.h>
/*
cyfry na wyświetlaczu
0 0b10000001 129
1 0b11010111 215
2 0b01001001 73
3 0b01000011 67
4 0b00010111 23
5 0b00100011 35
6 0b00100001 33
7 0b11000111 199
8 0b00000001 1
9 0b00000011 3
*/
unsigned int cyfra[10]={129,215,73,67,23,35,33,199,1,3};
unsigned int i,wysw;
int main(void)
{
DDRB=0b11111111; //port B wyjscia
DDRD=0b11111111; //port D wyjscia
TCCR1B=(1 << CS10); //ustaw timer1 z preskalerem 1
TCCR1B=(1 << WGM12); //ustaw timer1 w tryb CTC
OCR1A=10000; //do ilu liczy timer1;dla uzyskania 100Hz
SREG=(1 << 7); //zezwolenie na przerwania
TIMSK=(1 << OCIE1A); //zezwolenie na przerwania dla CTC
while(1){}
}
ISR(TIMER1_COMPA_vect)
{
if(wysw==1)
{
PORTB=0b11111110; //wł pierwszy wyświetlacz
PORTD=cyfra[1];
wysw++;
}
else
{
PORTB=0b11111101; //wł drugi wyświetlacz
PORTD=cyfra[2];
wysw=1;
}
}Po skompilowaniu i wgraniu programu świecą się całe dwa wyświetlacze. Wydaje mi się, że kod jest taki jaki powinien być, chyba, że się mylę.
Zaobserwowałem jeszcze coś takiego, że jak zamiast
TCCR1B=(1 << WGM12); //ustaw timer1 w tryb CTCdam
TCCR1A=(1 << WGM12); //ustaw timer1 w tryb CTCto wtedy niby działa, wyświetla się oczekiwana liczba 12 ale mruga i zmiana częstotliwości wyświetlania(na mniejszą czy większą) nic nie zmienia. No ale patrzę w datasheet to WGM12 jest w TCCR1B.
Połączenia układu są OK bo jak napiszę jakiś prosty program bez użycia przerwań/timerów to wyświetlacze dobrze działają.
Widzi ktoś jakiś błąd?
Z góry dzięki.
Pozdrawiam
Przeniosłem z Programowanie początkujący.
[Dr.Vee]