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:
Code:
#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
Lesezeichen