Forum: Mikrocontroller und Digitale Elektronik LCD spricht nicht an bei 8MHz


von Sandro (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, ich hoffe mir kann hier geholfen werden.

Habe mir eine lcd.h erstellt. Diese funktioniert auch einwandfrei bei 
1MHz CPU Takt. Die strings werden an der richtigen Positin ausgegeben.

Nun zu meinem Problem...wenn ich den CPU Takt erhöhe ( ab 1MHz 
aufwärts)werden die strings nicht mehr ordentlich auf dem Display 
angezeigt. Meist wird dann nur ein Zeichen angezeigt.

Getestet habe ich es mit einem Atmega32 und Atmega8.

Wo liegt der Fehler?

Gruß Sandro

von Georg G. (df2au)


Lesenswert?

Versuch doch mal, das Busybit wirklich zu lesen und nicht nur Zeit zu 
verbraten. Kleiner Tip: Das E-Signal ist wichtig.

von Karl H. (kbuchegg)


Lesenswert?

Das hier
1
void _nop_zeit()
2
{
3
  LCD_control |= (1<<enable);                  //enable wird auf 1 gelegt
4
  asm volatile ("nop");                    //Zeitverzögerung jeh um einen Taktzyklus
5
  asm volatile ("nop");
6
  LCD_control &=~(1<<enable);                  //enable = 0;
7
}

ist ziemlich brutal. Und bei schnelleren Taktfrequenzen reicht dann eben 
die Verzögerung nicht. Denn hier hast du ja keine konstanten Zeiten ... 
das bischen Verzögerung wird mit steigender Taktfrequenz kürzer.

von spontan (Gast)


Lesenswert?

Ist doch wohl klassisch der Fall von falschem Timing des LCD.

Schau mal ins Datenblatt welches Timing eingehalten werden muß.
Schau was die Software macht.
Anpassen des Timings an die höhere Prozessorgeschwindigkeit. Fertig.

von Sandro (Gast)


Lesenswert?

Da in die Richtung habe ich es schon vermutet.
Sollte ich " asm volatile ("nop");" durch eine konstante Zeit ersetzen?

Sorry Georg, ich verstehe nicht was du mit E-Signal meinst.

Gruß Sandro

von Sandro (Gast)


Lesenswert?

Habs mal durch eine konstante Zeit ersetzt und siehe da....es 
funktioniert :)

Vielen Dank!!

von spess53 (Gast)


Lesenswert?

Hi

>ist ziemlich brutal.

Nö. Die H-Zeit für E ist beim 44780 mit minimal 230ns angegeben. 2xNOP 
bei 8MHz sind 250ns. Dazu kommt noch mindesten ein Assemblerbefehl aus

LCD_control &=~(1<<enable);

Also daran kann es nicht liegen.

MfG Spess

von Georg G. (df2au)


Lesenswert?

Sandro schrieb:
> Sorry Georg, ich verstehe nicht was du mit E-Signal meinst.

Zu dem Zeitpunkt, an dem du das Statusbit liest, ist E schon wieder auf 
0.
Ablauf: E auf 1 setzen, etwas warten, Status lesen, E wieder auf 0. Der 
Status ist nur gültig, wenn E aktiv ist.

Noch ein Tip: Bei manchen Compilern geht eine Bitabfrage auf ">=" in die 
Beinkleider. int8_t und uint8_t geht da munter durcheinander. Sicherer 
ist in jedem Fall ein direkte Abfrage wie "if (status & 0x80)" ...

Dass es mit festen Zeiten nun funktioniert ist auch schnell erklärt: Du 
wartest immer lange genug. Das geht so lange, bis du ein Exemplar 
erwischt, das 50ms und mehr für einen Befehl braucht (gibt es auch, die 
Controller haben zwar alle den gleichen Namen, sind aber nur sehr 
begrenzt kompatibel - wenn man wie du das Datenblatt locker auslegt).

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.