Forum: Mikrocontroller und Digitale Elektronik ATMega16 und PORTC / JTAG Fuse


von Klaus Leidinger (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ATMega Experten,

Ich möchte bei meinem ATMega16 den PortC benutzen. Im Datenblatt und
auch im Forum habe ich gefunden, dass man die JTAGEN Fuse abschalten
muss um die Ports PORTC2 - 5 als normale Portpins benutzen zu können.
Alternativ noch das JTD Flag im MCUCSR setzen.
Ich kriege das anscheinend nicht gebacken...

Fuses sind eingestellt wie im Dateianhang.

Mit folgendem Programm:
.include "m16def.inc"

.org 0x00
; zusätzlich abschalten von JTD in MCUCSR, 2 mal laut Datenblatt)
  ldi r16,(1<<JTD)
  out MCUCSR,r16

  out MCUCSR,r16
  ldi r16,0xff
  out DDRC,r16

  nop
        ldi r16,0b10101010
        out PORTA,r16
; PORTA

  ldi r16,0xff
  out DDRA,r16

  nop

        ldi r16,0b10101010
  out PORTA,r16

endloop:
  rjmp endloop

müssten theoretisch die Ports A und C jeweils abwechselnd 0 und 1
zeigen.

Beide Ports sind auf 0x00, bei PortC sind die JTAG Pins auf 1.

Wenn ich nun bei den Fuses das JTAGEN "Häkchen" setze, geht zumindest
der PortA wie gewünscht, PortC zeigt das gleiche verhalten.

Was habe ich falsch gemacht?

(STK500 Software 2.0 aus der neuesten AVRStudio V4.11 b401), STK500
Hardware ist der hvprog ( http:/www.der-hammer.info/hvprog )

Vielen Dank für Eure Hilfe,
Klaus

von Klaus Leidinger (Gast)


Lesenswert?

Hallo nochmal,

hab gerade gesehen, dass ich bei cut+paste einen Fehler gemacht habe:
Der obere Befehl: out PORTA,r16 muss natürlich out PORTC,r16 heissen
und ist auch so im original Source.

Hab gerade nboch mal ausprobiert bei gesetzten JTAGEN Fuse per JTD Bit
zu disablen, auch dann sind beide Ports "blockiert".

Keiner eine Idee was es sein könnte?

Danke für alle Hinweise,
Klaus

von Thorsten (Gast)


Lesenswert?

Also bei deinem Programm oben wechselt garnichts, denn "rjmp endloop"
ist ne Endlosschleife. Oder hast du da ein Fehler bei Copy&Paste
gemacht? Und muß man bei den ATmegas nicht erst einen Stackpointer
initialisieren?

von Klaus Leidinger (Gast)


Lesenswert?

Hallo Torsten,

die Pins wechseln nicht, es sollte abwechselnd H und L anliegen. (also
Bit0 = H Bit1=0 usw. es wird nur einmal der Port geschrieben.
(out PORTC,r16)

Stackpointer braucht man nur, wenn man rcall oder push nutzen will.
Wenn ich JTAGEN programmiere funktioniert es auch für den PORTA. Nur
eben nicht bei abgeschaltetem JTAGEN.

Bin echt am zweifeln...

Ciao,
Klaus

von Ingo Henze (Gast)


Lesenswert?

Laß doch mal am Anfang diese JTD Geschichte mit dem MCUCSR weg.
Ich habe zwar einen Mega162, aber da hatte es vollkommen gereicht, die
JTAGEN-Fuse auszuschalten (so wie bei dir oben im Bild).
Das
  ldi r16,(1<<JTD)
  out MCUCSR,r16
setzt ja nicht nur JTD auf 1, sondern auch alles andere im dem Register
auf 0. Ich weiß jetzt zwar nicht im einzelnen, was da noch alles für
Bits drin sind, aber könnte daran liegen.

Gruß
Ingo

von Thorsten (Gast)


Lesenswert?

Also im Simulator funktioniert es.

von Tobi (Gast)


Lesenswert?

die anderen bits in mcucsr scheinen irrelevant zu sein.
das das jtagen fuse löschen klappt steht ausser frage bloss mit diesem
jtd flag könnte man jtag dynamisch de/aktivieren, was denk ich mal das
ziel des ganzen ist.

von Klaus Leidinger (Gast)


Lesenswert?

Hallo,
Danke schon mal für die Antworten,
@)Ingo: beim weglassen des "JTG" Codes passiert das gleiche, das mit
dem JTG hab ich probiert, als das mit dem JTAGEN nicht geklappt hatte.

@Torsten: bei mir im Simulator funktioniert es auch (auch wenn man das
JTAGEN bit gar nicht anfasst...) Leider in echt nicht.

@Tobi: Ich zweifle (leider) auch nicht daran, das das normalerweise
funktionieren muss, aber was kann bei mir noch "schief" sein? Vor
allem irritiert mich, das praktisch kein Port mehr funktioniert, wenn
ich das JTAGEN disable. Das an PORTB angeschlossene LCD geht dann auch
nicht mehr (im Originalcode, nicht in dem o.g. Beispiel) An PORT A ist
garnichts angeschlossen, deshalb kann da auch ein Beschaltungsfehler
ausgeschlossen werden.

Hat jemand einen m16 der das beispiel mal ausprobieren könnte?

Ts ts ts,
Klaus

von Thorsten (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habs mal schnell ausprobiert. Hab dein Programm geringfügig
abgeändert, weil ich die toggelden Pins auf dem Scope sehen wollte:

.include "m16def.inc"

.org 0x00

  ldi  r16,(1<<JTD)
  out  MCUCSR,r16

  out  MCUCSR,r16

  ldi  r16,0xff
  out  DDRC,r16

  ldi  r16,0xff
  out  DDRA,r16

  ldi  r16,0b10101010

 loop:
  out  PORTC,r16
  out  PORTA,r16
  com  r16
  rjmp loop

Die Änderungen dürften ja keine Rolle spielen. Jedenfalls toggeln alle
Pins von PORTA und PORTC. Im Anhang meine Fuses. Wenn ich nochwas
testen soll dann sags, hab das gerade hier aufgebaut.

Gruß
Thorsten

von Klaus Leidinger (Gast)


Lesenswert?

Hi Thorsten,

vielen Dank fürs testen, hab gerade die Befürchtung gekriegt, dass es
am Boot reset Vektor liegen könnte, wenn BOOTRST programmiert ist,
springt er ja zuerst zum Bootloader.

Den Fuses entnehme ich, dass Du einen Quart dranhast, hab ich auch und
werde es gleich mit Deiner Einstellung testen. Unterschied ist noich
der bei Dir aktivierte BrownOut.

Ich bin gleich zurück...

Danke nochmal,
Klaus

von Thorsten (Gast)


Lesenswert?

Ja aber bei dir ist der Boot Reset Vector disabled, er dürfte eigentlich
nicht zum Bootloader springen. Ich habe ihn nur enabled, weil ich über
ihn programmiere.

von Klaus Leidinger (Gast)


Lesenswert?

Hallo,

Gotcha! Hab ihn :) Ich glaubs nicht. Es lag an der LCD Beschaltung. Als
ich das LCD abgezogen hatte, um das Board zum Oszi zu bringen ging
alles.

Bei gesetzten JTAGEN hat das nichts ausgemacht. Jetzt werde ich mal
schauen, welcher Pin das war.

Als ich nach dem Brennen das LCD wieder angesteckt habe, ist es weiter
gegangen, bis zum nächsten Reset. Nicht zu vergessen, ohne JTAGEN Bit
geht das komplette LCD...

Ist mir noch ein Rätsel, werd mal die Pins und Spannungen einzeln
messen.

Und wieder was gelernt: im Zweifel immer den Controller ohne externe
Beschaltung prüfen...

Thorsten, und allen anderen vielen Dank für Eure Unterstützung.

Viele Grüsse,
Klaus

von Klaus Leidinger (Gast)


Lesenswert?

Just for the records...

Damit der Thread komplett wird:
Es war ein schluss im Wannenstecker, der nur bei gestecktem Verbinder
aufgetreten ist. (schief aufs Flachkabel gequetscht)
Der Pin PC4 wurde auf + gezogen, was im JTAG Mode offenbar nicht
gestört hat, erst nach dem abschalten.

Das Abschalten des JTAG Modes geht entweder mit der beschriebenen Fuse,
oder durch 2maliges! setzen des JTD Bits im MCUCSR. Das muss direkt
nacheinander passieren (innerhalb 4 Taktzyklen).

Wer die Fuses also nicht brennen will, es geht auch so.

Ciao,
Klaus

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.