Hi Community,

ich habe ein Problem mit einer If-Schleife in meinem Code:

Die Bedingung ist erfüllt, aber der Code der in der If-Schleife steht wird einfach nicht ausgeführt.

Die IF-Schleife ist ganz am Ende des Codes.

Code:
/*
 * main.c
 *
 *  
 *     
 */

#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU       2048000UL

#define BAUD        9600UL
#define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)

#define LED_DDR		DDRD
#define LED_PORT	PORTD
#define LED_PORTPIN	PD7

volatile unsigned int Zaehlerstand;

volatile struct sek										//vereinbart eine neue struktur vom Typ sek
	{
	unsigned char bit;									//ist entweder 1 oder 0 - Bit für die Sekunde ist gesetzt oder auch nicht
	unsigned char wert;									//zeigt an welche Information über das Bit verschlüsselt ist
	};

volatile struct sek sekunde[60];						//erzeugt ein Feld aus 60 Variablensätzen die wie in sek definiert organisiert sind

volatile unsigned char counter , start;					//counter zeigt an welche die aktuelle Sekunde ist


void uart_init(void)
{
    // Baudrate einstellen (Normaler Modus)
    UBRRH = (uint8_t) (UBRR_BAUD>>8);
    UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);

    // Aktivieren von receiver und transmitter
    UCSRB = (1<<RXEN)|(1<<TXEN);

    // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

void struct_init(void)
{
	while ( !( UCSRA & (1<<UDRE)) );					// Warten bis der Sendepuffer frei ist
	UDR = '!';											// Daten in den Puffer schreiben und damit senden


	sekunde[21].wert = 1;								//Sekunde 21-27 verschlüsselt die Minute
	sekunde[22].wert = 2;
	sekunde[23].wert = 4;
	sekunde[24].wert = 8;
	sekunde[25].wert = 10;
	sekunde[26].wert = 20;
	sekunde[27].wert = 40;								//

	sekunde[29].wert = 1;								//Sekunde 29-34 verschlüsselt die Stunde
	sekunde[30].wert = 2;
	sekunde[31].wert = 4;
	sekunde[32].wert = 8;
	sekunde[33].wert = 10;
	sekunde[34].wert = 20;								//
}


ISR (INT1_vect)
{
	LED_PORT |= (1<<LED_PORTPIN);

	Zaehlerstand = TCNT1;								//den aktuellen Zaehlerstand auslesen

	TCNT1 = 0;											//den Zaehlerstand zuruecksetzen

	if (Zaehlerstand >= 1000)							//die Zeit zwischen zwei Low-Pegeln wurde gemessen
		{
			if (Zaehlerstand >= 3400)					//die Pause vor der nächsten Minute wurde gemessen
				{
				counter = 0;							//counter wird resetet

				start++;

				while ( !( UCSRA & (1<<UDRE)) );					// Warten bis der Sendepuffer frei ist
				UDR = '?';											// Daten in den Puffer schreiben und damit senden

				while ( !( UCSRA & (1<<UDRE)) );					// Warten bis der Sendepuffer frei ist
				UDR = start;											// Daten in den Puffer schreiben und damit senden

				while ( !( UCSRA & (1<<UDRE)) );		// Warten bis der Sendepuffer frei ist

				UDR = '2';								// Daten in den Puffer schreiben und damit senden
				}
		}
	else												//die Zeit eines Low-Pegel wurde gemessen
		{
			if (Zaehlerstand >= 300)					//Low-Pegel > 150ms -> 1
				{
					sekunde[counter].bit = 1;			//setzt in der aktuellen Sekunde das Bit auf 1

					counter = counter + 1;				//stellt counter auf die nächste Sekunde

					while ( !( UCSRA & (1<<UDRE)) );	// Warten bis der Sendepuffer frei ist

					UDR = '1';							// Daten in den Puffer schreiben und damit senden
				}
			else										//Low-Pegel < 150ms -> 0
				{
					sekunde[counter].bit = 0;			//setzt in der aktuellen Sekunde das Bit auf 0

					counter = counter + 1;				//stellt counter auf die nächste sekunde

					while ( !( UCSRA & (1<<UDRE)) );	// Warten bis der Sendepuffer frei ist

					UDR = '0';							// Daten in den Puffer schreiben und damit senden
				}
		}
}

void auswertung(void)
{
	unsigned char i;
	unsigned char minute = 0;
	unsigned char stunde = 0;

	LED_PORT &= ~ (1<<LED_PORTPIN);

	while ( !( UCSRA & (1<<UDRE)) );					// Warten bis der Sendepuffer frei ist
	UDR = '3';											// Daten in den Puffer schreiben und damit senden

	start = 1;												// Flag für Auswertung zurückgesetzt

	if ( (sekunde[28].bit == 1) && (sekunde[35].bit == 1) )	//Auswertung nur wenn beide Prüfbits gesetzt
		{
		for (i = 21 ; i <= 27 ; i++)						//Auswertung der Minuten
			{
			if (sekunde[i].bit == 1) minute = ( minute + sekunde[i].wert );
			}
		for (i = 29 ; i <= 34 ; i++)						//Auswertung der Stunden
			{
			if (sekunde[i].bit == 1) stunde = ( stunde + sekunde[i].wert );
			}

		while ( !( UCSRA & (1<<UDRE)) );					// Warten bis der Sendepuffer frei ist
		UDR = minute;											// Daten in den Puffer schreiben und damit senden

		while ( !( UCSRA & (1<<UDRE)) );					// Warten bis der Sendepuffer frei ist
		UDR = stunde;											// Daten in den Puffer schreiben und damit senden
		}
	else													//Prüfbits nicht gesetzt
		{
		while ( !( UCSRA & (1<<UDRE)) );					// Warten bis der Sendepuffer frei ist

		UDR = '!';											// Daten in den Puffer schreiben und damit senden
		}
}



void main(void)
	{
	uart_init();										//UART initialisieren

	struct_init();										//Strukturen initialisieren

	counter = 0;

	start = 0;

	GICR |= (1<<INT1);									//externer Interrupt an INT1 (PD3) aktiviert

	MCUCR |= (0<<ISC11) | (1<<ISC10);					//Interupt bei jeder logische Veränderung an INT1 (PD3)

	TCCR1B |= (1<<CS12) | (1<<CS10);					// Prescaler auf 1024 -> 2.048MHz/1024 -> 2000Hz

	sei();												//Interrupts freischalten

	LED_DDR |= (1<<LED_PORTPIN);						//LED Port als Ausgang

	LED_PORT &= ~ (1<<LED_PORTPIN);						//LED Port auf High -> LED leuchtet


	while(1);
		{
		if (2==start) <================================
			{
			auswertung();
			}
		}
	}
Wie man sieht wird die Variable start im Laufe des Programmes gleich 2.

Das funktioniert auch. Ich habe mir den Wert über RS232 schicken lassen. Aber die IF-Schleife wird nicht ausgeführt.

Hat jemand vielleicht eine Idee woran das liegen könnte?

Ich Programmiere unter Ubuntu mit Eclipse und AVR-Plugin.

Vielen Dank

Knipser