PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Universelle LCD-Routine für AVR



skyrider
26.04.2005, 18:00
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>

pebisoft
26.04.2005, 18:39
das stimmt nicht ganz. bei bascom kann man die routinen dem anschluss anpassen. bei winavr kann man die routinen ganz einfach an den 4 datenpins anpassen oder sogar auf 8-bit abfahren.
wie kann man jetzt deine asm-routine denn in bascom oder winavr-einbinden.
mfg pebisoft

JanB
26.04.2005, 19:21
Hallo,
Klasse gemacht !

Ein Vorschlag:
in der Initialisierung,
Das "- 1" in den Zeilen

sbi lcd_port_db4 - 1, lcd_db4 ;setze DDR für DB4 auf Ausgabe usw.
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

skyrider
26.04.2005, 19:40
@pebisoft


das stimmt nicht ganz. bei bascom kann man die routinen dem anschluss anpassen. bei winavr kann man die routinen ganz einfach an den 4 datenpins anpassen oder sogar auf 8-bit abfahren.
wie kann man jetzt deine asm-routine denn in bascom oder winavr-einbinden.
mfg 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

Hellmut
26.04.2005, 19:42
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.

skyrider
26.04.2005, 19:53
@JanB


sbi lcd_port_db4 - 1, lcd_db4 ;setze DDR für DB4 auf Ausgabe


Hallo Jan,

hatte ich zuerst auch so gemacht O:)
leider fand ich dann die Zuweisungen doch etwas verwirrend.

wie wärs denn da mit

.set lcd_ddr_offset = 1

sbi lcd_port_db4 - lcd_ddr_offset, lcd_db4 ;setze DDR für DB4 auf Ausgabe


Wirkt allerdings auch etwas verwirrend :-k

Gruß Skyrider

skyrider
26.04.2005, 19:59
@Hellmut

Danke für die Unterstützung, O:)
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

Hellmut
27.04.2005, 08:12
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.

skyrider
28.04.2005, 19:29
@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 O:)

Gruß
Skyrider

skyrider
22.05.2005, 12:32
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

pebisoft
22.05.2005, 16:05
ich habe auch schon bei universalroutinen festgestellt, das die fehlersuche dort nicht einfach ist. makros (bausteine) sind immer noch besser als die eierlegende wollmilchsau.
mfg pebisoft