Hallo Forum,
ich muss schon sagen *leider* habe ich wieder ein nerviges Problem, und somit *leider* wieder eine kniffelige Frage für euch
Kurzes Intro:
ATMega32
avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
Okay, was nun passiert ist:
ich habe eine Globale Variable des Typs uint8_t Data.TRX_Indexer.
Zum Start des Programms lasse ich mein Board initialisieren. Dort wird auch der UART initialisiert. Dazu benutze ich die Funktionen von P. Fleury:
Code:
void avrboard_init(){
...
Data.TRX_Indexer = 0;
...
uart_init( UART_BAUD_SELECT_DOUBLE_SPEED(UART_BAUD_RATE,F_CPU) );
... jede Menge anderes Gelump...
}
Danach wird der UART sozusagen von mir freigeschaltet.
Code:
void rs232_open() {
//alle unwichtigen interrupts beenden
led_busy_on();
RS232.Open=1;
Menue.Hold=1;
lcd_clr_scrollbar();
keypad_close();
lcd_clrscr();
lcd_puts("RS232: Verbinden");
rs232_puts("CON;ping?");
RS232.rtys=0;
RS232.Timeout=0;
return;
// ab jetzt eingehende Signale interpretieren
}
Wenn der Aufruf von rs232_open() fertig ist prüfe ich den Wert meiner Data.TRX_Indexer-Variablen in der Main.
Code:
int main(void)
{
avrboard_init();
rs232_open();
// TESTBLOCK START
lcd_clrscr();
lcd_puts("PC Autodetect");
lcd_gotoxy(0,1);
lcd_puts("RS232<->PC"); //10 chars
char puffer[33];
itoa(Data.TRX_Indexer, puffer, 10);
lcd_clrscr();
lcd_puts(puffer);
led_error_on(); for(;;);
//TESTBLOCK ENDE
... all das darunter wird nicht mehr ausgeführt
}
Und siehe da, obwohl ich die Variable mit 0 initialisiert habe (in der avrboard_init()) , hat sie auf einmal den Wert 7! Wieso 7?
Wenn ich den Quelltext innerhalb von TESTBLOCK START und TESTBLOCK ENDE an das Ende der Funktion rs232_open() setze, erhalte ich in der Data.TRX_Indexer den Wert 0, wie ich es auch erwarte.
Code:
void rs232_open() {
//alle unwichtigen interrupts beenden
led_busy_on();
RS232.Open=1;
Menue.Hold=1;
lcd_clr_scrollbar();
keypad_close();
lcd_clrscr();
lcd_puts("RS232: Verbinden");
rs232_puts("CON;ping?");
RS232.rtys=0;
RS232.Timeout=0;
// TESTBLOCK START
lcd_clrscr();
lcd_puts("PC Autodetect");
lcd_gotoxy(0,1);
lcd_puts("RS232<->PC"); //10 chars
char puffer[33];
itoa(Data.TRX_Indexer, puffer, 10);
lcd_clrscr();
lcd_puts(puffer);
led_error_on(); for(;;);
//TESTBLOCK ENDE
return;
}
Kann mir das jemand erklären, warum mir die Data.TRX_Indexer nach dem Aufruf von rs232_open() mit 7 überschrieben wird, nicht aber innerhalb der Funtkion?
Ihr werdet euch sicher fragen, wieso im Testbereich diese sache mit dem PC-Autodetect etc. steht. Tja, mir ist aufgefallen, wenn ich in der 2. Zeile des Displays nur ein Zeichen weniger anzeigen lasse (z.B. lcd_puts("RS232<->P");//9 chars), dann erhalte ich auch den Wert 0 in meiner Data.TRX_Indexer. Mein Display hat aber 2*16 Zeichen, das umfasst es eigentlich locker.
Bin auf eure Ideen gespannt, ich habe nämlich absolut keinen Schimmer mehr, wie ich weiter machen soll...
Viele Grüße und gute Nacht,
Simon
Lesezeichen