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
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??
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
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
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.
Doch das LCD hat mal ein Paar kästchen angezeigt aber sonst Pustekuchen Mfg. merle
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?
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
mmhhh, dann wirds doch schwieriger, ich dachte der hätte bei dir irgendwelche komischen zeichen angezeigt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.