Hallo,
ich würde gerne die Pins C2-C5 als Digitale Ein-/AUsgabe-Pins verwenden,
aber trotzdem bei Bedarf wieder auf JTAG umschalten können.
Ich hab mir gedacht, ich lege im EEPROM ab, ob nach dem Start JTAG
deaktiviert werden soll. Um JTAG einzuschalten ändere ich diesen Wert im
EEPROM (durch einen speziellen Befehl über die serielle Schnittstelle)
und resette dann den Controller.
Aus dem Datenblatt: "The JTAGEN Fuse must be programmed and the JTD bit
in the I/O Register MCUCSR must be cleared to enable the JTAG Test
Access Port."
Also bin ich davon ausgegangen, dass ich die Fuse nicht umprogrammieren
muss, sondern dass es reicht wenn ich per Software das JTD-Bit setze, um
die Ports als normale IO-Ports zu nutzen.
Da ich nicht darauf vertrauen wollte, dass ich die Compileroptimierungen
richtig eingestellt habe, um JTD in purem C zweimal innerhalb 4 Zyklen
setzen zu können, habe ich folgende Methode versucht (als Black-Box,
ohne den Assembler Code zu verstehen):
1 | /* from http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=56140&start=0 */
|
2 | #define jtd_set(x) \
|
3 | { \
|
4 | __asm__ __volatile__ ( \
|
5 | "in __tmp_reg__,__SREG__" "\n\t" \
|
6 | "cli" "\n\t" \
|
7 | "out %1, %0" "\n\t" \
|
8 | "out __SREG__, __tmp_reg__" "\n\t"\
|
9 | "out %1, %0" "\n\t" \
|
10 | : /* no outputs */ \
|
11 | : "r" ((uint8_t)(x ? (1<<JTD) : 0)), \
|
12 | "M" (_SFR_IO_ADDR(MCUCR)) \
|
13 | : "r0"); \
|
14 | }
|
15 | void disable_JTAG(void)
|
16 | {
|
17 | jtd_set(true);
|
18 | }
|
Leider funktioniert das nicht. Die Pins funktionieren danach nicht als
IO-Pins und JTAG funktioniert weiter.
Weiss jemand, woran das liegt?
Oder besser: Was ich tun muss, um JTAG per Software ein/auszuschalten?
Sebastian