ATMega16 und PORTC / JTAG Fuse

Gast #138979
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
Angehängte Dateien:
Gast #138980
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
Gast #138981
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?
Gast #138982
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
Gast #138983
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
Gast #138985
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.
Gast #138986
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
Gast #138987
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
Angehängte Dateien:
Gast #138988
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
Gast #138990
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
Gast #138991
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

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