Hallo,
sorry, das ich mich erst jetzt melde, musste den Tag über arbeiten...
ich versuche mal die meisten Fragen zu beantworten:
die Fuses stehen so
1 | avrdude: Device signature = 0x1e9602
|
2 | avrdude: safemode: lfuse reads as E0
|
3 | avrdude: safemode: hfuse reads as 99
|
4 | avrdude: safemode: efuse reads as FD
|
mit dem d in der e-fuse müsste der 103c-mode aus und der watchdog
eigentlich an sein (p293 im Manual)
meine init-routine sieht so aus:
1 | UBRR0H = (unsigned char)(UBRR_VAL>>8);
|
2 | UBRR0L = (unsigned char)UBRR_VAL;
|
3 |
|
4 | UCSR0B = (1<<RXEN0)|(1<<TXEN0);
|
wobei UBBR_VAL so definiert ist
1 | #define F_CPU 14745600UL
|
2 | #define BAUD 115200UL
|
3 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
|
4 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
|
5 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
|
6 |
|
7 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
8 | #error Systematischer Fehler der Baudrate grsser 1% und damit zu hoch!
|
9 | #endif
|
Die Frage nach den Fuses und den Registern sollte hinreichend
beantwortet sein.
Zum Board: siehe hier:
Beitrag "Atmega64 PDI/O und RXD/TXD gleichzeitig"
Zusammenfassend, durch einen Flüchtigkeitsfehler werden PDI/O und
RXD/TXD bei mir doppelt verwendet, das ließ sich beheben, indem ich 4.7k
in die RXD-Leitung gehängt habe.
Das der UART nun grundsätzlich funktioniert sollte hinreichend gezeigt
worden sein. Das selbstständige resetten (Wechselwirkung UART in den
Programmer ???) kann man ausschließen, da das gleiche Problem auch
auftritt, wenn ich den Programmer abziehe
ah, nochwas
1 | void uart_puts (char *s)
|
2 | {
|
3 | uint8_t n = 0;
|
4 | while (*s)
|
5 | { /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
|
6 | //uart_putc(*s);
|
7 | uart_putc(s[n]);
|
8 | s++;
|
9 | }
|
10 | uart_putc('X');
|
11 | }
|
liefert mir immnoch die selbe Ausgabe. Laienhaft ausgedrückt, es scheint
als zeit ein Pointer ins Nirvana und der Programmcode fängt wieder von
vorn an. Ist das ein gcc-bug?
Schorsch