Hallo zusammen, mein LCD Display wird gegenwaertig in seinem Ablauf ueber die Zeiten gesteuert, die nach den einzelnen Befehlen abgewartet werden sollen. Soweit funktioniert dass ganze auch. Nun wollte ich diese leidlichen Zeitvorgaben durch die Abfrage des Busyflags an D7 beseitigen aber dass will nicht. Die Bezeichner habe ich als Makros definiert und die sollten, da das ganze ja sonst funktioniert auch passen. Offenbar ist busy immer false. bool LCDbusy() { bool busy; RW_PORT |=(1<<RW_BIT); // enable Bit setzen und wieder loeschen E_PORT|=(1<<E_BIT); E_PORT&=~(1<<E_BIT); // LCD 7 als Input LCD_7_DDR &=~(1<<LCD_7_BIT); if (LCD_7_PIN & (1<<LCD_7_BIT)) { busy=true; } else { busy=false; } // LCD 7 als Output LCD_7_DDR |=(1<<LCD_7_BIT); RW_PORT &=~(1<<RW_BIT); return busy;} Bitte helft mir wieder mal auf die Spruenge
Wenn ich das Programm ueber die serielle Schnittstelle auf den Mikrocontroller flashe, schreibt die LCD was sie soll. Nach Reset oder Stromabschalten bleibt sie stumm. (Atmega 128 auf ChipCon 2420 Board) Eine Idee?
Ach ja: // LCD 7 als Input LCD_7_DDR &=~(1<<LCD_7_BIT); Die Richtung tunlichst vorher setzen. Sonst aktivieren beide die gleiche Leitung und das ist ungesund.
Da verstehe ich nicht ganz was du meinst? Die Richtung habe ich doch vor der Abfrage gesetzt.
Normalzustand: " LCD_7_DDR |=(1<<LCD_7_BIT);" Lesen: " // enable Bit setzen und wieder loeschen E_PORT|=(1<<E_BIT); E_PORT&=~(1<<E_BIT); // LCD 7 als Input LCD_7_DDR &=~(1<<LCD_7_BIT); if (LCD_7_PIN & (1<<LCD_7_BIT)) " In Worten: Controller hat D7 als Ausgang aktiv. E wird aktiviert. LCD aktiviert D7 als Ausgang. E wird deaktiviert und deaktiviert. Controller deaktiviert seinen Ausgang und liest. D.h. zeitweilig treiben LCD und Controller gegeneinander.
Ja, das hast Du recht ... nun, da ich die D7 als Inputanweisung ganz nach oben geschrieben habe, bleibt das System in der busy Abfrage = busy wird niemals low. { bool busy; // LCD 7 als Input LCD_7_DDR &=~(1<<LCD_7_BIT); // RW = Read RW_PORT |=(1<<RW_BIT); // enable Bit setzen E_PORT|=(1<<E_BIT); if (LCD_7_PIN & (1<<LCD_7_BIT)) { busy=true; } else { busy=false; } // enable Bit wieder loeschen E_PORT&=~(1<<E_BIT); // LCD 7 als Output LCD_7_DDR |=(1<<LCD_7_BIT); RW_PORT &=~(1<<RW_BIT); return busy; }
Also bei mir schaut das so aus: ( und funktioniert ) #define LPORT PORTA #define LPIN PINA #define LDDR DDRA #define RW 5 #define EN 6 #define BF 7 ich verwende code vision da kann man per PORT.X=0/1 die bits setzten // Wartet auf BF_flag = 0 -> LCD ready // D7 wird Input EN wird high void wait_bf ( void ) { // RW=1 RS=0 -> Read Mode BF Flag readout D7 // EN ist High && BF Input-Pin ist im pulldown mode LPORT.BF=1 ; LPORT.RW=1 ; LPORT.RS=0 ; LDDR.BF=0 ; LPORT.EN=1 ; // Warten bis LCD BF low -> LCD ready while ( LPIN.BF == 1 ) { } // D7 pin wieder output LCD wieder im write modus LPORT.EN=0 ; LDDR.BF=1 ; LPORT.RW=0 ; } vieleicht hilfts ja was
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.