/****************************************************************************/
/* Program systemu prototypowego SP-AVR */
/* Autor: */
/****************************************************************************/
#include
// Rejestry mikrokontrolera ATmega32
#include // Przerwania mikrokontrolera
#include // 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
#define TCYKL 25 // Czas cyklu obliczeń (25 x 4ms = 100ms)
volatile char cykl; // Odmierzanie czasu cyklu (pętli głównej)
char buf[64]; // Bufor komunikatów LCD
//---------------------- Początek deklaracji użytkownika --------------------------------
//------------------------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 domylna)
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; // wylij 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-----------------------------------------------
char kl,ld,x1,x2,x3,x4,tim, cs;
int stan_k=1;
int stan =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
UART_init(9600);
while(1)
{
cykl = TCYKL; // Deklarowany czas cyklu (TCYKL x 4ms)
KEY_read(); // Odczyt stanu klawiszy aK1..aK4
//-------------- Początek kodu użytkownika --------------------------------------
znak = COM_recv();
//kl = aK1;
if(znak)
switch (stan_k) {
case 1: if(znak==':') stan_k=2;
else stan_k=1;
break;
case 2: if(znak=='0' || znak=='1')
{
stan_k=3;
x1=znak-'0';
}
else if(znak=='#')
{
COM_send(':');
COM_send(ld+'0');
x2=3-ld;
COM_send(x2+'0');
COM_send('#');
stan_k=1;
}
else stan_k=1;
break;
case 3: if(znak=='2' || znak=='3')
{
stan_k=4;
x2=znak-'0';
}
case 4: if(znak=='#') if(x1+x2==3)
{
kl=x1;
COM_send(':');
COM_send(kl+'0');
COM_send(x2+'0');
COM_send('#');
stan_k=1;
}
break;
}
switch (stan) {
case 1: ld=0;
if(kl) {stan=2; tim=50;}
break;
case 2: ld=0;
if(!tim) {stan=4; }
else if (!kl){
stan = 3; tim=60;}
break;
case 3: ld=1;
if(!tim) stan=1;
else if(kl){ stan=2; tim=50;}
break;
case 4: ld=0;
if(!kl) stan =1;
break;
}
L1 = ld;
if(tim) --tim;
//-------------- 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
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
}
Wyszukiwarka
Podobne podstrony:
New Text Document
New Text Document (2)
New Text Document
New Text Document
New Text Document
New Text Document
New Text Document
New Text Document
New Text Document(1)
New Text Document
New Text Document (3)
New Text Document (3)
New Text Document (3)5 zbiornik2
New Text Document
więcej podobnych podstron