Advertisement
mikolajmki

mikro_lab3

Nov 3rd, 2022
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.45 KB | None | 0 0
  1. #ifndef F_CPU
  2. #define F_CPU 1000UL
  3.  
  4. #include <avr/io.h>
  5. #include <avr/delay.h>
  6. #include <avr/interrupt.h>
  7.  
  8. void timer() {
  9.     TCCR0 = (1<<CS02) | (1<<CS00); /* Timer0, tryb normal mode, /1024 preskaler */
  10.     TCNT0 = 0x80;       /* Wczytaj TCNT0, policz do 1000ms */
  11.     while((TIFR&0x01)==0);  /* Zaczekaj TOV0 sie wyzeruje */
  12.     TCCR0 = 0;
  13.     TIFR = 0x1;         /* Ustaw flage TOV0 */
  14. }
  15.  
  16. void timer1(int n) //procedura sprawdzajaca
  17. //przepelnienie flagi i zerujaca zegar
  18. {
  19.     int i = 0;
  20.     while (1) {
  21.        
  22.         if (TIFR & (1<<TOV0)) {
  23.  
  24.             // przy teoretycznie 4MHz to daje okolo 1.4s           
  25.  
  26.             TCNT0 = 220; // ustawienie aktualnego stanu zliczonych impulsow 50ms
  27.             TIFR |= _BV(TOV0); // wyzerowanie bitu flagi przepelnienia
  28.             //PORTA ^= 1;
  29.             i ++;
  30.         }
  31.  
  32.         if (i == n) {
  33.             PORTA ^= 1;
  34.             break;
  35.         }
  36.     }
  37.  
  38. }
  39.  
  40. void set_timer_interrupt() {
  41.     DDRA = 0xFF;
  42.    
  43.     sei();
  44.     TIMSK = (1<<TOIE0); // aktywacja przerwan przepelnienia t0
  45.  
  46.     TCNT0 = 1;
  47.     TCCR0 = (1<<CS02) | (1<<CS00);
  48. }
  49.  
  50.  
  51. char check(char nr_row, char stable) {
  52.     char p = 0;
  53.         switch (stable) {
  54.         case 8:
  55.             p = nr_row * 4 + 1;
  56.             break;
  57.         case 4:
  58.             p = nr_row * 4 + 2;
  59.             break;
  60.         case 2:
  61.             p = nr_row * 4 + 3;
  62.             break;
  63.         case 1:
  64.             p = nr_row * 4 + 4;
  65.             break;
  66.     }
  67.     return p;
  68. }
  69.  
  70. ISR(TIMER0_OVF_vect) {
  71.    
  72.     char p = 0;
  73.     char stable = 0;
  74.     char state = 0;
  75.     char help_p = 0;
  76.  
  77.     while(1) {
  78.         for (int i = 7 ; i >= 4 ; i --) {
  79.             DDRB = (1 << i);    // ddr na kolejne wiersze
  80.             PORTB = ~DDRB;  // podciagniecie rezystorow w kolejnym wierszu (ustawienie 0 aby poplynal prad)
  81.             _delay_ms(5);   // delay po zmianie ddr
  82.             state = PINB;   // debounce
  83.             _delay_ms(5);   // delay w celu unikniecia drgan
  84.             stable = (~PINB) & (~state);    // przypisanie zer z pinb
  85.             stable &= 0b00001111;   // ignorowanie 4 najstarszych bitow
  86.             p = check(7 - i, stable);   // uzyskanie wartosci ktora zostanie wyswietlona
  87.             if(p) {
  88.                 help_p = p;
  89.                 break;
  90.             }
  91.         }
  92.         //if (TIFR & (1<<TOV0)) {
  93.             //TCNT0 = 1; // ustawienie aktualnego stanu zliczonych impulsow 50ms
  94.             //TIFR |= _BV(TOV0); // wyzerowanie bitu flagi przepelnienia
  95.             //  TCNT0 = 1; // ustawienie aktualnego stanu zliczonych impulsow 50ms
  96.             //PORTA ^= 1;
  97.             //break;
  98.         //}
  99.         if (help_p) timer1(help_p);
  100.        
  101.     }
  102.  
  103. }
  104.  
  105. int main() {
  106.     DDRA = 0xFF;
  107.     PORTA = 0x00;
  108.     TCCR0 = (1<<CS02) | (1<<CS00); /* Timer0, tryb normal mode, /1024 preskaler */
  109.     TCNT0 = 1;          /* Wczytaj TCNT0, policz do 50ms */
  110.  
  111.     set_timer_interrupt();
  112.  
  113.     while (1) {
  114.    
  115.     }
  116. }
  117.  
  118.  
  119. #endif
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement