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:
Danach wird der UART sozusagen von mir freigeschaltet.Code:void avrboard_init(){ ... Data.TRX_Indexer = 0; ... uart_init( UART_BAUD_SELECT_DOUBLE_SPEED(UART_BAUD_RATE,F_CPU) ); ... jede Menge anderes Gelump... }
Wenn der Aufruf von rs232_open() fertig ist prüfe ich den Wert meiner Data.TRX_Indexer-Variablen in der Main.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 }
Und siehe da, obwohl ich die Variable mit 0 initialisiert habe (in der avrboard_init()) , hat sie auf einmal den Wert 7! Wieso 7?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 }
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.
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?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; }
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







Zitieren

Lesezeichen