Serielles Interface per Software

Gast #2307056
Lesenswert?

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
Gast #2307360
Lesenswert?

Vielleicht nochmal zur Spezifizierung der Fragestellung:

Ich hatte mir Tipps von ein paar Programmierexperten erhofft, ob die 
Herangehensweise richtig ist, oder wie man das ganze möglichst 
resourcensparend programmiert (das ganze soll mit 100 - 500 kHz laufen).

Vielleicht hat ja jemand einen Tipp.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren