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.
Wie man sieht wird die Variable start im Laufe des Programmes gleich 2.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(); } } }
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







Zitieren
Lesezeichen