Advertisement
Guest User

Untitled

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