PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] EA DIP162-DNLED lässt sich nicht initialsieren



RP6fahrer
25.05.2012, 15:34
Hallo Forum!

Ich beschäftige mich seit dieser Woche wieder mit der Programmierung von Microcontrollern. Ich verwende zurzeit einen ATmega 16. Dieser läuft mit 8Mhz Takt. Da ich gerne Ausgaben des Controllers sehen möchte, wollte ich ein Display anschließen. Dieses hatte ich bereits beim RP6 und dort hat es einwandfrei funktioniert.
Ich hab die D0-D7 an PA0 - PA7 angeschlossen. Ich möchte es im 8Bit-Modus steuern. RS an PC4 und E an PC5. Die Hintergrundbeleuchtung ist nicht angeschlossen und auch nicht notwendig.
Ich habe ein ganz einfaches Programm geschrieben, wo das Display nur initialisiert wird und der Cursor blinken soll. Die Initialisierung habe ich nach Datenblatt gemacht. http://www.lcd-module.de/pdf/doma/dip162-d.pdf (Seite 3 unten).

Das ist der Programmcode:


#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>

void delay_ms(uint16_t ms)
{
for(uint16_t t=0; t<=ms; t++)
_delay_ms(1);
}

void lcd_flash_e(void)
{
PORTC = 0b00100000 ; // Enable = HIGH
delay_ms(100); // kurz warten, damit Flanke entsteht
PORTC = 0b00000000 ; // Enable = LOW
delay_ms(100); // Warten, bis der durch Enable angelegte Befehl hoffentlich verarbeitet wurde
}


int main()
{
DDRA = 0xFF; //D0-D7
DDRD = 0xFF; //Bestätigungsled
DDRC = 0xFF; // setze Portrichtung (1 = Ausgang): 1111 1111


delay_ms(200); // 200ms warten bis LCD wirklich bereit! Wir können nicht BUSY auswerten.

PORTA = 0b00110100;
lcd_flash_e ();
delay_ms(800);

PORTA = 0b00111000;
lcd_flash_e ();
delay_ms(800);

PORTA = 0b00111000;
lcd_flash_e ();
delay_ms(800);

PORTA = 0b00001111;
lcd_flash_e ();
delay_ms(500);

PORTA = 0b00000001;
lcd_flash_e ();
delay_ms(500);

PORTA = 0b00110010;
lcd_flash_e ();
delay_ms(500);

PORTD = 2;
while(1);
return 0;
}

Das Problem ist, dass das Display nur die erste Zeile mit Balken anzeigt. Ich habe in verschiedenen Foren nachgelesen und das deutet hin, dass die Initialisierung für 2 Zeilen nicht geklappt hat. Kontrast lässt sich regeln über Potentiometer. Ändert auch nix.
Hat jemand eine Idee, was das Problem sein könnte?
Die Belegung des Steckers (vom Display) entspricht der Pinbelegung auf der Erweiterung des RP6, dem RP6 CONTROL M32. Also:
Pin1: GND
Pin2: VDD
Pin3: VEE an Abgriff Poti(10K)
Pin4: RS an PC4
Pin5: RW auf Masse gelegt
Pin6: E an PC5
Pin7: D0 an A0
Pin8: D1 an A1
Pin9: D2 an A2
Pin10: D3 an A3
Pin11: D4 an A4
Pin12: D5 an A5
Pin13: D6 an A6
Pin14: D7 an A7

Vielen Dank schon im voraus. Für weitere Details fragt einfach. Sollte es bereits ein Thema hier im Roboternetz geben, was dieses Problem behandelt, dann freue ich mich über einen Link, da ich selbst nichts gefunden habe.
Schönes Wochenende
MFG
RP6fahrer

BMS
25.05.2012, 17:29
Hallo,
die erste Frage wäre gleich: Hast du die JTAG-Fuse deaktiviert?
Beim ATmega16 / 32 ist diese standardmäßig aktiviert und dann funktionieren gewisse Pins von PORTC nicht richtig ;)
Am Code habe ich nichts Auffälliges gefunden, lediglich die Delays kannst du um einiges verkürzen.
Falls es nicht an der JTAG-Fuse liegt, verweise ich mal auf diese Liste hier: http://rn-wissen.de/index.php/Textdisplay_Fehlersuche
Grüße, Bernhard

RP6fahrer
26.05.2012, 20:08
Guten Abend Bernhard!
Vielen Dank erstmal. Ich werde das überprüfen. Schaff es leider heute nicht mehr. Vielen Dank auch für den Link.
Ich melde mich wieder, wenn ich mehr weiß.
MFG
RP6fahrer

RP6fahrer
27.05.2012, 18:20
Hallo!
Ich hab jetzt die Fuse-Bits überprüft. Die JTAG-Funktion war aktiviert. Ich habe diese deaktiviert und es ging einwandfrei. Nochmals Dankeschön. Jetzt kann ich da ein bisschen ausprobieren. Mir schwebt auch schon vor, das LCD im 4 Bit-Betrieb komplett über PCF8574 ansteuern. Aber dazu später. Wenn ich wieder Fragen hab, dann stelle ich sie hier.
Schöne Pfingsten
MFG
RP6fahrer