Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /****************************************************************************/
- /* Program systemu prototypowego SP-AVR */
- /* Autor: */
- /****************************************************************************/
- #include <avr/io.h> // Rejestry mikrokontrolera ATmega32
- #include <avr/interrupt.h> // Przerwania mikrokontrolera
- #include <stdio.h> // Standardowe I/O
- #include "key.h" // Obsługa przycisków (SW0...SW7)
- #include "led.h" // Obsługa diod LED (LD0...LD7)
- #include "lcd.h" // Obsługa wyświetlacza LCD 2x16 znaków
- #include "rslib.h" // Obsługa komunikacji z Symulatorem Obiektów
- #include "SchematA.h" // Oznaczenia obiektu A
- #define TCYKL 25 // Czas cyklu obliczeń (25 x 4ms = 100ms)
- volatile unsigned char cykl; // Odmierzanie czasu cyklu (pętli głównej)
- char buf[64]; // Bufor komunikatów LCD
- //---------------------- Początek deklaracji użytkownika --------------------------------
- char tim1, tim2, tim3, stan1=1, stan2=1, stan3=1;
- //---------------------- Koniec deklaracji użytkownika ----------------------------------
- int main(void)
- {
- DDRA = 0xff; // Kierunek portu A (diody LED): port wyjściowy
- DDRB = 0x00; // Kierunek portu B (klawisze) : port wejściowy
- PORTA = 0xff; // Port A (diody LED): ustaw "1" (wygaszone diody)
- PORTB = 0xff; // Port B (klawisze) : aktywne rezystory podciągające
- TCCR0 = _BV(WGM01)|_BV(CS02); // Timer/Counter 0: tryb CTC, dzielnik=256
- OCR0 = 124; // Limit zliczania T0: 0.125us x 256 x (124+1) = 4ms
- TIMSK = _BV(OCIE0); // Odblokowanie przewań T0 (Output Compare Match)
- sei(); // Globalne włączenie obsługi przerwań
- LCD_init(); // Inicjowanie wyświetlacza LCD
- SYM_init(19200,0,0); // Inicjowanie komunikacji z symulatorem
- while(1)
- {
- cykl = TCYKL; // Deklarowany czas cyklu (TCYKL x 4ms)
- KEY_read(); // Odczyt stanu klawiszy aK1..aK4
- //-------------- Początek kodu użytkownika --------------------------------------
- Z1=!X1;
- Z2=!X3;
- switch(stan1)
- {
- case 1: Z3=1;Z5=0;
- if(X7) {stan1=2; tim1=30;}
- break;
- case 2: Z3=1;Z5=0;
- if(X6) {stan1=4; tim1=30;}
- else if(!tim1) {stan1=3; tim1=20;}
- break;
- case 3: Z3=0; Z5=0;
- if(X6) {stan1=4; tim1=30;}
- break;
- case 4: Z3=1; Z5=0;
- if(X5) {stan1=5; tim1=150;}
- break;
- case 5: Z3=0; Z5=0;
- if(!tim1 && X5) {stan1=6; tim1=150;}
- break;
- case 6: Z3=0; Z5=1;
- if(!tim1 && X7) stan1=7;
- break;
- case 7: Z3=0; Z5=1;
- if(!X7) stan1=1;
- break;
- }
- switch(stan2)
- {
- case 1: Z4=1;G=0;
- if(X7) {stan1=2; tim2=40;}
- break;
- case 2: Z4=1;G=0;
- if(X6) {stan2=4; tim2=20;}
- else if(!tim2) {stan2=3; tim2=20;}
- break;
- case 3: Z4=0;G=0;
- if(X6) {stan2=4; tim2=20;}
- break;
- case 4: Z4=1;G=0;
- if(X5) {stan1=6; tim2=150;}
- else if(!tim2) {stan2=5; tim2=20;}
- break;
- case 5: Z4=0;G=0;
- if(!tim2) {stan2=4; tim2=20;}
- else if(X5) {stan2=6; tim2=150;}
- break;
- case 6: Z4=0;G=1;
- if(!tim2) stan2=7;
- else if(!tim2 && T) stan2=8;
- break;
- case 7: Z4=0;G=0;
- if(!X7) stan2=1;
- else if(!tim2 && X7)stan2=9;
- break;
- case 8: Z4=0;G=1;
- if(T) {stan2=7; tim2=150;}
- break;
- case 9: Z4=0;G=0;
- if(!X7) stan2=1;
- break;
- }
- switch(stan3)
- {
- case 1: Z5=0; M=0;
- if(!G) {stan3=2; tim3=30;}
- break;
- case 2: Z5=1; M=1;
- if(!tim3) {stan3=3; tim3=20;}
- break;
- case 3: Z5=1; M=0;
- if(!X7) stan3=1;
- break;
- }
- if(tim1) --tim1;
- if(tim2) --tim2;
- if(tim3) --tim3;
- //-------------- Wyświetlacz LCD --------------
- sprintf(buf,"K1=%dK2=%dK3=%dK4=%d",(int)aK1,(int)aK2,(int)aK3,(int)aK4);
- LCD_xy(0,0); // Ustawienie kursora w linii 1
- LCD_puts(buf); // Wyświetlenie zawartości bufora
- sprintf(buf,"L1=%dL2=%dL3=%dL4=%d",(int)L1,(int)L2,(int)L3,(int)L4);
- LCD_xy(0,1); // Ustawienie kursora w linii 2
- LCD_puts(buf); // Wyświetlenie zawartości bufora
- //-------------- Koniec kodu użytkownika ----------------------------------------
- LED_set(); // Ustawienie diod LED
- //KEY_mem(); // Zapamiętanie stanu klawiszy w pK1..pK4
- SYM_send(); // Prześlij stan wyjść do obiektu
- SYM_read(); // Odczytaj stan wejść z obiektu
- //if(!cykl) L4=!L4; // Sygnalizacja przekroczenia czasu cyklu
- while(cykl); // Oczekiwanie na koniec cyklu oblicz.
- }
- return 0;
- }
- //---------------------- Funkcje obsługi przerwań ---------------------------------------
- ISR(TIMER0_COMP_vect) // Przerwanie od Timer/Counter 0 (co 4ms)
- {
- if(cykl) --cykl; // Odmierzanie czasu cyklu pętli głównej
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement