Forum: Mikrocontroller und Digitale Elektronik lcd routines umgeschrieben -fehler


von tiroler79 (Gast)


Angehängte Dateien:

Lesenswert?

hallo allerseits!

habe die datei lcd routines (tutorial) für mich umgeschrieben da ich
andere pins verwenden will
statt pin db4 pd5 usw.
;DB4 pd5
;db5 pd6
;db6 pd7
;db7 pb0
;rs  pb6
;e   pb7

;-- = alter original code ausgeklammert

funktioniert nur leider nicht und finde einfach keinen fehler!

kann mir jemand weiterhelfen

vielen dank im vorhinein

thomas

von Dennis Brücke (Gast)


Angehängte Dateien:

Lesenswert?

Habe mir deinen Code nicht wirklich genau durchgesehen, da Du leider
deine Änderungen nicht Dokumentiert hast.

Als erstes würde ich die Port´s in deiner Routine nicht direkt
"beziffer" (sbi portd, 5) sondern würde name per .EQU dafür
definieren, da du sonst jedesmal alles umschreiben musst wenn du mal
nur eine Leitung an einen anderen Pin haust...

Ich hab mal meine Routine mit in den Anhang gepackt, vieleicht kannst
Du damit was anfangen.

Gruß Dennis

von Dennis Brücke (Gast)


Lesenswert?

musst grad festellen das es meine alte routine ist, sie funktioniert
zwar ist aber kaum dokumentiert.

gruß dennis

p.s. die neuere hab ich leider nicht hier.

von tiroler79 (Gast)


Lesenswert?

vielen dank erstmals

mein problem ist daß sich meine datenpins auf verschiedenen ports
befinden
daher mein etwas komlpizierteres asm file

lg
thomas

von Dennis Brücke (Gast)


Lesenswert?

Ist doch kein Problem ;)

am anfang der File "Definierst du doch die Pins"
um es Dir aber nicht allzu "schwer" zu machen leg die DB4-DB7 auf
irgendein Port 0-3 das solltest auf jedenfall machen um dein register,
welches deine Daten beinhaltet nicht noch in einzelne Bits zu zerlegen
und auf deine einzelnen DB4-DB7 zu legen. Das macht kein Sinn, da du
dafür zeit "verschwendest" welche du so sinnvoll verteilst.

brauchst also nichts komplexes zu machen als dein Datenbyte (bei 8 bit
LCD Ansteuerung) direkt auf den Port zu legen. Bei 4bit Ansteuerung
erst die eine hälft dann die andere.

ich habe dafür auf einen ATmega8 die DB4-7 den PortC genommen, für die
Restlichen Leitungen PortD

----

Habe auch mal den Fehler gemacht ein Display (KS0107/8) "wirr" an die
Ports angeschlossen, um mich dann hinterher rumzuärgern, das ich jetzt
jedes einzelne bit auswerten muss und auf den Port zu legen... kurz
gesagt "nie wieder" ;)

---

Andere Methode wenn Du wirklich keine andere Möglichkeit hast benutz
doch einfach nen Portexpander welchen du mit 3 Leitungen ansteuerst.
Bit reinschieben, Clocken, reinschieben, clocken etc... dann Latch und
fertig is... kannst dann wieder 8bit Modus machen.

Gruß Dennis

von tiroler79 (Gast)


Lesenswert?

muß leider die bits einzeln abfragen bzw. zerlegen

dazugehörige platine ist leider schon fertig bestückt (viel bauteile)
(einen platinenfehler kann ich mit ziemlicher sicherheit ausschließen)
alles ausgemessen
display hatte mit originaler lcd routines im versuchsaufbau schon
funktioniert

ich dachte mir ich mache diese bitweise abfrage einfach so:

                 sbrc temp1, 3
     sbi portd, 0
     sbrc temp1, 2
     sbi portd, 7
     sbrc temp1, 1
     sbi portd, 6
     sbrc temp1, 0
     sbi portd, 5

statt das byte via out auszugeben

(alle änderungenen sind weiter eingerückt
und der originalcode übersichtshalber mit ;-- ausgeklammert

habe schon recht viel zeit mit diesem problem verbracht

vielen dank im vorhinein

thomas

von Dennis Brücke (Gast)


Lesenswert?

Da währe ich zu faul für ;)
Ich würde jetzt einfach ein 74HC595 zwischenschalten...

von Simon Küppers (Gast)


Lesenswert?

Mooment.

Wenn ich das richtig sehe, hast du doch nur statt Pin0-3 die Pinne 4-7
benutzt oder?

ist doch ganz easy:

Tutorial Routine:

lcd_data:
           mov temp2, temp1             ;"Sicherungskopie" für
                                        ;die Übertragung des 2.Nibbles
           swap temp1                   ;Vertauschen
           andi temp1, 0b00001111       ;oberes Nibble auf Null setzen
           sbr temp1, 1<<4              ;entspricht 0b00010000
           out PORTD, temp1             ;ausgeben
           rcall lcd_enable             ;Enable-Routine aufrufen
                                        ;2. Nibble, kein swap da es
schon
                                        ;an der richtigen stelle ist
           andi temp2, 0b00001111       ;obere Hälfte auf Null setzen
           sbr temp2, 1<<4              ;entspricht 0b00010000
           out PORTD, temp2             ;ausgeben
           rcall lcd_enable             ;Enable-Routine aufrufen
           rcall delay50us              ;Delay-Routine aufrufen
           ret                          ;zurück zum Hauptprogramm

Es wird das untere Nibble auf 0 gesetzt (Pin0-3) und die oberen werden
übernommen. du machsts wie folgt:

lcd_data:
           mov temp2, temp1             ;"Sicherungskopie" für
                                        ;die Übertragung des 2.Nibbles
           andi temp1, 0b11110000       ;oberes Nibble auf Null setzen
           sbr temp1, 1<<4              ;entspricht 0b00010000
           out PORTD, temp1             ;ausgeben
           rcall lcd_enable             ;Enable-Routine aufrufen
                                        ;2. Nibble, kein swap da es
schon
                                        ;an der richtigen stelle ist
           swap temp1                   ;Vertauschen
           andi temp2, 0b11110000       ;obere Hälfte auf Null setzen
           sbr temp2, 1<<4              ;entspricht 0b00010000
           out PORTD, temp2             ;ausgeben
           rcall lcd_enable             ;Enable-Routine aufrufen
           rcall delay50us              ;Delay-Routine aufrufen
           ret


Oder lieg ich falsch?
Nun wird nämlich alles auf die oberen Pins umgebastelt. Hab lediglich
das Swap verschoben und die ANDI bitmaske geändert, damit auch die
richtigen Ports angesprochen werden.

von tiroler79 (Gast)


Lesenswert?

nein nein!

wie geschrieben:

;DB4 pd5 db1
;db5 pd6 db2
;db6 pd7 db3
;db7 pb0 db4

;pins original - meine pins - bezeichnung

ich hab die bits ja auch schon einzeln rausgefischt (siehe code)
und pins dann einzeln damit angesteuert

ich finde beim debuggen auch keinen fehler aber mit lcd fuktioniert es
einfach nicht!

ist sicher nur eine kleinigkeit - aber finde sie leider nicht!

vielen dank erstmal

lg
thomas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.