Advertisement
pabloducato

SW

Apr 8th, 2019
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.86 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. #include "rslib.h"                  // Obsługa komunikacji z Symulatorem Obiektów
  13.  
  14. #include "SchematA.h"               // Oznaczenia obiektu A
  15.  
  16. #define TCYKL   25                  // Czas cyklu obliczeń (25 x 4ms = 100ms)
  17.  
  18. volatile unsigned char cykl;        // Odmierzanie czasu cyklu (pętli głównej)
  19. char buf[64];                       // Bufor komunikatów LCD
  20. //---------------------- Początek deklaracji użytkownika --------------------------------
  21.  
  22. char tim1, tim2, tim3, stan1=1, stan2=1, stan3=1;
  23.  
  24.  
  25. //---------------------- Koniec deklaracji użytkownika ----------------------------------
  26. int main(void)
  27. {
  28.     DDRA  = 0xff;                   // Kierunek portu A (diody LED): port wyjściowy
  29.     DDRB  = 0x00;                   // Kierunek portu B (klawisze) : port wejściowy
  30.     PORTA = 0xff;                   // Port A (diody LED): ustaw "1" (wygaszone diody)
  31.     PORTB = 0xff;                   // Port B (klawisze) : aktywne rezystory podciągające
  32.    
  33.     TCCR0 = _BV(WGM01)|_BV(CS02);   // Timer/Counter 0: tryb CTC, dzielnik=256
  34.     OCR0  = 124;                    // Limit zliczania T0: 0.125us x 256 x (124+1) = 4ms
  35.     TIMSK = _BV(OCIE0);             // Odblokowanie przewań T0 (Output Compare Match)
  36.     sei();                          // Globalne włączenie obsługi przerwań
  37.  
  38.     LCD_init();                     // Inicjowanie wyświetlacza LCD
  39.     SYM_init(19200,0,0);            // Inicjowanie komunikacji z symulatorem
  40.    
  41.     while(1)
  42.     {
  43.         cykl = TCYKL;               // Deklarowany czas cyklu (TCYKL x 4ms)
  44.         KEY_read();                 // Odczyt stanu klawiszy aK1..aK4
  45.         //-------------- Początek kodu użytkownika --------------------------------------
  46.        
  47.         Z1=!X1;
  48.         Z2=!X3;
  49.        
  50.         switch(stan1)
  51.         {
  52.         case 1: Z3=1;Z5=0;
  53.         if(X7) {stan1=2; tim1=30;}
  54.         break;
  55.        
  56.         case 2: Z3=1;Z5=0;
  57.         if(X6) {stan1=4; tim1=30;}
  58.         else if(!tim1) {stan1=3; tim1=20;}
  59.         break;
  60.        
  61.         case 3: Z3=0; Z5=0;
  62.         if(X6) {stan1=4; tim1=30;}
  63.         break;
  64.        
  65.         case 4: Z3=1; Z5=0;
  66.         if(X5) {stan1=5; tim1=150;}
  67.         break;
  68.        
  69.         case 5: Z3=0; Z5=0;
  70.         if(!tim1 && X5) {stan1=6; tim1=150;}
  71.         break;
  72.        
  73.         case 6: Z3=0; Z5=1;
  74.         if(!tim1 && X7) stan1=7;
  75.         break;
  76.        
  77.         case 7: Z3=0; Z5=1;
  78.         if(!X7) stan1=1;
  79.         break;
  80.         }
  81.        
  82.         switch(stan2)
  83.         {
  84.         case 1: Z4=1;G=0;
  85.         if(X7) {stan1=2; tim2=40;}
  86.         break;
  87.        
  88.         case 2: Z4=1;G=0;
  89.         if(X6) {stan2=4; tim2=20;}
  90.         else if(!tim2) {stan2=3; tim2=20;}
  91.         break;
  92.        
  93.         case 3: Z4=0;G=0;
  94.         if(X6) {stan2=4; tim2=20;}
  95.         break;
  96.        
  97.         case 4: Z4=1;G=0;
  98.         if(X5) {stan1=6; tim2=150;}
  99.         else if(!tim2) {stan2=5; tim2=20;}
  100.         break;
  101.        
  102.         case 5: Z4=0;G=0;
  103.         if(!tim2) {stan2=4; tim2=20;}
  104.         else if(X5) {stan2=6; tim2=150;}
  105.         break;
  106.        
  107.         case 6: Z4=0;G=1;
  108.         if(!tim2) stan2=7;
  109.         else if(!tim2 && T) stan2=8;
  110.         break;
  111.        
  112.         case 7: Z4=0;G=0;
  113.         if(!X7) stan2=1;
  114.         else if(!tim2 && X7)stan2=9;
  115.         break;
  116.        
  117.         case 8: Z4=0;G=1;
  118.         if(T) {stan2=7; tim2=150;}
  119.         break;
  120.        
  121.         case 9: Z4=0;G=0;
  122.         if(!X7) stan2=1;
  123.         break;
  124.         }
  125.        
  126.         switch(stan3)
  127.         {
  128.         case 1: Z5=0; M=0;
  129.         if(!G) {stan3=2; tim3=30;}
  130.         break;
  131.         case 2: Z5=1; M=1;
  132.         if(!tim3) {stan3=3; tim3=20;}
  133.         break;
  134.         case 3: Z5=1; M=0;
  135.         if(!X7) stan3=1;
  136.         break;
  137.         }
  138.        
  139.         if(tim1) --tim1;
  140.         if(tim2) --tim2;
  141.         if(tim3) --tim3;
  142.        
  143.         //-------------- Wyświetlacz LCD --------------
  144.         sprintf(buf,"K1=%dK2=%dK3=%dK4=%d",(int)aK1,(int)aK2,(int)aK3,(int)aK4);
  145.         LCD_xy(0,0);                // Ustawienie kursora w linii 1
  146.         LCD_puts(buf);              // Wyświetlenie zawartości bufora
  147.         sprintf(buf,"L1=%dL2=%dL3=%dL4=%d",(int)L1,(int)L2,(int)L3,(int)L4);
  148.         LCD_xy(0,1);                // Ustawienie kursora w linii 2
  149.         LCD_puts(buf);              // Wyświetlenie zawartości bufora
  150.        
  151.         //-------------- Koniec kodu użytkownika ----------------------------------------
  152.         LED_set();                  // Ustawienie diod LED
  153.         //KEY_mem();                // Zapamiętanie stanu klawiszy w pK1..pK4
  154.         SYM_send();                 // Prześlij stan wyjść do obiektu
  155.         SYM_read();                 // Odczytaj stan wejść z obiektu
  156.        
  157.         //if(!cykl) L4=!L4;         // Sygnalizacja przekroczenia czasu cyklu
  158.         while(cykl);                // Oczekiwanie na koniec cyklu oblicz.
  159.     }
  160.     return 0;
  161. }
  162.  
  163. //---------------------- Funkcje obsługi przerwań ---------------------------------------
  164.  
  165. ISR(TIMER0_COMP_vect)               // Przerwanie od Timer/Counter 0 (co 4ms)
  166. {
  167.     if(cykl) --cykl;                // Odmierzanie czasu cyklu pętli głównej
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement