mikrocontroller.net

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


Autor: sebastians (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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):
/* from http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=56140&start=0 */
#define jtd_set(x) \
{ \
        __asm__ __volatile__ ( \
                "in __tmp_reg__,__SREG__" "\n\t" \
                "cli" "\n\t" \
                "out %1, %0" "\n\t" \
                "out __SREG__, __tmp_reg__" "\n\t"\
                "out %1, %0" "\n\t" \
                : /* no outputs */ \
                : "r" ((uint8_t)(x ? (1<<JTD) : 0)), \
                  "M" (_SFR_IO_ADDR(MCUCR)) \
                : "r0"); \
}
void disable_JTAG(void)
{
    jtd_set(true);
}

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

Autor: sebastians (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: sebastians (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

:-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist falsch an
   cli();
   MCUCR |= ( 1 << JTD );
   MCUCR |= ( 1 << JTD );
   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.

Autor: sebastians (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.