Hi @all
da ich in den letzen Wochen in den verschiedensten Foren gesehen habe, welche Schwierigkeiten in Verbindung mit dem Anschluß eines LCD an den AVR vorhanden sind, habe ich versucht eine völlig universelle LCD Routine in Assembler zu schreiben. Diese basiert von der Idee her auf die Routinen von Andreas Schwarz arbeitet aber nicht Port gebunden. Sprich jeder PIN des LCD kann an jeden Port des AVR angeschlossen werden, auch völlig durcheinander ! (Siehe Testprogramm . In den Foren habe ich bemerkt, dass viele Anfänger (auch ich bin einer) versuchen Ihre Hardware an die vorhandenen Routinen anzupassen. Ich finde dies ist der falsche Weg, Software sollte immer an die Hardware angpasst werden. Vielleicht ist dies ja ein kleiner Denkanstoss, wenn jemand eine Routine entwickelt hat, diese dann auch später universell anzupassbar zu machen, und somit einer breiten Fangemeinde zugänglich zu machen (LINUX ist so groß geworden ! ).
So aber nun zu den Routinen.
Auskommentierte Zeilen sind noch in der Entwicklung
(über Hilfe, Anmerkungen, Kritik und Teamwork würde ich mich wirklich riesig freuen).
Ich habe versucht soweit es mir möglich war, alles zu kommentieren.
Auch hier kann ich noch jede Menge Hilfe gebrauchen.
Es wäre schön, wenn an diesen Projekt eine Menge Leute mitarbeiten würden, um dann die fertige Routine der Allgemeinheit zugänglich zu machen.
Also Postet gerne eure Meinung, Anregungen damit ich sehe ob es noch mehr Leute gibt die wie ich denken
So Long
Skyrider
lcd.zip
emthält:
<lcd_test.asm>
<lcd.inc>
>LCDdef.inc>
<Mega16.inc>
<Mega8515.inc>
<tiny2313.inc>
Hallo,
Klasse gemacht !
Ein Vorschlag:
in der Initialisierung,
Das "- 1" in den Zeilen
usw.sbi lcd_port_db4 - 1, lcd_db4 ;setze DDR für DB4 auf Ausgabe
finde ich etwas unschön.
Es muss ja nicht immer so sein, das bei jedem AVR das DD-Register
eins tiefer ist als die Portadresse.
Lieber noch einen Parameter "lcd_ddr_db4 = DDRA" oder so definieren.
Dann ist es wirklich universell.
Wie gesagt, nur ein Vorschlag.
Ansonsten gefällt es mir gut.
Gruß Jan
@pebisoft
Sorry, der Titel sollte eigentlich "Universelle ASM LCD-Routine für AVR" lauten.
Das man in Bascom alle PINS einzeln ansteuern kann hatte ich in ersten Tests mit Bascom gesehen. mit winavr kenne ich mich (leider noch nicht) aus, und kann dir so nicht sagen wie es eingebunden werden kann (oder auch die im Netz vorhandenen Assembler LCD-Routinen). Ich gehe davon aus, dass die Routinen interessant sind die in Assembler programmieren oder Assembler programmieren lernen wollen.
Nobody ist perfect !
Gruß
Skyrider
Hallo pebisoft
Wenn skyrider sauber die Aufruf-Konvention beschreibt, so kann man gerade bei Bascom eine asm-Routine durch einbetten in der Assembler direktive einbetten, leichter gehts nicht, oder? Im Buch von Claus Kühnel, Programmieren der AVR RISC mit BASCOM-AVR, siehe auch Büchervorstellungen in diesem Forum, werden serienweise Beispiele gezeigt.
MfG
Hellmut
@JanB
Hallo Jan,sbi lcd_port_db4 - 1, lcd_db4 ;setze DDR für DB4 auf Ausgabe
hatte ich zuerst auch so gemacht
leider fand ich dann die Zuweisungen doch etwas verwirrend.
wie wärs denn da mit
Wirkt allerdings auch etwas verwirrend.set lcd_ddr_offset = 1
sbi lcd_port_db4 - lcd_ddr_offset, lcd_db4 ;setze DDR für DB4 auf Ausgabe
Gruß Skyrider
@Hellmut
Danke für die Unterstützung,
bei Bascom und Winavr habe ich nur einmal kleine Code-Auschnitte gesehen um zu wissen das es geht, aber leider noch keine Ahnung wie.
Viele Grüße
Skyrider
Hallo Skyrider
Zitat aus dem oben genannten Buch von Claus Kühnel im Kapitel: 3.11 BASIC & Assembler, Seite 92 & 93:
"Die meisten Assembler-Mnemonics werden vom Compiler bereits erkann. Die Ausnahmen sind SUB, SWAP und OUT...."
" Nicht alle Register sind für die Programmierung in Assembler frei. R4/R5 werden als Stackframe verwendet. R8/R9 dienen als Datapointer für die READ Instruktion. R6 enthält einige Bitvariablen:..."
Ende Zitate.
So genau hatte ich das Thema nicht recherchiert, aber der Compiler erkennt offenbar Assembler-Befehle direkt an ihren Mnemonics. leichter kann die Einbettung nicht gehen. In einen Programm-Beispiel für die Messung von Impulslängen wird eine Funktion unter BASIC definiert, die Funktion selber ist reiner Assembler-Kode.
MfG
Hellmut
@all
ich habe einige neue Funktionen in die Routine eingebaut.
- Auf Anregung von JanB sind die Datenrichtungregister deklariert
- lcd_pos (x,y) setzt Cursor auf Zeile x Spalte y
- lcd_out (Z) gibt Zeichenketten aus
- tiny2313.inc Unterstützung für den tiny2313
@JanB
Thanks
@Hellmut
Ich glaub ich muss mir doch noch mal das Buch von Claus Kühnel kaufen
Gruß
Skyrider
Hi @all
ich habe eine neue Version (Beta v099.025) bereitgestellt:
- Aufteilung der Deklarationen in LCDdef.inc um beim Einspielen einer neuen Version nicht alles wieder anpassen zu müssen.
- <lcd_busy> fragt das BusyFlag ab
- <wait_ms (x)> flexible Delay-Routine (1-255ms)
- diverse Anpassungen und Verbesserungen innerhalb der Routine
VG
Skyrider
Lesezeichen