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