Forum: Mikrocontroller und Digitale Elektronik Serielles Interface per Software


von Michael (Gast)


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

von Michael (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.