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:
Code:
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(;;);
in der lcd.c von p. fleury
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 */
Mc Jenso:
Richtig erkannt, der Timer 2 wird garnicht erst gestartet. Er wird erst gestartet, wenn ich folgende von mir gebastelte Routine aufrufe:
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;
}
Du siehst, der Überlauf ist eigentlich nicht möglich, weil ich immer einen String mitgebe, wenn der Timer startet.
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:
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(" ");
}
Okay, was mir jetzt erst auffällt: ich beende den Timer2 obwohl er garnicht gestartet ist. Aber das sollte ja nix machen oder?
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 ??!??
Lesezeichen