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:
Klicke auf die Grafik für eine größere Ansicht

Name:	plan.jpg
Hits:	13
Größe:	47,9 KB
ID:	26409

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;
}