Hallo zusammen,
zur Ansteuerung von LCD Tastern implementiere ich gerade ein serielles
Interface in Software. Der Standard schreibt folgendes vor:
- Daten werden bei Flanke low-high angelegt
- Daten werden vom Taster bei Flanke high-low gelesen
- Es wird ein Startbit (0), 8 Datenbits, ein Parity Bit und zwei
Stopbits (1) übertragen.
- das Datenbyte wird mit LSB first übertragen
- das Paritybit muss - je nach Art des Datenbytes (Data oder
Commandbyte) even oder odd sein
Das Datenblatt mit allen Detail findet sich hier:
http://www.trgcomponents.de/Adm/StandardModule/FileMgr/Public/GetFile.aspx?FileID=6191
Kann der folgende Code funktionieren, oder hat noch jemand
Verbesserungsvorschläge?
In dem Timerinterrupt:
1 | if (PORTB & (1 << PB_CLK) == 0) // Daten anlegen, wenn Clock auf low ist
|
2 | {
|
3 | if (length != 0) // Daten nur anlegen, wenn welche gesendet werden sollen
|
4 | {
|
5 | switch (byte_status)
|
6 | {
|
7 | case 0: // Start Bit
|
8 | bit = 0;
|
9 | parity = 0;
|
10 | byte_status ++;
|
11 | break;
|
12 | case 1 - 8: // Data Bits
|
13 | bit = (byte_to_send >> (byte_status - 1)) & 0b00000001;
|
14 | if (bit)
|
15 | parity++;
|
16 | byte_status ++;
|
17 | break;
|
18 | case 9: // Partiy Bit
|
19 | if (parity_even)
|
20 | bit = parity % 2;
|
21 | else
|
22 | bit = ~(parity % 2) & 0b00000001;
|
23 | byte_status ++;
|
24 | break;
|
25 | case 10: // Stop Bit 1
|
26 | bit = 1;
|
27 | byte_status ++;
|
28 | break;
|
29 | case 11: // Stop Bit 2
|
30 | bit = 1;
|
31 | if (byte_number < length)
|
32 | {
|
33 | // nächstes Datenbyte einlesen
|
34 | byte_to_send = byte_array[byte_number];
|
35 | parity_even = parity_array[byte_number];
|
36 | byte_number ++;
|
37 | }
|
38 | else
|
39 | {
|
40 | // Daten wurden vollständig gesendet
|
41 | length = 0;
|
42 | }
|
43 | byte_status = 0;
|
44 | break;
|
45 | }
|
46 | else
|
47 | PORTB &= ~(1 << PB_DAT1); // Datenleitung auf low setzen
|
48 | }
|
49 | if (bit == 1)
|
50 | PORTB |= (1 << PB_DAT); // Datenleitung auf high setzen
|
51 | else
|
52 | PORTB &= ~(1 << PB_DAT); // Datenleitung auf low setzen
|
53 |
|
54 | PORTB |= (1 << PB_CLK); // Clock auf high setzen
|
55 | }
|
56 | else
|
57 | PORTB &= ~(1 << PB_CLK); // Clock auf low setzen
|
Vielen Dank für Eure Unterstützung.
Grüße Michael