
Zitat von
Klebwax
Was soll in 500ns (in Worten Nanosekunden) wohl sinnvolles passieren?
Dafür natürlich nicht. Ein Zeichen ausgeben mit einem (oder zwei bei 4bit Anschluss) Strobe auf Enable des LCD kann natürlich in einem Schritt untergebracht werden.
Zwei Postings weiter hat Siro ein __delay_ms(2) - Wartezeit für die Ausführung des LCD Kommandos. Auch wenn hier 100µs ausgereicht hätten - dafür lohnt sich das Multitasking schon mal - wenn der µC parallel noch andere Aufgaben rechnet.
- - - Aktualisiert - - -
meine Schrittkette sieht z.B. so aus:
Code:
if(Tmr8bit250usLcd == 0){
Tmr8bit250usLcd = 4; // Standardtaktung 1ms, kann in der Statemachine überschrieben werden
static int8_t step = 0;
switch(step){
case 0: // Set DDRAM Adresse = 0x00
LCD_TRIS_DATA = 0; // Data Pins to Outputs
LCD_RS = 0; // command
LCD_DATA = 0b10000000;
strobeE();
Tmr8bit250usLcd = 20; // next call 5ms
Idx = 0; // Initilaisiere Zeichenausgabe
step++;
break;
case 1: // 16 Zeichen der Line 1 ausgeben
LCD_RS = 1; // data
LCD_DATA = LCD_line1[Idx];
if (LCD_DATA == 0)
LCD_DATA = ' ';
strobeE();
Idx++; // Nächstes Zeichen der Zeile
if (Idx >= 16) {
Idx = 0;
step++;
}
break;
//usw
mit
Code:
void strobeE(){
LCD_E = 1;
__delay_us(1); // delay 1us
LCD_E = 0;
}
Die Timervariable Tmr8bit250usLcd wird in einem 250µs Timerinterrupt dekrementiert.
Code:
if (Tmr8bit250usLcd != 0)
Tmr8bit250usLcd--;
Ist natürlich nur ein Vorschlag, vielleicht habe ich Siro's Frage auch nur falsch verstanden ...
Lesezeichen