Moin,
ich habe ein Problem mit meiner Wait-Busy Routine. Wenn ich das
Busy-Flag abfragen möchte klappt dies nicht. Ich habe eine
While-Schleife in der ich den enable Pin des LCDs toggeln lasse um somit
das Ding zu aktualisieren.
Aus irgend einem Grund ist das Busy-Flag immer genau dann 0 wenn ich das
Enable Bit auf 1 setze, danach ist es wieder 1, also immer invertiert.
Wenn ich anstelle der While-Schleife eine Warteschleife mache klappt
alles.
Dahe denke ich mal es liegt nur an der Wait-Busy Routine.
Auszug:
1 | #include "lcd.h"
|
2 | #define nop() __asm__ __volatile__("nop"::)
|
3 |
|
4 | /* toggle Enable Pin to initiate write */
|
5 | static void toggle_e(void)
|
6 | {
|
7 | lcd_e_high();
|
8 | nop();
|
9 | nop();
|
10 | nop();
|
11 | nop();
|
12 | nop();
|
13 | lcd_e_low();
|
14 |
|
15 | }
|
16 |
|
17 | .
|
18 | .
|
19 | .
|
20 | /*************************************************************************
|
21 | Warte solange bus LCD nicht mehr busy
|
22 | *************************************************************************/
|
23 | static uint8_t lcd_waitbusy(void)
|
24 |
|
25 | {
|
26 |
|
27 | uint8_t c; //Lesevariable für LCD
|
28 | DDRA = 0; // PORTA als Eingang
|
29 | lcd_rw_high(); // Lesemodus für LCD
|
30 | lcd_rs_low(); // RS = Low ==> Intruction Mode
|
31 | toggle_e();
|
32 | _delay_us(10);
|
33 | c= PINA; // PORTA auslesen
|
34 |
|
35 | while (PINA,PA7)
|
36 | {
|
37 | _delay_us(10);
|
38 | toggle_e();
|
39 | }
|
40 |
|
41 | lcd_rw_low(); // Lesemodus wieder aus => Schreibmodus
|
42 | lcd_rs_high();
|
43 | DDRA = 0b11111111;
|
44 |
|
45 | return (c);
|
46 |
|
47 |
|
48 | }// lcd_waitbusy
|
Das LCD hängt an PORTA, RS = PC7, R/W = PC6 und E = PC5.
Das Busy-Bit geht nie von allein auf 0, habs schonmal ohne das Toggeln
in der Warterschleife probiert, klappt auch nicht.
Ich verwende einen Atmega16 und die aktuelle Version des AVR-Studios und
WinAVR. Optimierung ist OS, Änderungen ändern nichts.
Wo is der Fehler, ich hoffe ich habe Nichts vergessen zu posten.
Gruß Knut