Advertisement
milanmetal

Sa vezbi / 1000 prekida u sekundi

Jan 13th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.26 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. const unsigned char simboli[] = {
  4.         0x0c, 0xa4, 0x27, 0xc4
  5. }; //look-up tabela sa simbolima
  6.  
  7. unsigned char DISP_BAFER[4] = {
  8.         0xfe, 0xfe, 0xfe, 0xfe
  9. }; //bafer displeja
  10. unsigned long millis = 0;
  11. unsigned char disp = 3;
  12.  
  13. ISR(TIMER0_COMPA_vect)
  14. {
  15.     //prekid tajmera 0 usled dostizanja vrednosti registra OCR0A
  16.     if (++disp > 3)
  17.     disp = 0;
  18.  
  19.     PORTB = ~(1 << (3-disp)); //ukljucenje tranzistora
  20.     PORTD = DISP_BAFER[disp]; //ispis na trenutno aktivan displej
  21.     millis++; //sistemsko vreme
  22. }
  23.  
  24. int main()
  25. {
  26.     unsigned long t0;
  27.     unsigned char i;
  28.  
  29.     //inicijalizacija portova:
  30.     DDRB = 0x0f; //PB3-PB0 -> izlazi
  31.     DDRD = 0xff; //port D -> izlaz
  32.  
  33.     //inicijalizacija tajmera 0:
  34.     TCCR0A = 0x02; //tajmer 0: CTC mod
  35.     TCCR0B = 0x03; //tajmer 0: fclk = fosc/64
  36.     OCR0A = 249; //perioda tajmera 0: 250 Tclk (OCR0A + 1 = 250)
  37.     TIMSK0 = 0x02; //dozvola prekida tajmera 0
  38.     //usled dostizanja vrednosti registra OCR0A
  39.     sei(); //I = 1 (dozvola prekida)
  40.  
  41.     while(1)
  42.     {
  43.         t0 = millis;
  44.         while ((millis - t0) < 500); //pauza 500ms
  45.  
  46.         for (i = 0; i < 4; i++)
  47.         DISP_BAFER[i] = simboli[i];
  48.  
  49.         t0 = millis;
  50.  
  51.         while ((millis - t0) < 500); //pauza 500ms
  52.  
  53.         for (i = 0; i < 4; i++)
  54.         DISP_BAFER[i] = 0xfe;
  55.     }
  56.     return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement