LCD spricht nicht an bei 8MHz

Gast #2933201
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
Angehängte Dateien:
#2933212
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.
Gast #2933215
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.
Gast #2933236
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
#2933492
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren