Translate

29 Oktober 2015

Kleines Zwischendurchprojekt: serielles Display für den Golf 3-Tacho anstatt der Uhr

Mit meinem Triebwerk gehts gerade nicht weiter, ich warte noch immer auf die Nabe.
Was den Eigenbau-Controller betrifft, da gäbs zwar ein paar Kleinigkeiten zu erzählen,
aber das wird zu gegebener Zeit mal nachgeholt, wenn ich auch sicher bin dass es
so klappt wie ich mir das vorstelle.......ich brauche mehr Leistung!!!!!! viel mehr!!!!
mindestens 150V (kein Problem bei 1200V-IGBT ;-)  ) 
und 500A besser 600A oder mehr, auch wenns normalerweise nicht genutzt wird
(schon ein Problem mit 400A IGBTs  :-(  )

Deshalb jetzt mal was ganz anderes.......

Ich hatte schon vor langer Zeit mal so eine Idee.........

Ein superwinziges Display, das ich anstelle der Digitaluhr in einen Golf3-Tacho
reinsetzen kann. Sehr viel Platz ist da wirklich nicht... 
Der Ausschnitt ist ca 31 x 12 mm groß und lediglich bei ganz bestimmten Typen
kann man das originale Display der Uhr überhaupt ausbauen so dass da Platz für 
was Anderes frei wird. Grundfläche maximal 51 x 31 mm und in die Tiefe ca 20mm.
Von Electronic Assembly gibts das EA DIPS082-HNLED -Display, und das ist ideal
für diesen Zweck. Aussenmaß 20 x 40 mm und 2 x 8 Zeichen auf 30 x 11 mm
Das passt tatsächlich da rein! Aber die Elektronik muss auch noch da rein!
(5V Spannungsregler, Siebkondensatoren, Quarz,  Pullup-Widerstände etc.)

Weil man das Rad nicht immer wieder neu erfinden muss will ich zur Datenübertragung
das "Curtis 840-Protokoll" benutzen, das ich schon vor einigen Jahren mal geknackt
habe. Erstens ist das nötige Programm schon "in der Schublade" so dass ich es ganz einfach anpassen konnte, zweitens ist es immer wieder mal vorgekommen, dass
jemandem das 840er Display mit seiner Gabelstapler-Optik so gar nicht gefällt.....

Das 840er Display hat eigentlich nur 1 x 8 Zeichen und einige LEDs als Ladezustandsanzeige sowie eine LED, die blinkt wenn geladen wird.

Die Ladezustandsanzeige brauche ich nicht, in einer früheren Programmversion
hatte ich die aber schon mal so umgesetzt dass der Balken auf einer LCD-Anzeige
in der unteren Zeile dargestellt wird.
Die Ansteuerung der LEDs erfolgt Bit-Codiert über ein bestimmtes Byte der Datenpakete.
Ich werde dieses Byte hier ein bisschen zweckentfremden und zunächst mal
dazu benutzen, damit zu steuern, ob der Text in der oberen oder in der unteren Zeile
angezeigt wird.

Aus Platzgründen muss ich hier wieder auf den eigentlich veralteten ATTINY 2313
zurückgreifen.Der Atmega8 bzw 48/168/328 passt leider nicht unter das Display.
Der 2313 ist der kleinste mit "richtiger" serieller Schnittstelle. Mit "Software-Uart"
habe ich nicht die allerbesten Erfahrungen gemacht, also 2313 und kein anderer.
(In SMD-Technik hat man wieder mehr Auswahl)
Den Prototyp habe ich auf einer Lochrasterplatine aufgebaut. vorerst ist das ein 
Einzelstück. Ich will damit ein paar Nachrichten meines Controllers anzeigen
Was genau, das weiss ich noch nicht so ganz, vor allem die Temperatur,
und so Dinge wie "Bereit" oder irgendwelche Fehlermeldungen.
aber die Leistung wäre auch interessant.Das ergibt sich schon noch.

Zur Erinnerung:
Den Aufbau des Protokolls habe ich schon vor einigen Jahren hier gepostet:
So ein "Curtis Datenpaket" besteht immer aus 13 Ascii-Zeichen die mit 9600Bd 9N1
gesendet werden. Keine Steuerzeichen wie [CR] oder [LF]


los gehts mit 58 (  = :  )
dann 83 (  = S  )
dann folgt der Text (acht Zeichen)
und die 40 (   = (   )
Dann kommt ein Byte,das die LEDs steuert
(das hat mich anfangs gefoppt, weil das bei all meinen Aufzeichnungen
immer 4 war........drum hielt ich das für das Ende-Zeichen)
und eine Zahl, die ich anfangs für das LED-Byte hielt, die sich dann
aber recht bald als Checksumme herausstellte.

>>>>Diese Zeichenfolge wird ständig gesendet,
keine weitere Kommunikation mit dem Display

Der Text war kein Problem, und mit den LEDs war auch schnell alles klar.
Die werden vom vorletzten Byte bestimmt und Bit-Codiert geschaltet.
Die ersten fünf Bit steuern die fünf LEDs des Balkens unterhalb des Displays,
Das sechste Bit schaltet die Störungsmeldung (die immer blinkt, wenn sie an ist)
und mit dem 7. und 8. Bit bringt man die erste und zweite LED zum Blinken.
(Die müssen dazu aber mit dem ersten bzw. zweiten Bit aktiviert sein)

Jetzt fehlte eigentlich nur noch die Checksumme...................
Da habe ich einige Zeit damit verbracht, die rauszubekommen,
das war einiges an Rechnerei.........
aber letztendlich wars dann gar nicht so schwer......
Hier werden einfach alle Bytes vor der Checksumme
xor verknüpft (Spaltenweise)  0 + 0 = 0  ; 0 + 1 = 1 ;  1 + 1 = 0
und da man in Bascom auch dezimal dargestellte Zahlen ganz einfach xor
verknüpfen kann wars dann auch ein lösbares Problem.



Das Programm für den ersten Prototyp habe ich wieder mal in Bascom geschrieben.
Ich habe die ganze LED-Auswertung entfernt und so kam ein recht überschaubares Programm heraus das auch in den winzigen 2k Flash des 2313 passt.

Hier fehlen auch noch ein paar Kleinigkeiten wie ein Timeout bei Signalausfall
(Die Texte sollen ja auch verschwinden, wenn ewig nichts neues nachkommt)
und das ehemalige LED-Steuerbyte werde ich noch etwas verfeinert auswerten.
8 Bit sind schliesslich auch als acht Steuerleitungen verwendbar.
Das alles gibt es schon als Atmega-Programm, müsste also nur wieder hier
hinzugefügt werden. Momentan würde das aber nur stören
Das folgende Programm stellt den empfangenen Text dar:
Ein Grundgerüst aus dem man noch viel mehr machen kann!
Viel Spass damit

Ach, beinahe hätte ich es vergessen.....Die Signale müssen noch angepasst
werden. Bei  RS232 ist +12V = 0 und -12V = 1 bei TTL ist +5V = 1 und 0V = 0
Aus Platzgründen und nur bei solch "unkritischen Anwendungen" wo auch mal
Daten verloren gehen dürfen macht das zur Not auch ein einfacher Transistor.
Weil hier die Daten auch nur in eine Richtung laufen könnte man statt einem TTL
zu RS232-Wandler wie dem MAX232 auch eine RS485-Verbindung einrichten 
ohne dass Senderseitig (Controller) eine zusätzliche Steuerleitung nötig ist.
(zur Umschaltung Senden/Empfangen) je ein SN75176 würde sich da anbieten.
5V TTL ist einfach zu störempfindlich, Da sollten die Leitungen die Platine 
nicht verlassen. Für RS232 braucht man ein 16-poliges IC und
mindestens vier kleine Kondensatoren, den Platz habe ich nicht.
Für RS485 genügt ein 8-poliges IC für ca 50 Cent ohne zusätzliche Bauteile.
Weil RS485 auch zu einem kleinen Bus erweitert werden kann ist es doppelt 
interessant. Vielleicht kann ich ja damit mal die wichtigsten Infos vom Controller 
und meiner "Franzbox" bzw einem noch nicht existierenden BMS auf dem kleinen 
Display vereinen.Ich meine hier nur Warnmeldungen und keine detaillierten Infos.
Das müsste dann aber alles aufeinander als Master-Slave-System abgestimmt
werden und das ist mir momentan noch nicht wichtig genug um dafür
jetzt schon Zeit zu opfern. Weil mir aber inzwischen bei meinem Controller
die Anschlüsse knapp werden und da das dort angeschlossene 4 x 20 Display
im Betrieb eigentlich überhaupt nicht benötigt wird, aber sechs Portleitungen
belegt bin ich gerade am überlegen wie ich die Anzeige auf das serielle Display 
auslagern kann.


genug gelabert, hier ist das Grundprogramm zur Curtis-Daten-Anzeige
es läuft so, aber es könnte durchaus sein, dass man da noch so manches verbessern kann
Insbesondere das Ablegen der einzelnen Werte könnte in einem Array erfolgen
und für die Checksummenberechnung wäre das dann per Array auch eleganter zu lösen.
(aber nicht so klar verständlich) Wie schon erwähnt muss noch ein Timeout rein
und eine Art automatischer Reset damit sich alles wieder synchronisiert wenn mal
"der Wurm drin" ist. Der Start bei Doppelpunkt ist dann problematisch wenn an anderer
Stelle zufällig auch dieses Zeichen steht. insbesondere auf die Checksumme hat man aber
keinen Einfluss.daher muss immer schön mitgezählt werden an welcher Stelle man gerade steht.




$regfile = "attiny2313.dat"
$crystal = 20000000
$baud = 9600


Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
>>>>gehört alles in eine Zeile, Belegung/Zuordnung der Display-Pins

Config Lcdbus = 4
Config Lcd = 16 * 2
>>>> 8 x 2 gibt es nicht bei Bascom

Cursor Off

Config Serialin = Buffered , Size = 30
>>>> mit Puffer ist einfach besser wenn manche Dinge wie LCD beschreiben
>>>> auch mal etwas dauern

Enable Interrupts



Cls
Locate 1 , 1
Lcd "********"
Wait 1
>>>>kleine Spielerei beim Einschalten


Dim S0 As Byte        >>>>eingelesenes Byte
Dim Led As Byte       >>>>Der Name für die Variable ist nicht ideal......
                                >>>> zählt die Byte

Dim Chs As Byte       >>>>Checksumme
Dim B0 As Byte        >>>> einzelne Byte des Pakets
Dim B1 As Byte
Dim B2 As Byte
Dim B3 As Byte
Dim B4 As Byte
Dim B5 As Byte
Dim B6 As Byte
Dim B7 As Byte
Dim B8 As Byte
Dim B9 As Byte
Dim B10 As Byte
Dim B11 As Byte
Dim B12 As Byte


Dim Str00 As String * 1     >>>> Zeichen das zum Byte gehört
Dim Strx As String * 9      >>>> Zeichenkette zum Anzeigen

B11 = 0
Led = 13
>>>> klare Verhältnisse beim Start schaffen

Do

If Ischarwaiting() = 1 Then
 S0 = Inkey()
 Gosub Onrxd
 End If

Loop
>>>> ein kurzes Hauptprogramm!

Onrxd:
If S0 = 58 And Led > 11 Then
Led = 0
Strx = ""
End If
>>>> löschen/starten des neuen String bei Doppelpunkt

Str00 = Chr(s0)
>>>>Zeichen aus dem Byte erzeugen
If Led > 1 And Led < 10 Then Strx = Strx + Str00
>>>>zusammensetzen

If Led = 0 Then B0 = S0
If Led = 1 Then B1 = S0
If Led = 2 Then B2 = S0
If Led = 3 Then B3 = S0
If Led = 4 Then B4 = S0
If Led = 5 Then B5 = S0
If Led = 6 Then B6 = S0
If Led = 7 Then B7 = S0
If Led = 8 Then B8 = S0
If Led = 9 Then B9 = S0
If Led = 10 Then B10 = S0
If Led = 11 Then B11 = S0
If Led = 12 Then
B12 = S0
Chs = B0 Xor B1
Chs = Chs Xor B2
Chs = Chs Xor B3
Chs = Chs Xor B4
Chs = Chs Xor B5
Chs = Chs Xor B6
Chs = Chs Xor B7
Chs = Chs Xor B8
Chs = Chs Xor B9
Chs = Chs Xor B10
Chs = Chs Xor B11
End If
>>>> Einzelne Zeichen/Byte merken und Checksumme berechnen

If Led = 12 And Chs = B12 Then
>>>> wenn auch die Checksumme passt, dann.....
'Cls
'Locate 1 , 1
>>>> würde nur in die obere Zeile schreiben bei 1 x 8 Display
If B11 < 128 Then Locate 1 , 1 Else Locate 2 , 1
Lcd Strx
End If
>>>>oben oder unten ausgeben je nach Wert von B11
>>>>

Incr Led
If Led > 13 Then Led = 13
>>>> nächstes Byte verarbeiten

Return

End


2 Kommentare:

  1. Looks like a fun project. Did you draw up a schematic for this and do you have a hex file I can use to program the tiny?

    Kind regards,

    Edwin

    AntwortenLöschen
  2. Hello Edwin,
    Sorry, at the moment i dont really have the time to
    pay the necessary attention to this blog,
    so please excuse this very late answer

    Yes, this was a fun-project for some rainy day!
    It is a modification of an earlier Project
    when i made a Curtis 840-Clone.
    The serial protocol is very simple,
    and the displayed text is generated in the
    sender.
    There is almost no schematic....
    (everything is "standard" like described for any arduino)
    You neet a potentiometer (ca.10k) for setting the contrast,
    The display is direct connected to the attiny.
    (the pins are set in the first lines of the program)
    The serial port needs an inverter, ideal is a MAX232
    or something similar, but if you want to save place,
    you can do this with a simple transistor.
    (that is not really recommended....but it works for a simple display)
    For a better reliability of the serial connection You should use a quartz
    and everything runs at 5V.

    Of course i have a hex file, but in this case you can install
    a free version of bascom (less than 4k of final code)
    so you can adapt everything to your needs.

    especially the "checksum-thing" will cost you a lot of nerves
    as long as You are in the test-phase. It should be removed
    until everything else works!

    have fun!
    Franz


    AntwortenLöschen