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
Versuch doch mal, das Busybit wirklich zu lesen und nicht nur Zeit zu verbraten. Kleiner Tip: Das E-Signal ist wichtig.
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.
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.
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
Habs mal durch eine konstante Zeit ersetzt und siehe da....es funktioniert :) Vielen Dank!!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.