Hallo,
ich bin noch ziemlich "jung" was das programmieren von µC angeht.
Ich habe nun ein Programm fertig (es funktioniert auch) und ich wollte
mal einen "älteren" fragen, ob und wie man diesen Kode optimieren kann.
Ich möchte dabei aber meine Kode-Struktur (also Timer, Unterprogramme,
Interrupt etc.) beibehalten. Alles was ich will ist weniger Kode-Zeilen.
Währe nett wenn sich das mal jemand angucken könnte und Vorschläge
machen könnte wie ich das eleganter programmieren kann.
Vielen Dank im Voraus für eure Mühe
Das mit den 10 Ziffern kannste als Lookup-Table realisieren.
Einfach die 10 Bitmuster für die Anzeigen in den Flash speichern oder in
den RAM laden und dann mit nem Zeiger aufrufen.
Modularisieren ist wichtig, finde ich, und gerade, wenn es die 9 ist,
wird es schneller sein.
David W. wrote:
> Das mit den 10 Ziffern kannste als Lookup-Table realisieren.>> Einfach die 10 Bitmuster für die Anzeigen in den Flash speichern oder in> den RAM laden und dann mit nem Zeiger aufrufen.>> Modularisieren ist wichtig, finde ich, und gerade, wenn es die 9 ist,> wird es schneller sein.
Hallo,
könntest du das bitte mit einem kleinen Beispiel erklären.
Grüße
-sub-
Horst Wohlers wrote:
> ...> könntest du das bitte mit einem kleinen Beispiel erklären.
Ich versuche es mal...
Der Wert der Ziffer (0..9) steht in Register wl, das Register null
enthält immer 0. Der Datenbereich (auch Tabelle genannt) bimu enthält
die Bitmuster für die Siebensegmentanzeige. Die Bitmuster sind hier
etwas verworren und auch Low-aktiv, was mit einfacherer Hardware zu tun
hat.
Zuerst setzt man den Z-Pointer auf den Beginn der Tabelle, wobei wegen
der byteweisen Adressierung beim Befehl LPM (im AVR-instruction-set
nachlesen) das Doppelte der Adresse gebraucht wird. Das Label "bimu:"
ist dabei nur ein Platzhalter für die tatsächliche Speicheradresse und
wird vom Assembler beim Assemblieren mit dem tatsächlichen Adresswert
(16-Bit-Zahl) "gefüllt". Der Pointer zeigt nun auf das erste Element der
Tabelle. Wir brauchen aber das Element (das Byte mit dem Bitmuster), das
unserem Ziffernwert entspricht. Also erhöhen wir den Pointer um den
Ziffernwert durch eine Addition. Bei der Addition des L-Bytes könnte ein
Überlauf (in ZL) erfolgen, der das Carry-Flag setzt. Damit der Übertrag
auch in ZH landet, wird zu ZH der Wert 0 mit Carry addiert. Nun zeigt
der Z-Pointer auf das korrekte Byte. Der Befehl LPM liest dieses Byte
(aus dem Programmspeicher, also Flash) nach WL und gibt es am Port aus.
1
setseg: ;UP, setzt Segmente am Display
2
ldi zl,low(bimu*2) ;Z-Pointer auf Anfang
3
ldi zh,high(bimu*2) ;der Tabelle mit Bitmustern
4
add zl,wl ;Zahlenwert addieren
5
adc zh,null ;evtl. Übertrag auch
6
lpm wl,z ;Bitmuster aus Flash holen
7
out segport,wl ;und an Segment-Port ausgeben
8
ret ;zurück...
9
10
11
bimu: ;Bitmuster für Display-Segmente
12
.db 0b01000001,0b01011111 ;0, 1
13
.db 0b00110001,0b00010101 ;2, 3
14
.db 0b00001111,0b10000101 ;4, 5
15
.db 0b10000001,0b01011101 ;6, 7
16
.db 0b00000001,0b00000101 ;8, 9
Um die Routine besser nachvollziehen zu können hänge ich mal den
kompletten Quelltext an. Da sind dann auch die Deklarationen zu sehen,
also die Namensvergabe für die Register und Konstanten.
Viel Spaß damit...
...
Horst Wohlers wrote:
> David W. wrote:>> Das mit den 10 Ziffern kannste als Lookup-Table realisieren.>>>> Einfach die 10 Bitmuster für die Anzeigen in den Flash speichern oder in>> den RAM laden und dann mit nem Zeiger aufrufen.>>>> Modularisieren ist wichtig, finde ich, und gerade, wenn es die 9 ist,>> wird es schneller sein.>> Hallo,>> könntest du das bitte mit einem kleinen Beispiel erklären.
Guckst du hier
http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige
Hi!
Die Variante im Anhang ist noch etwas kürzer, aber nur weil dein
"rauf/runter" irgendwie nicht ganz ok war und Pins direkt abfragbar
sind.
Viel Erfolg, Uwe