Forum: Mikrocontroller und Digitale Elektronik AVR ATmega16: disable JTAG per Software


von sebastians (Gast)


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

von sebastians (Gast)


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

von spess53 (Gast)


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

von sebastians (Gast)


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.

von spess53 (Gast)


Lesenswert?

Hi

>so wie in dem Code-Ausschnitt.

Ob das richtig ist, kann ich dir leider nicht sagen. Aber für mich ein 
weiterer Grund bei Assembler zu bleiben.

MfG Spess

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

spess53 schrieb:
> Aber für mich ein
> weiterer Grund bei Assembler zu bleiben.

:-)

von Karl H. (kbuchegg)


Lesenswert?

Was ist falsch an
1
   cli();
2
   MCUCR |= ( 1 << JTD );
3
   MCUCR |= ( 1 << JTD );
4
   sei();

Ob man cli bzw sei braucht, muss man selbst entscheiden. Der cli selber 
ist harmlos, aber der sei könnte je nachdem wie es weiter geht zu früh 
sein.

von sebastians (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.