Advertisement
Guest User

Untitled

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