Rev 193 Rev 195
1 // LCD Terminal pro menic pro solarni vozitko 1 // LCD Terminal pro menic pro solarni vozitko
2 // (c)miho 2005 2 // (c)miho 2005
3   3  
4 // Pouziva PIC16F84 (mozno i jakykoli jiny, nepouzivaji se zadne specialni funkce). 4 // Pouziva PIC16F84 (mozno i jakykoli jiny, nepouzivaji se zadne specialni funkce).
5 // Na vstupnim vyvodu RS_IN ocekava seriovou komunikaci rychlosti RS_BOUD. Pri detekci 5 // Na vstupnim vyvodu RS_IN ocekava seriovou komunikaci rychlosti RS_BOUD. Pri detekci
6 // start bitu pomoci preruseni dojde k programovemu prijmu znaku a jeho zarazeni do 6 // start bitu pomoci preruseni dojde k programovemu prijmu znaku a jeho zarazeni do
7 // fronty FIFO. Po navratu z preruseni dochazi k vypisu na pripojeny dvouradkovy 7 // fronty FIFO. Po navratu z preruseni dochazi k vypisu na pripojeny dvouradkovy
8 // LCD displej. Program zpracovava ridici kody dle knihovny LCD.C. Pri delsich vypisech 8 // LCD displej. Program zpracovava ridici kody dle knihovny LCD.C. Pri delsich vypisech
9 // musi vysilajici strana ponechat (obcas) nejaky cas na zpracovani (napriklad 20ms). 9 // musi vysilajici strana ponechat (obcas) nejaky cas na zpracovani (napriklad 20ms).
10   10  
11 #include <16F84.h> // define standardnich konstant procesoru 11 #include <16F84.h> // define standardnich konstant procesoru
12 #use delay(clock=4000000) // standardni krystal 12 #use delay(clock=4000000) // standardni krystal
13 #fuses HS, NOWDT, NOPUT, NOPROTECT 13 #fuses HS, NOWDT, NOPUT, NOPROTECT
14   14  
15   15  
16 // Parmetry komuniace 16 // Parmetry komuniace
17 // 17 //
18 #define INV // definuje polaritu 18 #define INV // definuje polaritu
19 #define RS_BOUD 9600 // komunikacni rychlost 19 #define RS_BOUD 9600 // komunikacni rychlost
20 #define RS_IN PIN_B0 // musi to byt vstup extrniho preruseni 20 #define RS_IN PIN_B0 // musi to byt vstup extrniho preruseni
21   21  
22   22  
23 // Pripojeni LCD displeje 23 // Pripojeni LCD displeje
24 // 24 //
25 #define LCD_RS PIN_A0 // rizeni registru LCD displeje 25 #define LCD_RS PIN_A0 // rizeni registru LCD displeje
26 #define LCD_E PIN_A1 // enable LCD displeje 26 #define LCD_E PIN_A1 // enable LCD displeje
27 #define LCD_DATA_LSB PIN_B4 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou) 27 #define LCD_DATA_LSB PIN_B4 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
28   28  
29 #include "LCD.C" 29 #include "LCD.C"
30   30  
31   31  
32 // Vstup seriovky 32 // Vstup seriovky
33 // 33 //
34 #ifdef INV 34 #ifdef INV
35 #use RS232 (BAUD=RS_BOUD, RCV=RS_IN, PARITY=N, INVERT) 35 #use RS232 (BAUD=RS_BOUD, RCV=RS_IN, PARITY=N, INVERT)
36 #else 36 #else
37 #use RS232 (BAUD=RS_BOUD, RCV=RS_IN, PARITY=N) 37 #use RS232 (BAUD=RS_BOUD, RCV=RS_IN, PARITY=N)
38 #endif 38 #endif
39   39  
40   40  
41 // Buffer FIFO 41 // Buffer FIFO
42 // 42 //
43 #define MAX 40 // delka bufferu 43 #define MAX 40 // delka bufferu
44   44  
45 char c[MAX]; // bufer FIFO 45 char c[MAX]; // bufer FIFO
46 unsigned int ci; // ukazatel na bunku kam se bude ukladat novy znak 46 unsigned int ci; // ukazatel na bunku kam se bude ukladat novy znak
47 unsigned int co; // ukazatel na bunku odkud se bude cist znak 47 unsigned int co; // ukazatel na bunku odkud se bude cist znak
48   48  
49 // Preruseni - ukladani dat ze seriovky do bufferu 49 // Preruseni - ukladani dat ze seriovky do bufferu
50 // 50 //
51 #int_ext // preruseni od zacatku znaku (start bit) 51 #int_ext // preruseni od zacatku znaku (start bit)
52 void Interupt() 52 void Interupt()
53 { 53 {
54 c[ci]=getc(); // nacti znak (asynchronni cteni programem) 54 c[ci]=getc(); // nacti znak (asynchronni cteni programem)
55   55  
56 if (ci<(MAX-1)) ci++; else ci=0; // posun ukazovatko do FIFO 56 if (ci<(MAX-1)) ci++; else ci=0; // posun ukazovatko do FIFO
57   57  
58 #ifdef INV 58 #ifdef INV
59 while(input(PIN_B0)); // pockej na konec posledniho bitu 59 while(input(PIN_B0)); // pockej na konec posledniho bitu
60 #else 60 #else
61 while(~input(PIN_B0)); // pockej na konec posledniho bitu 61 while(~input(PIN_B0)); // pockej na konec posledniho bitu
62 #endif 62 #endif
63 } 63 }
64   64  
65   65  
66 // Hlavni smycka 66 // Hlavni smycka
67 // 67 //
68 void main() 68 void main()
69 { 69 {
70 char ch; // pomocna promenna pro 1 znak 70 char ch; // pomocna promenna pro 1 znak
71   71  
72 // Inicializace portu 72 // Inicializace portu
73 output_a(0); // vsechny porty vystupni 73 output_a(0); // vsechny porty vystupni
74 output_b(0); // a nulove krome 74 output_b(0); // a nulove krome
75 output_float(RS_IN); // portu pro RS232 (a preruseni) 75 output_float(RS_IN); // portu pro RS232 (a preruseni)
76   76  
77 // Inicializace LCD 77 // Inicializace LCD
78 lcd_init(); // inicializace LCD 78 lcd_init(); // inicializace LCD
79 printf(lcd_putc,"LCD Terminal 1.0"); // standardni vypis 79 printf(lcd_putc,"LCD Terminal 1.0"); // standardni vypis
80 #ifdef INV 80 #ifdef INV
81 printf(lcd_putc,"\nInverted"); // oznameni o inverzni variante 81 printf(lcd_putc,"\nInverted"); // oznameni o inverzni variante
82 #else 82 #else
83 printf(lcd_putc,"\nStandard"); // oznameni o inverzni variante 83 printf(lcd_putc,"\nStandard"); // oznameni o inverzni variante
84 #endif 84 #endif
85 delay_ms(300); // cas na precteni 85 delay_ms(300); // cas na precteni
86 printf(lcd_putc,"\f"); // smazani displeje 86 printf(lcd_putc,"\f"); // smazani displeje
87   87  
88 // Inicializace FIFO ukazatelu 88 // Inicializace FIFO ukazatelu
89 ci=0; 89 ci=0;
90 co=0; 90 co=0;
91   91  
92 // Inicializace preruseni 92 // Inicializace preruseni
93 #ifdef INV // dle polarity kominkace polarita preruseni 93 #ifdef INV // dle polarity kominkace polarita preruseni
94 ext_int_edge(L_TO_H); 94 ext_int_edge(L_TO_H);
95 #else 95 #else
96 ext_int_edge(H_TO_L); 96 ext_int_edge(H_TO_L);
97 #endif 97 #endif
98 enable_interrupts(int_ext); // povoleni preruseni od INT0 98 enable_interrupts(int_ext); // povoleni preruseni od INT0
99 enable_interrupts(global); // povoleni globalniho preruseni 99 enable_interrupts(global); // povoleni globalniho preruseni
100   100  
101 // Hlavni smycka 101 // Hlavni smycka
102 while (1) 102 while (1)
103 { 103 {
104   104  
105 // Test na neprazdny buffer 105 // Test na neprazdny buffer
106 while (ci==co); 106 while (ci==co);
107   107  
108 // Zobrazeni znaku 108 // Zobrazeni znaku
109 lcd_putc(c[co]); 109 lcd_putc(c[co]);
110   110  
111 // Posunuti ukazovatka 111 // Posunuti ukazovatka
112 if (co<(MAX-1)) co++; else co=0; 112 if (co<(MAX-1)) co++; else co=0;
113 } 113 }
114 } 114 }