Hi,
ich habe das Spiel etwas weiter getrieben, bin aber immernoch bei dem gleichen Problem wie zu Beginn. Allerdings Data in myData umzubenennen habe ich noch nicht getestet.
Ich bin jetzt, wie fumir vorgeschlagen hat, vorgegangen. Die 0 direkt zu schreiben, in den Puffer zu schreiben oder in TRX_Idexer zu schreiben macht keinen Unterschied. Ich bekomme immer 0 auf's Display. Sobald ich aber mit Data.TRX_Indexer = 0 über die zeile lcd_pus("PC Autodetect"); komme, erscheint wieder die magische 7.
Das Lustige ist nun, wenn ich in die erste Zeile von lcd_puts Data-TRX_Indexer = 0 schreibe, dann habe ich nach wie vor meine gewollte 0.
Strange,
hier der Beweiscode:
in der Main:
in der lcd.c von p. fleuryCode:int main(void) { avrboard_init(); rs232_open(); lcd_clrscr(); //<- wenn TRX_Indexer = 0 hier steht, dann 7 auf LCD lcd_puts("PC Autodetect"); //wenn hier TRX-Indexer = 0 steht, dann 0 auf LCD 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(;;);
Mc Jenso:Code:void lcd_puts(const char *s) /* print string on lcd (no auto linefeed) */ { // wenn hier Data.TRX_Indexer = 0 steht, dann 0 auf dem LCD register char c; while ( (c = *s++) ) { lcd_putc(c); } // wenn hier Data.TRX_Indexer steht, dann 0 auf dem LCD }/* lcd_puts */
Richtig erkannt, der Timer 2 wird garnicht erst gestartet. Er wird erst gestartet, wenn ich folgende von mir gebastelte Routine aufrufe:
Du siehst, der Überlauf ist eigentlich nicht möglich, weil ich immer einen String mitgebe, wenn der Timer startet.Code:void lcd_clr_scrollbar() { TCCR2 &= ~(1<<CS22); //timer abstellen TCCR2 &= ~(1<<CS21); TCCR2 &= ~(1<<CS20); lcd_gotoxy(0,LCD_SCROLLING_ROW); lcd_puts(" "); } void lcd_scroll_text(char* text, uint16_t Hz, uint8_t delay_factor){ strcpy((char*)LCD_lauftext, text); T2.Counter=delay_factor; T2.Counter_backup=delay_factor; TCCR2|=(1<<CS22)|(1<<CS21)|(1<<CS20); //Prescaler=1024 T2.Preloader=256-F_CPU/LCD_PRESCALER/Hz; TCNT2=T2.Preloader; TIMSK |= (1<<TOIE2); T2.Of=0; Status.LCD_hold=0; }
Abgesehen davon wird die Lauftext-Routine noch nicht aufgerufen, bevor die magische 7 erscheint.
Zur rs232_open:
ist blöd formuliert im Kommentar, die Interrupts werden nicht beendet, sondern die timers. Das geschieht in den Routinen lcd_clr_scrollbar(); und keypad_close();
Die beiden Funktionen sind wie folgt implementiert:
Okay, was mir jetzt erst auffällt: ich beende den Timer2 obwohl er garnicht gestartet ist. Aber das sollte ja nix machen oder?Code:void keypad_close(){ TCCR0 &= ~(1<<CS02); //timer abstellen TCCR0 &= ~(1<<CS01); TCCR0 &= ~(1<<CS00); T0.Preloader=0; } void lcd_clr_scrollbar() { //steht oben schonmal TCCR2 &= ~(1<<CS22); //timer abstellen TCCR2 &= ~(1<<CS21); TCCR2 &= ~(1<<CS20); lcd_gotoxy(0,LCD_SCROLLING_ROW); lcd_puts(" "); }
Was passiert, wenn ich sei() auskommentiere: die Magische 7 verschwindet. Wieso? Verstehe den zusammenhang nicht!
![]()
Vielen Dank für's mitfiebern,
Simon
Nachtrag: mir fällt gerade bei der lcd_clr_scrolling_row auf, dass ich da evtl ein Leerzeichen zu viel reinschreibe!? Aber ist das denn so schlimm!? Wenn ich ein Leerzeichen wegnehme und sei() nicht auskommentiere, ist die magische 7 auch weg ??!??







Zitieren

Lesezeichen