To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
-
Laik
- Użytkownik
- Posty: 242
- Rejestracja: 21 maja 2007, 19:19
- Lokalizacja: z nienacka
Post
autor: Laik » 16 gru 2008, 13:23
Uczę się właśnie na Proteusie programowania AVRów. Potrzebne mi to będzie do zaliczenie pracy semestralnej. I mam takie pytanie. Steruje wyświetlaczem 2x 7seg. Pokazuje liczby na dwóch segmentach tylko jest problem. Jak doczytałem trzeba zrobić tak aby w bardzo krótkim czasie podać na 1 wyświetlacz liczbę potem na 2 tak aby nie było widać migotania. I własnie tu mam stop ponieważ nie wiem jak to wykonać. Czytałem że trzeba to zrobić w przerwaniach lecz nie moge za nic pojąć jak to działa. Może mi ktoś podpowie? To narazie moj kodzik :
Kod: Zaznacz cały
// Wietlacz ze wspólną katodą
#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
// Zdefiniowanie znaków i wyświetlaczy w tabilcach
int cyf[9];
cyf[0] = 0x3F;
cyf[1] = 0x06;
cyf[2] = 0x5B;
cyf[3] = 0x4F;
cyf[4] = 0x66;
cyf[5] = 0x6D;
cyf[6] = 0x7D;
cyf[7] = 0x07;
cyf[8] = 0x7F;
cyf[9] = 0x6F;
int c = 0;
int wys[1];
wys[0] = 0x27;
wys[1] = 0x17;
int w = 0;
// Koniec definiowania znaków
DDRD = 0xFF; // Stan wyskoki dla wyswoetlacza
DDRC = 0x30; // Stan niski dla wyswietlacza
while(1)
{
PORTC = wys[w]; // Stan niski na wys, wysoki na przycisk
if(c > 9){
}
PORTD = cyf[c];
_delay_ms(1000);
c++;
}
}
-
c4r0
- Moderator
- Posty: 2150
- Rejestracja: 13 kwie 2004, 19:56
- Lokalizacja: z lasu
-
Kontakt:
Post
autor: c4r0 » 16 gru 2008, 13:46
Jeśli program będzie się zajmował głównie wyświetlaniem, a nie czymś innym, to w sumie nie trzeba robić tego w przerwaniu. A z tym przerwaniem ty wydaje mi się że chodzi o wykorzystanie przerwania generowanego przez przepełnienie timera pracującego jako licznik impulsów zegarowych.
-
snow
- Użytkownik
- Posty: 794
- Rejestracja: 16 sty 2007, 3:44
- Lokalizacja: lubelskie
-
Kontakt:
Post
autor: snow » 16 gru 2008, 13:49
Musisz to zrobić w przerwaniu od Timera (np. ISR (SIG_OVERFLOW0) ), czyli jak się timer przepełnia to wykonuje:
1. Wybranie pierwszego wyświetlacza
2. Wyświetlenie cyfry PORTC=cyf[dziesiatki];
3. Wybranie drugiego wyświetlacza
4. Wyświetlenie cyfry PORTC=cyf[jednostki];
i tak w kółko
Musisz mieć swoją liczbę rozbitą na dziesiątki i jedności jeżeli masz dwa wyświetlacze. Na jednym wyświetlasz cyfrę dziesiątek a na drugim jedności.
Odpowiednio ustawiając Timer musisz sobie dostosować częstotliwość tak aby nie migały wyświetlacze 50-100Hz wystarczy.
-
Laik
- Użytkownik
- Posty: 242
- Rejestracja: 21 maja 2007, 19:19
- Lokalizacja: z nienacka
Post
autor: Laik » 16 gru 2008, 13:51
To na razie do nauki. Program ten będzie miał zaprogramowane kilka operacji i wyświetlaczem będę wybierał która operacje ma wykonywać. Możesz coś więcej powiedzieć jak to wykonać na tym timerze i przerwaniu ?
[ Dodano: 2008-12-21, 21:54 ]
Snow mógłbyś pokazać jak w ogóle ustawić ten timer i te przerwanie na jakimś prostym programiku ?