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
Lesezeichen