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)
- //------------------------Deklaracje u¬ytkownika--------------------------------------------------
- volatile char c_in; // odebrany znak (przez port szeregowy - przerwanie)
- char znak; // zmienna w main()
- /*char UART_init(long baud) // inicjowanie portu szeregowego
- {
- char speed, err=0;
- speed = baud / 4800;
- switch(speed)
- {
- case 1:
- UBRRL = 103; // 4800 (fosc=8MHz => UBRRL=103)
- UBRRH = 0;
- break;
- case 2:
- UBRRL = 51; // 9600 (fosc=8MHz => UBRRL=51)
- UBRRH = 0;
- break;
- case 4:
- UBRRL = 25; // 19200 (fosc=8MHz => UBRRL=25)
- UBRRH = 0;
- break;
- case 8:
- UBRRL = 12; // 38400 (fosc=8MHz => UBRRL=12)
- UBRRH = 0;
- break;
- default:
- UBRRL = 25; // 19200 (fosc=8MHz => UBRRL=25)
- UBRRH = 0;
- err = 1; // nietypowa predkoťŠ (ustawiona domyťlna)
- break;
- }
- UCSRB =_BV(RXCIE)|_BV(RXEN)|_BV(TXEN); // w-. przerwania od odb., w-. odb. i nadajnika
- UCSRC =_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0); // transmisja asynchroniczna, 8N1
- sei(); // globalne odblokowanie przerwa˝
- return err;
- }
- */
- void COM_send(char c_out) // wys-anie jednego znaku do portu COM
- {
- loop_until_bit_is_set(UCSRA, UDRE); // oczekiwanie na wys-anie poprzedniego znaku
- UDR = c_out; // wyťlij nowy znak
- }
- char COM_recv(void) // odbiˇr jednego znaku z portu COM
- {
- char c = c_in; // odczyt znaku - przerwanie ( 0 = brak znaku, NULL)
- c_in = 0; // zeruj flagŕ
- return c; // zwroŠ znak
- }
- void send_str(char * s) // wys-anie tekstu do portu COM
- {
- while (*s) COM_send(*s++); // wysy-aj kolejno znaki tekstu
- }
- /*
- ISR (SIG_USART_RECV) // przerwanie od odbiornika
- {
- c_in = UDR; // odbiˇr znaku do bufora
- }
- */
- //--------------------Koniec deklaracji u¬ytkownika-----------------------------------------------
- volatile unsigned char cykl; // Odmierzanie czasu cyklu (pętli głównej)
- char buf[64]; // Bufor komunikatów LCD
- //---------------------- Początek deklaracji użytkownika --------------------------------
- char tim, KL1, KL2, T1, T2, T3, stan=1;
- char stank=1, a,b,c,d,LD, T3h, T3l,CS;
- //---------------------- 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
- UART_init(9600);
- 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 -------------------------------------
- switch(stan)
- {
- case 1: LD=0;
- if(KL1 || KL2) { tim = T3; stan=2;} break;
- case 2: LD=0;
- if(KL2&&KL1) { tim = T1; stan=3; }
- else if(!tim&&(KL1||KL2)) stan=5; break;
- case 3: LD=1;
- if(!tim||!KL1||!KL2) stan=4; break;
- case 4: LD=0;
- if(!KL1&&!KL2) stan=1; break;
- case 5: LD=0;
- if(KL1&&KL2) { tim=T2; stan=6; } break;
- case 6: LD=1;
- if(!tim&&(KL1||KL2)) stan=4;
- else if(!tim&&(!KL1&&!KL2)) stan=1; break;
- }
- if(tim)--tim;
- znak=COM_recv()&0x7F;
- if(znak!=0)
- switch(stank)
- {
- case 1: if(znak==':') stank=2; else stank=1;
- case 2: if(znak>='0'&&znak<='9') { a=znak-'0'; stank=3;}
- else if(znak=='#') {
- COM_SEND(LD);
- T3l=T3%10;
- T3h=(T3-T3l)/10;
- COM_SEND(T3h);
- COM_SEND(T3l);
- CS=(LD+T3)%5;
- COM_SEND(CS);
- }
- else stank=1; break;
- case 3: if(znak>='0'&&znak<='9') {b=znak-'0'; stank=4;}
- else stank=1; break;
- case 4: if(znak=='1'||znak=='0') {c=znak-'0'; stank=5;}
- else if(znak=='A'||znak=='B') {c=znak-'0'; stank=7;}
- else stank=1; break;
- case 5: if(znak=='1'||znak=='0') {d=znak-'0'; stank=6;}
- else stank=1; break;
- case 6: if(znak=='#') {
- KL1=a; KL2=b; pK1=c; pK2=d; }
- else stank=1; break;
- case 7: if(znak>='0'&&znak<='4') { d=znak-'0'; stank=8;}
- else stank=1; break;
- case 8: if(znak=='#')
- if(a>=1&&b>=1&&((a+b+d)%5==0)&&c=='A'){
- T1=a;T2=b; stank=1;}
- else if(a>=1&&b>=1&&((a+b+d)%5==0)&&c=='B'){
- T3h=a; T3l=b; T3=(T3h*10)+T3l; stank=1;}
- else stank=1; break;
- }
- L1=LD;
- //-------------- Wyświetlacz LCD --------------
- sprintf(buf,"stank=%d ",(int)stank);
- LCD_xy(0,0); // Ustawienie kursora w linii 1
- LCD_puts(buf); // Wyświetlenie zawartości bufora
- sprintf(buf,"L1=%d ",(int)L1);
- 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