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 |
} |