PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD 4*20 mit ATMEGA32/16MHZ....



masterx
10.02.2011, 13:24
Tag zusammen!
Ich beschäftige mich seit numehr 4 Tagen mit einem RN-Board(1.4Mega32) und einem 4*20 Display mit dem Standart adapter!

Zunächst habe ich auf dem Bord etwas aufräumen müssen damit ich die Ports so nutzen konnte wie ich es für mein Projekt brauchte!Motortreiber und das Ic für die serielle Schnittstelle raus und R13 und R14 getrennt!

Dann habe ich das Display mit dem 10-pooligen Wannenstecker in Port-C eingesteckt und den Jtag mit dem ProgTool nicht enabled also deaktiviert!
Die 4Datenleitungen DB4-DB7 habe ich im Wannenstecker umgedreht das sie aufsteigend von PC0-PC3 angeschlossen sind!

Bisher kann ich aber nur über PC4 die Hintergrundbeleuchtung schalten!

Ich habe nun die letzten 30 Stunten damit verbracht irgendwie wenigstens mal dem LCD auch nur ein Pixel zu entlocken aber Fehlschlag!
Ich habe die verschiedensten lcd.c und ..h ins Programm eingebunden und das Makefile geändert aber alles vergebens das Display zeigt mir nichts an ich bin ratlos!

Ich programmiere in c aber ich finde immer nur Programmierungen in GCC oder Bascom, aber damit kann ich nichts anfangen!

Ds LCD muß im 4-Bit_Modus programmiert werden!

Ich weiß das es eine Blöde Frage ist aber WAS NUN???

Prozessor ATMEGA32 //Quarz 16MHz //
EDIT:Ich brenne mit dem mySmartusb mk2 via ISP

Grüße Stephan

BMS
10.02.2011, 13:33
Hallo,
als erstes solltest du testen, ob der Kontrast richtig eingestellt ist.

Wenn das Display mit Strom versorgt wird und noch keine Daten vom
Mikrocontroller erhalten hat, müssen zumindest in der ersten Zeile
schwarze Blöcke sichtbar sein (bei einem vierzeiligen wird wahrscheinlich
auch die dritte Zeile mit Blöcken gefüllt sein).

Wenn da nichts erscheint, dann passt der Kontrast noch nicht.
Das wird ja meist über ein Poti eingestellt (den Adapter kenne ich
persönlich jedoch nicht).

Erst einmal muss das funktionieren, sonst brauchst du mit der Software
noch garnicht anfangen :-k

Grüße,
Bernhard

masterx
10.02.2011, 13:51
Ich hoffe das nervt nicht wenn ich hier nur kurz anrworte !!???
Habe den Kontrastregler eingestellt und in der 1. und 3. Reihe habe ich jetzt schwarze Balken!
EDIT:Blöcke
Grüße Stephan

BMS
10.02.2011, 14:18
Eine kurze Rückmeldung ist immer gut.
Jetzt kannst du ja nochmal dein Programm testen. :)

Falls es immer noch nicht klappen sollte, dann könntest du mal alle elektrischen Verbindungen zum Display prüfen (mit Messgerät auf Durchgang prüfen).
Kannst du Lötfehler ausschließen?
Ansonsten bitte Programmcode hier rein kopieren.
Ich habe immer noch nicht verstanden mit welcher Programmierumgebung du arbeitest.

Grüße,
Bernhard

masterx
10.02.2011, 15:29
Es tut sich immer noch nichts besonderes!(nur schwarze blöcke
Ich programmiere mit ProgrammersNotepad von WINAVR und den atmega schreibe ich mit PrgTOOL von myAVR , das Makefile erstelle ich ebenfallls mit MAKEFILE von WINAVR

Grüße Stephan

BMS
10.02.2011, 15:46
Erstmal: WinAVR enthält avr-gcc :) (das schreibe ich nur weil du in deinem ersten Post etwas von GCC-Beispielen geschrieben hast^^)

Hab mal den Code grob durchgeschaut.
In der lcd_init wird der LCD_PORT zum Glück auf Ausgang geschaltet, das hätte ich sonst vermisst. Konnte sonst nichts Verdächtiges finden, würde weiterhin auf einen elektrischen Fehler tippen.
Wenn ich das richtig sehe hast du EN auf PC5, RS auf PC7 und die Datenleitungen auf PC0...PC3. Vergleiche das bitte nochmal mit der Hardware. Sind die Leitungen wirklich durchverbunden und auch nicht vertauscht? (Ich habs mal geschafft RS und EN zu verwechseln...bis man das findet!)

Grüße,
Bernhard

masterx
10.02.2011, 18:22
So habe nochmal die Daatenblätter von dem LCD-Adapter der ja zu dem 4*20 LCD angeboten wurde durchgeschaut mit der Hardware verglichen und die Anschlüsse und durchkontaktierungen überprüft!
Auch die Pc0 bis PC7 lasssen sich einzeln ansteuern also nun weiß ich auch nicht weiter!(habe zusätzlich die freien Daatenleitungen auf GND gesetzt!)

Wenn ich jetzt zum Beispiel das c-Programm abspeichere und dann auf make all gehe, erstellt er mir keine neue HEX Datei weil irgend etwas faul ist!Dieser C-Umgebung zeigt aber auch keine Fehler oder so wie man das von normalen C_compilern kennt die dann am Rand nen Fehler anzeigen!

Grüße Stephan


EDIT: Jetzt kompiliert alles ich bekomme auch eine neue Hex-Datei , aber immer noch schwarze Kästen!! hat an eine slash gelegen der einzeln in der Gegend rumstand! Komisches Programm!!!???

radbruch
10.02.2011, 18:56
Hallo


habe zusätzlich die freien Daatenleitungen auf GND gesetztDas würde ich nicht machen. Wenn das LCD, aus welchen Gründen auch immer, hier etwas ausgeben möchte, knallt´s! Ist eigentlich r/w mit GND verbunden?

Ein 4x20-LCD an meinem RP6 (auch ein Mega32):

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=41805

Der Code (hoffentlich richtig an deine Belegung angepasst):


// LCD 20x4 (LMC-SSC4A20) an den PC0-3, PC5 und PC7 10.2.2011 mic

// 4-Bit-Ansteuerung ohne busy-Abfrage:

// 1 - GND - GND
// 2 - Vcc - Vcc
// 3 - Kontrast (0-0,5V)
// 4 - RS - PC7
// 5 - R/W - GND
// 6 - E - PC5
// 7 - nc
// 8 - nc
// 9 - nc
// 10 - nc
// 11 - Data4 - PC0
// 12 - Data5 - PC1
// 13 - Data6 - PC2
// 14 - Data7 - PC3
// 15 - A - Vcc
// 16 - K - GND

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

#define demospeed 50

#define d4h (PORTC|=1)
#define d4l (PORTC&=~1)
#define d5h (PORTC|=2)
#define d5l (PORTC&=~2)
#define d6h (PORTC|=4)
#define d6l (PORTC&=~4)
#define d7h (PORTC|=8)
#define d7l (PORTC&=~8)
#define eh (PORTC|=32)
#define el (PORTC&=~32)
#define rsh (PORTC|=128)
#define rsl (PORTC&=~128)

void strobe(void)
{
eh;
_delay_ms(1);
el;
}
void lcd_write8(uint8_t wert, uint8_t pause)
{
if(wert & 16) d4h; else d4l;
if(wert & 32) d5h; else d5l;
if(wert & 64) d6h; else d6l;
if(wert & 128) d7h; else d7l;
strobe();
_delay_ms(pause);
}
void lcd_write4(uint8_t wert, uint8_t pause)
{
if(wert & 16) d4h; else d4l; // high nipple
if(wert & 32) d5h; else d5l;
if(wert & 64) d6h; else d6l;
if(wert & 128) d7h; else d7l;
strobe();
_delay_ms(pause);
if(wert & 1) d4h; else d4l; // low nipple
if(wert & 2) d5h; else d5l;
if(wert & 4) d6h; else d6l;
if(wert & 8) d7h; else d7l;
strobe();
_delay_ms(pause);
}
void lcd_cls(void)
{
rsl;
lcd_write4(1,2);
rsh;
}
void lcd_locate(uint8_t x, uint8_t y)
{
rsl;
switch (y) {
case 0: lcd_write4(0x80+x, 40); break; // 0. Zeile
case 1: lcd_write4(0xc0+x, 40); break; // 1. Zeile
case 2: lcd_write4(0x94+x, 40); break; // 2. Zeile
case 3: lcd_write4(0xd4+x, 40); break; // 3. Zeile
}
rsh;
}
void lcd_writeChar(uint8_t zeichen)
{
lcd_write4(zeichen,1);
}
void lcd_writeString(char *string)
{
while(*string)
lcd_writeChar(*string++);
}
void lcd_init(void)
{
DDRC |= 0b10101111;
PORTC &= ~0b10101111;

rsl;
_delay_ms(100);
lcd_write8(0b00100000,100); // Function Set: 4bit-Modus starten
lcd_write4(0b00101000,40); // Function Set: 2 Zeilen, Font 0 (0010NFxx)
lcd_write4(0b00000001,40); // Display Clear
lcd_write4(0b00000110,40); // Entry Mode Set: inc, no shift
lcd_write4(0b00001100,40); // Display On and Cursor
//lcd_write4(0b00001111,40); // Display On and Cursor
rsh;
_delay_ms(1);
}
int main(void)
{
uint8_t i; // Hilfsvariable
lcd_init(); // lcd initialisieren

lcd_cls(); // Display löschen
lcd_locate(0,0); // Schreibpositon festlegen
for(i=0; i<20; i++) {lcd_writeChar('*'); _delay_ms(demospeed); }
lcd_locate(0,1);
for(i=0; i<20; i++) {lcd_writeChar('a'+i); _delay_ms(demospeed/2); }
lcd_locate(0,2);
for(i=0; i<20; i++) {lcd_writeChar('A'+i); _delay_ms(demospeed/3); }
lcd_locate(0,3);
for(i=0; i<10; i++) {lcd_writeChar('0'+i); _delay_ms(demospeed/4); }
for(i=0; i<10; i++) {lcd_writeChar('0'+i); _delay_ms(demospeed/4); }

_delay_ms(2000);
lcd_cls();
lcd_locate(2,0);
lcd_writeString("RP6 ROBOT SYSTEM");
lcd_locate(0,2);
lcd_writeString("LC-Display an LED1-6");
lcd_locate(9,3);
lcd_writeString("16.7.08 mic");

while(1){
}
return 0;
}

Vielleicht hilf dir das?

btw. verwende ich fünf der sechs Datenleitungen gleichzeitig auch zum Einlesen von fünf Tastern ;)

Poste mal dein aktuelles Programm... (bitte in Code-Tags)

Gruß

mic

masterx
10.02.2011, 21:27
So, erstmal vielen Dank an alle die mir hier weitergeholfen haben!
Ich habe einfach mal die letzten drei Stunden einen Temperatursensor gebaut also Zeitvertreib und dann habe ich mir gedacht das ich den RW Port einfach mal softwaremäßig auf 0 setze und den ganzen LCD-Port auf Ausgang und nun steht da TEST und in der nächsten Zeile Hello World ....
Ihr habt das bestimmt schon öfter gesehen aber ich habe gerade Mondlandungsfeeling!

Vielen Dank nochmal und viele Grüße Stephan