> wie kommst du auf 1010?
Weil ich dein Programm analysiert habe !
> while(1)
> {
> if (USART_Receive() == '1')
> {
> PORTB ^= (0<<PB0);
> }
> if (USART_Receive() == '0')
> {
> PORTB ^= (1<<PB0);
> }
> }
Angenommen du schickst die Sequenz 0101
USART_Receive wartet jedesmal bis tatsaechlich ein Zeichen
empfangen wird.
while( 1 )
soweit so gut.
if( USART_Receive() == '1' )
der USART_Receive empfängt das Zeichen (hier solltest
du unbedingt mal das empfangene Zeichen zu Kontrollzwecken
einfach mal wieder ausgeben. Sowas hilft ungemein bei der
Fehlersuche!). Wie auch immer: '0' ist nicht '1', also
passiert nichts.
Das Programm läuft weiter und kommt in den nächsten if:
if( USART_Receive() == '0' )
USART_Receive() wartet wieder auf das nächste Zeichen, das ist ein
'1'. '1' ist aber nicht gleich '0', also passiert wieder nichts.
Die while Schleife fängt von vorne an:
if( USART_Receive() == '1' )
USART_Receive() wartet auf das nächste Zeichen, das ist laut unserer
Eingabe Vereinbarung ein '0'. '0' ist nicht gleich '1', also
passiert nichts.
Weiter gehts:
if( USART_Receive() == '0' )
Als nächstes kommt wieder ein '1'. -> Nichts passiert
und die while Schleife beginnt wieder von vorne.
Mit der Eingabesequenz: 0101 wird also kein einzige der if-
Bedingungen als true angesehen, weil jedesmal das falsche Zeichen
zum falschen Zeitpunkt daherkommt.
Machs so:
unsigned char Received;
while( 1 ) {
Received = USART_Receive();
USART_Send( Received ); // ganz wichgtig zur Kontrolle
// ob Dein Programm auch wirklich
// das empfängt was du glaubst
if( Received == '0' )
PORTB &= ~( 1 << PB0 );
else if( Received == '1' )
PORTB |= ( 1 << PB0 );
}
1) USART_Received wird nur noch 1 mal pro Schleifen-Durchlauf
aufgerufen. Das empfangene Zeichen steht danach allen
if-Abfragen zur Verfügung
2) Und das ist schon fast die wichtigere Änderung:
Geh niemals davon aus, dass schon alles stimmen wird.
Insbesondere: Geh niemals davon aus, dass Input in ein
Programm auch tatsächlich so ausschaut wie du annimmst.
Überprüfe es! In dem Fall heist überprüfen, dass man das
empfangene Zeichen zur Kontrolle auch wieder ausgibt!
Ganz zum Schluss, wenn alles fertig ist, entfernt man diese
Kontrollausgaben wieder. Aber solange ein Programmteil in
der Entwicklung ist, kannst du niemals genug Kontrollen
im Programm haben.