AVR ATmega16: disable JTAG per Software

Gast #1910466
Lesenswert?

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
Gast #1911403
Lesenswert?

Hallo,
ich versuchs mal mit einer schneller zu beantwortenden Frage:
Funktioniert das so prinzipiell nicht (JTD setzen --> Ports als IO 
verwendbar)?
Oder muss ich einfach nur debuggen (rausfinden ob und warum JTD nicht 
gesetzt wird)?
Sebastian
Gast #1911416
Lesenswert?

Hi

Wie hast du es denn versucht?

Datenblatt:

• Bit 7 – JTD: JTAG Interface Disable
When this bit is zero,....
The application software must write this bit to the desired value twice
within four cycles to change its value

MfG Spess
Gast #1911457
Lesenswert?

> Wie hast du es denn versucht?
so wie in dem Code-Ausschnitt.

Wie gesagt, ich habe die Definition von jtd_set nicht verstanden. Aber 
ich bin davon ausgegangen, dass das JTD zweimal innerhalb 4 Zyklen 
setzt.
Gast #1911545
Lesenswert?

> Was ist falsch an
> MCUCR |= ( 1 << JTD );
> MCUCR |= ( 1 << JTD );
Hab ich schon erklärt:
> 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
Meine Web-Recherche hat nämlich ergeben, dass die Optimierungsstufen da 
wichtig sind. Und ich wollte nicht bei der nächsten Compilerversion dumm 
dastehen wenn der Compiler auf einmal anders optimiert als er es jetzt 
tut.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren