Problem mit Funktionsaufrufen
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
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm, also ich könnte die Menüheader posten. Aber ich sage gleich: die sieht extrem s chei sse aus, erstmal ewig lang und viel zu kompliziert. Ich kann sie einbinden und sie funktioniert auch. Nur, was mich eben so verrückt macht: die header ist zwar eingebunden, aber ich habe die funktionen darin noch überhaupt nicht aufgerufen und mein Programm stürzt ab.
Hier dennoch die header im Anhang.
Für alle ineteressierten: das ganze handelt sich um ein Projekt für die Naturwissenschaftliche Informatik an der Uni.
vG Simon