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:
Code:
if (!(PINC & (1<<PINC1)))
Dies klappt auch soweit und es wird der entsprechende Text angezeigt.
Danach soll aber der Text auch noch solange angezeigt werden wie die Tür geöffnet ist:
Code:
while(!(PINC & (1<<PINC1)));
Und genau da hapert es der Mikrocontroller scheint die Schleife zu ignorieren und fängt einfach wieder am Anfang an.
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;
}
Lesezeichen