Forum: Mikrocontroller und Digitale Elektronik Hilfe-LCD Problem


von Merle (Gast)


Lesenswert?

Hi ich will ein 2x16 Zeichen LCD wie im AVR-Tourial beschrieben
anschließen. Der einzige unterschied ist ich will es nicht am PortD
sondern am PortC meines AT90S4433 anschließen aber das LCD Programm
funzt nicht. Ich hab schon mal Probiert übeall Wo PORTD oder DDRD steht
PORTC oder DDRC einzusetzten aber es hat danach immernoch nicht
funktioniert.

Fakt:
Ich weiß das bim AT90S4433 Bei portD 8 I/O Pins und bei PortC nur    6
I/O Pins dran sind aber das dürfte doch kein Problem sein oder??

Meine Frage:

Wie kann ich mein LCD am PortC meines AT90S4433 mit dem im Tourial
beschriebenen Programm ansteuern?? Kann mir jeman dabei Helfen???

Danke schon im Voraus.

Mfg. Merle

von Sebastian Wille (Gast)


Lesenswert?

Hi,

bei so was doch bitte den Quellcode posten!!!

Sebastian

von Merle (Gast)


Lesenswert?

Ach ja tschuldigun hab ihn vergessen dazu zu schreiben.
Hier der Quellcode:
_________________________________________________________________
swap r16               ;vertauscht die beiden Nibbles von r16

andi r16, 0b00001111   ;Nur die vier unteren (mit 1 markierten)
                       ;Bits werden übernommen, alle anderen werden
                       ;null

sbr r16, 0b00010000     ;Bit 4 setzen, alle anderen Bits bleiben
                        ;gleich

out PORTD, r16

sbi PORTD, 5              ;Enable high
nop                       ;3 Taktzyklen warten ("nop" = nichts tun)
nop
nop
cbi PORTD, 5              ;Enable wieder low

.include "4433def.inc"        ;ggf. anpassen

.def temp1 = r16
.def temp2 = r17
.def temp3 = r18

           ldi temp1, RAMEND  ;Stackpointer initialisieren
           out SPL, temp1


           ldi temp1, 0xFF    ;Port D = Ausgang
           out DDRD, temp1

           rcall lcd_init     ;Display initialisieren
           rcall lcd_clear    ;Display löschen

           ldi temp1, 'T'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 'e'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 's'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 't'     ;Zeichen anzeigen
           rcall lcd_data

loop:
           rjmp loop


 ;sendet ein Datenbyte an das LCD
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

 ;sendet einen Befehl an das LCD
lcd_command:                            ;wie lcd_data, nur ohne RS zu
                                        ;setzten
           mov temp2, temp1
           swap temp1
           andi temp1, 0b00001111
           out PORTD, temp1
           rcall lcd_enable
           andi temp2, 0b00001111
           out PORTD, temp2
           rcall lcd_enable
           rcall delay50us
           ret

 ;erzeugt den Enable-Puls
lcd_enable:
           sbi PORTD, 5                 ;Enable high
           nop                          ;3 Taktzyklen warten
           nop
           nop
           cbi PORTD, 5                 ;Enable wieder low
           ret                          ;Und wieder
                                        ;zurück

 ;Pause nach jeder Übertragung
delay50us:                              ;50us Pause
           ldi  temp1, $42
delay50us_:dec  temp1
           brne delay50us_
           ret                          ;wieder zurück

 ;Längere Pause für manche Befehle
delay5ms:                               ;5ms Pause
           ldi  temp1, $21
WGLOOP0:   ldi  temp2, $C9
WGLOOP1:   dec  temp2
           brne WGLOOP1
           dec  temp1
           brne WGLOOP0
           ret                          ;wieder zurück

 ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
           ldi  temp3,50
powerupwait:
           rcall  delay5ms
           dec  temp3
           brne  powerupwait
           ldi temp1, 0b00000011        ;muss 3mal hintereinander
                                        ;gesendet
           out PORTD, temp1             ;werden zur Initialisierung
           rcall lcd_enable             ;1
           rcall delay5ms
           rcall lcd_enable             ;2
           rcall delay5ms
           rcall lcd_enable             ;und 3!
           rcall delay5ms
           ldi temp1, 0b00000010        ;4bit-Modus einstellen
           out PORTD, temp1
           rcall lcd_enable
           rcall delay5ms
           ldi temp1, 0b00101000        ;noch was einstellen...
           rcall lcd_command
           ldi temp1, 0b00001100        ;...nochwas...
           rcall lcd_command
           ldi temp1, 0b00000100        ;endlich fertig
           rcall lcd_command
           ret

 ;Sendet den Befehl zur Löschung des Displays
lcd_clear:
           ldi temp1, 0b00000001   ;Display löschen
           rcall lcd_command
           rcall delay5ms
           ret

_____________________________________________________________

So dieses Programm ist für das PortD bei einem AT90S4433 geschrieben.
Und jetzt nochmal zu meiner schon oben stehenden Frage wie kann ich
diesen code auf dem PortC meines AT90S4433 einsetzten damit das LCD am
PortC auch wie am PortD das Wort "Test" ohne Fehler anzeigt??

von Chris (Gast)


Lesenswert?

Mmmmhh, erstmal gefragt. Hattest du dein display überhaupt schon mal zum
laufen gebracht?

Es gibt verschiedene 2*16 Zeichen Displays, da sind dann manchmal die
pins für die beleuchtung woanders.

Beim LCD braucht man im 4Bit Modus mind. 7 Signale, wenn man alles
ansteuert, außer den 4 Leitungen für die Daten noch RS,R/W und E, wobei
man R/W auf LowPegel lassen kann, wenn du nicht vorhast das BusyFlag
auszulesen!

Hat dein Quarz dieselbe frequenz wie das im Tutorial?

Der Programmcode über include "4433def.inc" steht der auch so in
deinem Programm?

Wie ist deine Pinbelegung? An welchen Pins hast du RS und E in deiner
Schaltung?

Gruß
Chris

von Merle (Gast)


Lesenswert?

Ja mein vorher hab ich mein LCD immer am PotrD angesteuert und dort hat
es gefunzt.

Das weis ich auch aber ich kenne die pins vom Datenblatt.

Ja das weiß ich auch und wenn man R/W auf Low lässt dann bleiben,wenn
man das LCD im 4Bit modus hat, nur noch 6 anschlüsse übrig
(RS-E-D11-D12-D13-D14) und das geht sich genau am PortC aus denn das
hat auch nub von PC0-PC5 also 6 I/O Pins.

Ja 4Mhz.

Ja genau so.

Also wenn ich das LCD am PortC Habe habe ich folgende Pinbelegung:

PC5  /  E

PC4  /  RS

PC3  /  D7

PC2  /  D6

PC1  /  D5

PC0  /  D4

von Chris (Gast)


Lesenswert?

Also eigentlich sollte die umstellung auf portC problemlos
funktionieren.
Vielleicht gibts probleme mit dem A/D-Wandler.
Hast du AVCC an deine Betriebsspannung angeschlossen, dies sollte man
tun wenn man den ADC nicht braucht, aber ich schau noch mal genau ins
Datenblatt. Aber wenn du PORTC als Ausgang definiert hast, sollte das
nicht schlimm sein,mmhh.

Der Code über Include ist doch über, ist doch doppeltgemoppelt.

Tut sich gar nichts wenn du Alles für Portc umschreibst?
Es ist immer schwer sich in einen anderen code reinzudenken.

von Merle (Gast)


Lesenswert?

Doch das LCD hat mal ein Paar kästchen angezeigt aber sonst Pustekuchen


Mfg. merle

von Chris (Gast)


Lesenswert?

Na, dann kann ja eigentlich nicht viel verkehrt sein. Wenn das LCD etwas
anzeigt sollte die Initialisierung ja schon mal gefunzt haben. Hast du
schon mal AVR-studio benutzt um alles zwecks ablaufzeiten zu
kontrollieren?

Was genau meinst du mit kästchen?

von Merle (Gast)


Lesenswert?

NMaja die kästchen eben wenn man das LCD an 5V spannung hält erscheint
meistens in der oberen zeile alle kästchen also die 8x7 Kästchen wo die
Buchstaben reingehören

Mfg. merle

von Chris (Gast)


Lesenswert?

mmhhh, dann wirds doch schwieriger, ich dachte der hätte bei dir
irgendwelche komischen zeichen angezeigt.

von Merle (Gast)


Lesenswert?

Ich habs jetztzt geschafft danke.

Mfg. Merle

von thkais (Gast)


Lesenswert?

Woran hats gelegen? Nur mal so interessehalber....

von Chris (Gast)


Lesenswert?

So für die Zukunft, wenn jemand ein ähnliches Problem hat?

von Merle (Gast)


Lesenswert?

Ich hab ein stück code vergessen. aber danke an alle die mir geholfen
haben.

Mfg. merle

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.