Advertisement
Guest User

WBUDOWANE

a guest
May 25th, 2015
272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.70 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. #include "rslib.h" // Obsługa komunikacji z Symulatorem Obiektów
  13.  
  14. #include "SchematA.h" // Oznaczenia obiektu A
  15.  
  16. #define TCYKL 25 // Czas cyklu obliczeń (25 x 4ms = 100ms)
  17.  
  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.  
  100.  
  101. volatile unsigned char cykl; // Odmierzanie czasu cyklu (pętli głównej)
  102. char buf[64]; // Bufor komunikatów LCD
  103. //---------------------- Początek deklaracji użytkownika --------------------------------
  104. char tim, KL1, KL2, T1, T2, T3, stan=1;
  105. char stank=1, a,b,c,d,LD, T3h, T3l,CS;
  106. //---------------------- Koniec deklaracji użytkownika ----------------------------------
  107. int main(void)
  108. {
  109. DDRA = 0xff; // Kierunek portu A (diody LED): port wyjściowy
  110. DDRB = 0x00; // Kierunek portu B (klawisze) : port wejściowy
  111. PORTA = 0xff; // Port A (diody LED): ustaw "1" (wygaszone diody)
  112. PORTB = 0xff; // Port B (klawisze) : aktywne rezystory podciągające
  113.  
  114. TCCR0 = _BV(WGM01)|_BV(CS02); // Timer/Counter 0: tryb CTC, dzielnik=256
  115. OCR0 = 124; // Limit zliczania T0: 0.125us x 256 x (124+1) = 4ms
  116. TIMSK = _BV(OCIE0); // Odblokowanie przewań T0 (Output Compare Match)
  117. sei(); // Globalne włączenie obsługi przerwań
  118.  
  119. LCD_init(); // Inicjowanie wyświetlacza LCD
  120. UART_init(9600);
  121. SYM_init(19200,0,0); // Inicjowanie komunikacji z symulatorem
  122.  
  123. while(1)
  124. {
  125. cykl = TCYKL; // Deklarowany czas cyklu (TCYKL x 4ms)
  126. KEY_read(); // Odczyt stanu klawiszy aK1..aK4
  127. //-------------- Początek kodu użytkownika -------------------------------------
  128.  
  129. switch(stan)
  130. {
  131. case 1: LD=0;
  132. if(KL1 || KL2) { tim = T3; stan=2;} break;
  133. case 2: LD=0;
  134. if(KL2&&KL1) { tim = T1; stan=3; }
  135. else if(!tim&&(KL1||KL2)) stan=5; break;
  136. case 3: LD=1;
  137. if(!tim||!KL1||!KL2) stan=4; break;
  138. case 4: LD=0;
  139. if(!KL1&&!KL2) stan=1; break;
  140. case 5: LD=0;
  141. if(KL1&&KL2) { tim=T2; stan=6; } break;
  142. case 6: LD=1;
  143. if(!tim&&(KL1||KL2)) stan=4;
  144. else if(!tim&&(!KL1&&!KL2)) stan=1; break;
  145. }
  146.  
  147. if(tim)--tim;
  148.  
  149. znak=COM_recv()&0x7F;
  150. if(znak!=0)
  151. switch(stank)
  152. {
  153. case 1: if(znak==':') stank=2; else stank=1;
  154. case 2: if(znak>='0'&&znak<='9') { a=znak-'0'; stank=3;}
  155. else if(znak=='#') {
  156. COM_SEND(LD);
  157. T3l=T3%10;
  158. T3h=(T3-T3l)/10;
  159. COM_SEND(T3h);
  160. COM_SEND(T3l);
  161. CS=(LD+T3)%5;
  162. COM_SEND(CS);
  163. }
  164. else stank=1; break;
  165. case 3: if(znak>='0'&&znak<='9') {b=znak-'0'; stank=4;}
  166. else stank=1; break;
  167. case 4: if(znak=='1'||znak=='0') {c=znak-'0'; stank=5;}
  168. else if(znak=='A'||znak=='B') {c=znak-'0'; stank=7;}
  169. else stank=1; break;
  170. case 5: if(znak=='1'||znak=='0') {d=znak-'0'; stank=6;}
  171. else stank=1; break;
  172. case 6: if(znak=='#') {
  173. KL1=a; KL2=b; pK1=c; pK2=d; }
  174. else stank=1; break;
  175. case 7: if(znak>='0'&&znak<='4') { d=znak-'0'; stank=8;}
  176. else stank=1; break;
  177. case 8: if(znak=='#')
  178. if(a>=1&&b>=1&&((a+b+d)%5==0)&&c=='A'){
  179. T1=a;T2=b; stank=1;}
  180. else if(a>=1&&b>=1&&((a+b+d)%5==0)&&c=='B'){
  181. T3h=a; T3l=b; T3=(T3h*10)+T3l; stank=1;}
  182. else stank=1; break;
  183. }
  184. L1=LD;
  185.  
  186.  
  187.  
  188.  
  189.  
  190. //-------------- Wyświetlacz LCD --------------
  191. sprintf(buf,"stank=%d ",(int)stank);
  192. LCD_xy(0,0); // Ustawienie kursora w linii 1
  193. LCD_puts(buf); // Wyświetlenie zawartości bufora
  194. sprintf(buf,"L1=%d ",(int)L1);
  195. LCD_xy(0,1); // Ustawienie kursora w linii 2
  196. LCD_puts(buf); // Wyświetlenie zawartości bufora
  197.  
  198. //-------------- Koniec kodu użytkownika ----------------------------------------
  199. LED_set(); // Ustawienie diod LED
  200. //KEY_mem(); // Zapamiętanie stanu klawiszy w pK1..pK4
  201. SYM_send(); // Prześlij stan wyjść do obiektu
  202. SYM_read(); // Odczytaj stan wejść z obiektu
  203.  
  204. //if(!cykl) L4=!L4; // Sygnalizacja przekroczenia czasu cyklu
  205. while(cykl); // Oczekiwanie na koniec cyklu oblicz.
  206. }
  207. return 0;
  208. }
  209.  
  210. //---------------------- Funkcje obsługi przerwań ---------------------------------------
  211.  
  212. ISR(TIMER0_COMP_vect) // Przerwanie od Timer/Counter 0 (co 4ms)
  213. {
  214. if(cykl) --cykl; // Odmierzanie czasu cyklu pętli głównej
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement