Hallo ich habe ein kleines Projekt das soweit auch gut funktioniert nur eine kleine Sache macht mir mächtig zu schaffen.
Ich habe ein LCD das je nach Ereignis (Betätigung eines Tasters oder öffnen einer Tür) den jeweiligen Text anzeigen soll. Das auslösen bei Tastendruck (Schließer) klappt prima. Leider sind jedoch als „Sensoren“ für die Türen Öffner verbaut sodass im Ruhezustand High und beim öffnen einer Tür Low am Mikrocontroller anliegt. Deshalb habe ich einfach die if Bedingung der Pinabfrage invertiert:
Dies klappt auch soweit und es wird der entsprechende Text angezeigt.Code:if (!(PINC & (1<<PINC1)))
Danach soll aber der Text auch noch solange angezeigt werden wie die Tür geöffnet ist:
Und genau da hapert es der Mikrocontroller scheint die Schleife zu ignorieren und fängt einfach wieder am Anfang an.Code:while(!(PINC & (1<<PINC1)));
Ich hoffe ich konnte mein Problem verständlich schildern und danke schonmal im vorraus für jede Hilfe.
hier der Schaltplan:
Hier der vollständige C-Code:
Code:#define F_CPU 1000000 #include <util/delay.h> #include <avr/io.h> #include <stdio.h> // 1 2 3 4 //Variablendeklaration 12345678901234567890123456789012345678901234567890123456789012345678901234567890 unsigned char lcd_text[]; unsigned char i = 0; void lcd_initialisieren(void); void lcd_text_ausgeben(unsigned char[]); void text(unsigned char); void befehl(unsigned char); //////////////////////////////////////////////////////////////////////////////////////////////////////// void lcd_initialisieren(void) { _delay_ms (1000); befehl(0b00111000);//8Bit, 2Zeilen, 5x7Dot befehl(0b00001100);//Display ein, Cursor aus, blinken aus befehl(0b00000001);//Display löschen befehl(0b00000110);//Cursor auto ++ PORTB |= (1<<PB5);//Hintergrundbeleuchtung aus } void lcd_text_ausgeben(unsigned char lcd_text[]) { i=0; while(lcd_text[i]!=0) { if (i == 20) //Wenn Text länger als 20 Zeichen in 2. Zeile springen { befehl(0b11000000); } if (i == 40) //Wenn Text länger als 40 Zeichen in 3. Zeile springen { befehl(0b10010100); } if (i == 60) //Wenn Text länger als 60 Zeichen in 4. Zeile springen { befehl(0b11010100); } text(lcd_text[i]); i++; } } void text(unsigned char text) { PORTC |= (1<<PC5); PORTC |= (1<<PC4); _delay_ms (10); PORTD = text; PORTC &= ~(1<<PC5); _delay_ms (10); } void befehl(unsigned char befehl) { PORTC |= (1<<PC5); PORTC &= ~(1<<PC4); _delay_ms (10); PORTD = befehl; PORTC &= ~(1<<PC5); _delay_ms (10); } /////////////////////////////////////////////////////////////////////////////////////////////////////// int main(void) { DDRB = 0b00100000; // PortB als Eingang DDRC = 0b11110000; // PortC als Ausgang DDRD = 0b11111111; // PortD als Ausgang lcd_initialisieren(); //Initalisierungroutine aufrufen while(1) { if (PINC & (1<<PINC3)|PINC & (1<<PINC2)) //wenn SOS- oder Infotaste gedrückt wird { PORTB &= ~(1<<PB5);//Hintergrundbeleuchtung an befehl(0b00000001);//Display löschen // 1 2 3 4 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 lcd_text_ausgeben(" Bitte warten please wait "); _delay_ms (5000); befehl(0b00000001);//Display löschen // 1 2 3 4 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 lcd_text_ausgeben(" Bitte singen please speak"); _delay_ms (5000); befehl(0b00000001);//Display löschen PORTB |= (1<<PB5);//Hintergrundbeleuchtung aus } if (!(PINC & (1<<PINC0)))//Wenn Feuerlöschtür geöffnet wird { PORTB &= ~(1<<PB5);//Hinntergrundbeleuchtung an befehl(0b00000001);//Display löschen // 1 2 3 4 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 lcd_text_ausgeben(" Bitte warten please wait "); _delay_ms (5000); befehl(0b00000001);//Display löschen // 1 2 3 4 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 lcd_text_ausgeben(" Bitte sprechen please speak"); _delay_ms (2000); while(!(PINC & (1<<PINC0)));//warten solange Tür geöffnet ist befehl(0b00000001);//Display löschen PORTB |= (1<<PB5);//Hintergrundbeleuchtung aus } if (!(PINC & (1<<PINC1)))//wenn Defitür geöffnet wird { PORTB &= ~(1<<PB5);//Hintergrundbeleuchtung an befehl(0b00000001);//Display löschen // 1 2 3 4 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 lcd_text_ausgeben(" Bitte warten please wait "); _delay_ms (5000); befehl(0b00000001);//Display löschen // 1 2 3 4 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 lcd_text_ausgeben(" Bitte sprechen please speak"); _delay_ms (2000); while(!(PINC & (1<<PINC1)));//warten solange Tür geöffnet ist befehl(0b00000001);//Display löschen PORTB |= (1<<PB5);//Hintergrundbeleuchtung aus } } return 0; }







Zitieren

Lesezeichen