pabloducato

pabloducato

May 30th, 2019
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /****************************************************************************/
  2. /*                   Program systemu prototypowego SP-AVR                   */
  3. /* Autor:                                                                   */
  4. /****************************************************************************/
  5.  
  6. #include <avr/io.h>                 // Rejestry mikrokontrolera ATmega32
  7. #include <avr/interrupt.h>          // Przerwania mikrokontrolera
  8. #include <stdio.h>                  // Standardowe I/O
  9. #include "key.h"                    // Obsługa przycisków (SW0...SW7)
  10. #include "led.h"                    // Obsługa diod LED (LD0...LD7)
  11. #include "lcd.h"                    // Obsługa wyświetlacza LCD 2x16 znaków
  12.  
  13. #define TCYKL   25                  // Czas cyklu obliczeń (25 x 4ms = 100ms)
  14.  
  15. volatile char cykl;                 // Odmierzanie czasu cyklu (pętli głównej)
  16. char buf[64];                       // Bufor komunikatów LCD
  17. //---------------------- Początek deklaracji użytkownika --------------------------------
  18.  
  19. //------------------------Deklaracje użytkownika--------------------------------------------------
  20.  
  21. volatile char c_in;                     // odebrany znak (przez port szeregowy - przerwanie)
  22.  
  23. char znak;                              // zmienna w main()
  24.  
  25. char UART_init(long baud)               // inicjowanie portu szeregowego
  26. {  
  27.     char speed, err=0;
  28.  
  29.     speed = baud / 4800;
  30.     switch(speed)
  31.     {
  32.         case  1:
  33.             UBRRL = 103;                        // 4800   (fosc=8MHz => UBRRL=103)
  34.             UBRRH = 0;
  35.             break;
  36.         case  2:
  37.             UBRRL = 51;                         // 9600   (fosc=8MHz => UBRRL=51)
  38.             UBRRH = 0;
  39.             break;
  40.         case  4:
  41.             UBRRL = 25;                         // 19200  (fosc=8MHz => UBRRL=25)
  42.             UBRRH = 0;
  43.             break;
  44.         case  8:
  45.             UBRRL = 12;                         // 38400  (fosc=8MHz => UBRRL=12)
  46.             UBRRH = 0;
  47.             break;
  48.         default:
  49.             UBRRL = 25;                         // 19200   (fosc=8MHz => UBRRL=25)
  50.             UBRRH = 0;
  51.             err = 1;                            // nietypowa predkość (ustawiona domyślnie)
  52.             break;
  53.     }
  54.    
  55.     UCSRB =_BV(RXCIE)|_BV(RXEN)|_BV(TXEN);      // wł. przerwania od odb., wł. odbiornika i nadajnika
  56.    
  57.     UCSRC =_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);    // transmisja asynchroniczna, 8N1
  58.    
  59.     sei();                                      // globalne odblokowanie przerwań
  60.    
  61.     return err;
  62. }
  63.  
  64. void COM_send(char c_out)               // wysłanie jednego znaku do portu COM
  65. {
  66.     loop_until_bit_is_set(UCSRA, UDRE);         // oczekiwanie na wysłanie poprzedniego znaku
  67.     UDR = c_out;                                // wyślij nowy znak
  68. }
  69.  
  70. char COM_recv(void)                     // odbiór jednego znaku z portu COM
  71. {
  72.     char c = c_in;                              // odczyt znaku - przerwanie ( 0 = brak znaku, NULL)
  73.     c_in = 0;                                   // zeruj flagę
  74.     return c;                                   // zwroć znak
  75. }
  76.  
  77. void send_str(char * s)                         // wysłanie tekstu do portu COM
  78. {
  79.     while (*s) COM_send(*s++);                  // wysyłaj kolejno znaki tekstu
  80. }
  81.  
  82. ISR (SIG_USART_RECV)                            // przerwanie od odbiornika
  83. {
  84.     c_in = UDR;                                 // odbiór znaku do bufora
  85. }
  86.  
  87. //--------------------Koniec deklaracji użytkownika-----------------------------------------------
  88.  
  89.  
  90. char T1=30, T2=20, T3=50, a, b, c, d, znak, stan=1, KL, LD,  tim, cs;
  91. char stank=1;
  92.  
  93.  
  94.  
  95. //---------------------- Koniec deklaracji użytkownika ----------------------------------
  96. int main(void)
  97. {
  98.     DDRA  = 0xff;                   // Kierunek portu A (diody LED): port wyjściowy
  99.     DDRB  = 0x00;                   // Kierunek portu B (klawisze) : port wejściowy
  100.     PORTA = 0xff;                   // Port A (diody LED): ustaw "1" (wygaszone diody)
  101.     PORTB = 0xff;                   // Port B (klawisze) : aktywne rezystory podciągające
  102.    
  103.     TCCR0 = _BV(WGM01)|_BV(CS02);   // Timer/Counter 0: tryb CTC, dzielnik=256
  104.     OCR0  = 124;                    // Limit zliczania T0: 0.125us x 256 x (124+1) = 4ms
  105.     TIMSK = _BV(OCIE0);             // Odblokowanie przewań T0 (Output Compare Match)
  106.     sei();                          // Globalne włączenie obsługi przerwań
  107.  
  108.     LCD_init();                     // Inicjowanie wyświetlacza LCD
  109.    
  110.     UART_init(9600);
  111.    
  112.    
  113.    
  114.     while(1)
  115.     {
  116.         cykl = TCYKL;               // Deklarowany czas cyklu (TCYKL x 4ms)
  117.         KEY_read();                 // Odczyt stanu klawiszy aK1..aK4
  118.         //-------------- Początek kodu użytkownika --------------------------------------
  119.        
  120.         switch(stan)
  121.         {
  122.        
  123.         case 1: if(KL) { LD=1; stan=2; tim=T1;}
  124.                 else if(!KL) { LD=0; stan=1;}
  125.                 break;
  126.                
  127.         case 2: if(!tim) { LD=0; stan=3; tim=T2; }
  128.                 else if(!KL) { LD=0; stan=1;}
  129.                 break;
  130.                
  131.         case 3: if(!tim) { LD=1; tim=T3; stan=4; }
  132.                 else if(!tim && !KL) stan=1;
  133.                 break;
  134.                
  135.         case 4: if(!tim && KL) { LD=0; stan=5; }
  136.                 break;
  137.        
  138.         case 5: if(!KL) stan=1;
  139.                 break;
  140.         }
  141.        
  142.         //if(tim) --tim;
  143.        
  144.         znak = COM_recv()&0x7F;
  145.        
  146.         if(znak)
  147.        
  148.         switch(stank)
  149.         {
  150.         case 1: if(znak==':') stank=2;
  151.                 break;
  152.        
  153.         case 2: if(znak>='0' && znak<='8') {a=znak-'0'; stank=3;}
  154.                 else stank=1;
  155.                 break;
  156.        
  157.         case 3: if(znak>='0' && znak<='9') {b=znak-'0'; stank=4;}
  158.                 else stank=1;
  159.                 break;
  160.        
  161.         case 4: if(znak=='#'){
  162.                     if(a==0 && b==0)
  163.                     {
  164.                     COM_send(T1/10 + '0');
  165.                     COM_send(T2/10 + '0');
  166.                     COM_send(T3/100 + '0');
  167.                     COM_send((T3%100)/10 + '0');
  168.                     cs = (4-(T1/10 + T2/10 + T3/100 + ((T3%100)%10)%4)%4);
  169.                     COM_send(cs + '0');
  170.                     COM_send('#');
  171.                     stank=1;
  172.                     }
  173.                     else if(a<2 && b<2 && a==!b)
  174.                     KL=a*10+b;
  175.                     stank=1;
  176.                     }
  177.                     else stank=1;
  178.                     break;
  179.                    
  180.                    
  181.        
  182.         case 5: if(znak>='0' && znak <= '3') {stank=5; c=znak-'0';}
  183.                 else if(znak=='#')
  184.                     {
  185.                         if((a*10+b)> 5 && (a*10+b)< 23)
  186.                             T3=(a*10+b)*10;
  187.                             stank=1;
  188.                     }
  189.                 else stank=1;
  190.                 break;
  191.                
  192.        
  193.         case 6: if(znak>='0' && znak <='3') {d=znak-'0'; stank=7;}
  194.                 else stank=1;
  195.                 break;
  196.        
  197.         case 7: if(a>1 && b>1 && b<9 && ((a+b+c)%4 == 0))
  198.                 {
  199.                 T1=a*10;
  200.                 T2=b*10;
  201.                 stank=1;
  202.                 }
  203.                 else stank=1;
  204.         }
  205.        
  206.         L1=LD;
  207.         if(tim) --tim;
  208.        
  209.         //-------------- Wyświetlacz LCD --------------
  210.         sprintf(buf,"K1=%dK2=%dK3=%dK4=%d",(int)aK1,(int)aK2,(int)aK3,(int)aK4);
  211.         LCD_xy(0,0);                // Ustawienie kursora w linii 1
  212.         LCD_puts(buf);              // Wyświetlenie zawartości bufora
  213.         sprintf(buf,"L1=%dL2=%dL3=%dL4=%d",(int)L1,(int)L2,(int)L3,(int)L4);
  214.         LCD_xy(0,1);                // Ustawienie kursora w linii 2
  215.         LCD_puts(buf);              // Wyświetlenie zawartości bufora
  216.        
  217.         //-------------- Koniec kodu użytkownika ----------------------------------------
  218.         LED_set();                  // Ustawienie diod LED
  219.         //KEY_mem();                // Zapamiętanie stanu klawiszy w pK1..pK4
  220.        
  221.         while(cykl);                // Oczekiwanie na koniec cyklu oblicz.
  222.     }
  223.     return 0;
  224. }
  225.  
  226. //---------------------- Funkcje obsługi przerwań ---------------------------------------
  227.  
  228. ISR(TIMER0_COMP_vect)               // Przerwanie od Timer/Counter 0 (co 4ms)
  229. {
  230.     if(cykl) --cykl;                // Odmierzanie czasu cyklu pętli głównej
  231. }
Add Comment
Please, Sign In to add comment