Przerwania w C AVR

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!
ODPOWIEDZ
Laik
Użytkownik
Posty: 242
Rejestracja: 21 maja 2007, 19:19
Lokalizacja: z nienacka

Przerwania w C AVR

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++;
   
  }
}

Awatar użytkownika
c4r0
Moderator
Posty: 2152
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 ?

ODPOWIEDZ