AVR - LCD_2004, AM2320, DS3231

Vorstellungen von Programmen, welche mit Lazarus erstellt wurden.
Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: AVR - LCD_2004, AM2320, DS3231

Beitrag von Timm Thaler »

Mathias hat geschrieben:Was ist der Grund, das man diesen Umweg machen muss ?


Dass man zu blöd ist, mit packed BCD Zahlen zu rechnen?

BCD heisst ja, dass die Zahlen 0..9 als binär %0000 bis %1001 gespeichert werden, oder hex $00 bis $09. Das passt nun locker in 4 Bit, also hat man noch 4 Bit in einem Byte frei. In die packt man jetzt die zweite Dezimalstelle der Zeit. $21 (wohlgemerkt Hex) entspricht also 21 Uhr, nämlich 2 * 16 + 1.

BCD war früher üblich, als es noch 4-Bit µC gab, und damit konnte man schon super rechnen. Viele I2C-Uhrenbausteine liefern Zeit und Datum als packed BCD. Will man das als übliche Binärzahl auf dem µC haben, muss man allerdings die höhere Stelle umrechnen. Dazu dienen die beiden Funktionen.

Das div 10 geht allerdings gar nicht, dafür braucht der µC Software Division. Nicht schön.

Man kann übrigens Zeiten auf dem µC komplett in packed BCD verwalten. Meine Heizungssteuerung verwendet für Tagesprofile, Nachtabsenkung usw. nur packed BCD, weil das so aus der RTC kommt. Man kann genauso gut vergleichen, addieren, subtrahieren wie mit Binärzahlen, und man kann viel einfacher von und in Strings wandeln: Nur die Stelle holen und plus 48 rechnen => BCD zu ASCII, oder minus 48 => ASCII zu BCD. Das war übrigens der Grund, warum man das früher in Rechenmaschinen genommen hat: Einfache Ein- und Ausgabe von Dezimalzahlen, ohne div und mul.

Achso: Falls Du Dich schonmal gefragt hast, wofür Dein ATmega eigentlich dieses mysteriöse Half-Carry-Flag im Statusregister hat - das ist genau für das Rechnen mit diesen BCD-Zahlen gedacht.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: AVR - LCD_2004, AM2320, DS3231

Beitrag von Mathias »

Wen ich es richtig verstehe, wird der DS3231 ähnlich angesteuert, wie wen ich zwei 7-Segment-Anzeigen über zwei 4-Bit BCD-Decoder ansteuere würde.
Das dies eine Altlast von 4-Bit CPUs ist, kann ich mir gut vorstellen.


Falls Du Dich schonmal gefragt hast, wofür Dein ATmega eigentlich dieses mysteriöse Half-Carry-Flag im Statusregister hat

Hat mich bis jetzt nicht interessiert, aber ich habe wieder was gelernt. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: AVR - LCD_2004, AM2320, DS3231

Beitrag von Timm Thaler »

Mathias hat geschrieben:Das dies eine Altlast von 4-Bit CPUs ist, kann ich mir gut vorstellen.


Naja, nicht nur: So eine RTC ist ja auch kein Pentium mit Mathe-Coprozessor. Die soll vor allem stromsparend sein. Und die Dinger - schließlich sind die auch aus dem letzten Jahrhundert - haben letztlich genau die gleiche Technik verwendet wie andere Logikschaltungen auch: Zähler, Addierer, Vergleicher, Flipflop-Speicher. Da liegt es nahe das mit bekannten Strukturen zu realisieren, also mit BCD-Zählern usw. Bei unserer schönen flexiblen Mikrocontrollertechnik, wo der AVR heute eine Küchenuhr und morgen eine Türklingel sein kann, vergessen wir leicht, dass in diesen Bausteinen kein Programm läuft, sondern alles in Hardware gegossen ist.

Antworten