steffen3
03.01.2008, 16:29
hallo,
ich habe aus einer Assemblervorlage den im Anhang befindlichen C-Quelltext agbeleitet.
Die Initialisierung des LC-Displays funktioniert auch, zumindest kann ich den Kontrast in beiden Zeilen verändern.
Wenn ich jedoch einen Buchstaben ausgeben möchte wird das komplette Display beschrieben, teils mit unsinnigen Symbolen und teils mit dem gewünschten Buchstaben. Lediglich eine Stelle des Displays zu beschreiben ist mir noch nicht gelungen, hoffe jemand findet eine Lösung.
Gruss Steffen
Mahlzeit :)
Ne Lösung kann ich dir nicht wirklich anbieten, nur ein paar Gedanken, wobei mein c etwas eingerostet ist...
Das viele hinundher gespringsel ist aufm PC ganz ok, auf nem AVR kostet sowas eeeeleend Zeit.
Wasn das?
void LCD_string(char *string)
{
while(*string)
{
LCD_data(*string);
string++;
}
}
Hat aber eher nix mit dem einzelnen Zeichen zu tun ;)
In lcd_enable wartest 3us, erscheint mir was wenig, kann mich aber auch irren.
Du führst in LCD_init schon LCD_on/clear aus, brauchst nicht nochmal in lcd_asm.
Schreib das init für den 4 bit modus 2mal, nutz deine lcd_cmd Funktion dafür, aber frag mich nie warum.... Schau ins Datenblatt vom Controller, ob 5ms nachm modus setzen reichen tun, dito für alle anderen cmds.
Klingt insgesamt nach nem Timing oder init Problem, schreibst ja mit LCD-data nur ein byte. Probier das mitm Modus 2x setzen und danach mit länger warten bei den einzelnen cmds/datenbytes.
Viel Glück :)
Du schreibst leider nicht, was für ein Display du hast, bzw. was für ein Controller drauf ist. Auch wird nicht klar warum du den 4-Bit Modus nimmst.
Für den Anfang tät ich normal 8Bit in einem Schritt rüberreichen, mit der selben Schaltung kannst du später immer noch auf 4Bit gehen.
Dein code ist für ein Standard LCD mit HD44780, so du bereit bist nochmal code von asm zu c zu portieren nimm das hier in 8Bit. Wartet immer nur solange bis das Display fertig ist und springt nicht soviel in der Gegend rum (machts auch irgendwie übersichtlicher, IMHO):
lcdtxbytei:
; write single byte instruction to lcd
; rgtmp haelt instruction
; prepare to write instruction
CBI portb, 6 ; rs to low
; write the byte
RCALL lcdwritebyte
RET
lcdtxbyted:
; write single byte data to lcd
; rgtmp haelt databyte
; prepare to write data
SBI portb, 6 ; rs to high
; write the byte
RCALL lcdwritebyte
RET
lcdwritebyte:
; prepare for write
SBI portb, 0 ; execute to high
CBI portb, 7 ; rw to low
; portd to output (data bits)
LDI rgtmp2, 0xff
OUT DDRD, rgtmp2
; copy byte to port
OUT PORTD, rgtmp
; lower execute, exec instruction
CBI portb, 0 ; execute to low
; --- check busy flag
; portd to input
LDI rgtmp2, 0x00
OUT portd, rgtmp2 ; shut down pullups
OUT DDRD, rgtmp2 ; switch to input
; prepare for busy read
SBI portb, 7 ; rw to high
CBI portb, 6 ; rs to low
busyloop:
; if busy low, don't run in circles
SBIS PIND, 7
RJMP busyend
SBI portb, 0 ; execute to high
RJMP busyloop
; end of busy
busyend:
RET
lcdinit:
; config execute
SBI DDRB, 0 ; PC0 is output
SBI PORTB, 0 ; and set it to high
; config rw (read/write, low for write, high for data/status read)
SBI DDRB, 7 ; PC1 is output
SBI PORTB, 7 ; and set it to high
; config rs (register select, low for instruction, high for data)
SBI DDRB, 6 ; PC2 is output
SBI PORTB, 6 ; and set it to high
; init display
; - 8bit, 2 zeilen
LDI rgtmp, 0x38
RCALL lcdtxbytei
; - 8bit, 2 zeilen
LDI rgtmp, 0x38
RCALL lcdtxbytei
; - display an, cursor an, blink (?)
LDI rgtmp, 0x0e
RCALL lcdtxbytei
; - clear and home display
LDI rgtmp, 0x01
RCALL lcdtxbytei
; - autoincrement
LDI rgtmp, 0x06
RCALL lcdtxbytei
RET
Sorry, hab irgendwie keinen Beispielcode in c...
Hubert.G
03.01.2008, 22:00
Warum nimmst du nicht den Standard Code von Peter Fleury, man muss das Rad nicht unbedingt neu erfinden.
steffen3
04.01.2008, 23:37
ich habe mir den ganzen quelltext heute nochmal vorgenommen und jetzt läuft es, aber danke für die Bemühungen.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.