Forum: Compiler & IDEs ATMega64 JTAG und alle AD Wandler


von Thorsten (Gast)


Lesenswert?

Hallo
Ich brauche Hilfe. Ich programmiere meinen ATMega64 über JTAG und
möchte trotzdem alle 8 AD-Wandler nutzen. Ich setze in meiner Software
den JTD Pin richtig und kann auch nachvollziehen, dass mein JTAG
Interface dann nicht mehr geht. Solls ja auch nicht mehr.
Mein AD Wandler ließt aber immer 5V. Was muss ich mit dem OCDEN Fuse
machen? Kann es mit den internen Pull Up Widerständen was zu tun
haben?
Vielen Dank
Thorsten

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

OCDEN sollte darauf keinen Einfluss haben, da dessen Zustand nur von
Belang ist, solange JTAG aktiviert ist.  Man sollte OCDEN halt nur
abschalten, wenn man's nicht braucht, weil es (durch irgendeinen
Oszillator, der dann ständig läuft) zusätzlichen Stromverbrauch
verursacht.  Die Debugger (AVR Studio, AVaRICE) schalten diese Fuse
sowieso während ihrer Arbeit ein.

Nö, das Problem muss irgendwo in deiner Verdrahtung liegen.  Das JTAG
ICE hast du aber abgezogen, während du messen willst, ja?  Ich weiß
nicht, ob sich das Teil selbst hochohmig schaltet, wärend man es nicht
benutzt.  Beim mkI bin ich mir sogar fast sicher, dass die
Ausgangstreiber stets aktiviert waren.

von Thorsten (Gast)


Lesenswert?

Vielen Dank für Deine Antwort. JTAG ICE war und ist abgezogen. Ich habe
noch mal etwas weiter geforscht.  Um den AD-Wandler vom JTAG Interface
während des Programmierens zu trennen habe ich einen Jumper eingebaut,
damit ich meine AD Eingangsschaltung (Spannungsteiler) vom Pin trennen
kann. Wenn ich den Jumper offen lasse, dann messe ich 5V an ADC4. wenn
ich ADC0-3 offen lasse, messe ich 0V. Damit kann das nicht an der
Vertrahtung liegen Wenn ich den Jumper schließe und keine Spannung an
den Spannungsteiler anlege, dann messe ich 1,7V. Kann es sein, dass da
noch ein Pull Up Widerstand aktiv ist?
Ich verwende folgende Initialisierung für den Port:

  MCUCSR |= (1<<JTD);
  MCUCSR |= (1<<JTD);

  DDRF = 0x00;
  PORTF = 0x00;
und habe es auch schon ohne die PORTF Initialisierung probiert:

  MCUCSR |= (1<<JTD);
  MCUCSR |= (1<<JTD);
Es führt beides zum oben beschriebenen Ergebnis. In der Dokumentation
des ATMega64 steht unter Alternat Functions of PortF, dass folgende
Flags geseetzt werden:

PUOE = JTAGEN (Das muss bei mit auf 1 bleiben, JTAG stelle ich
angeblich über JTD aus)
PUOV = 1 bei ADC4
Kann es sein, dass diese Flags beim setzen von JTD nicht richtig
gelöscht werden?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nö, genau dafür ist JTD doch letztlich da.  Es sollte übrigens

MCUCSR = (1 << JTD);

genügen.

Ich kann's erst heute abend irgendwann nochmal testen und dann
auch nur mit einem ATmega128, aber der sollte sehr ähnlich wie
der ATmega64 sein.

von Thorsten (Gast)


Lesenswert?

Vielen Dank für Deine Hilfe. Ich konnte das Problem nicht grundlegend
lösen. Habe immer noch das Gefühl, dass ein Pull Up existiert. Da ich
nur eine Schwelle mit dem AD-Wandler dedektieren muss, habe ich diese
jetzt angepaßt. Nicht schön, aber reicht.
Besten Dank
Thorsten

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich hab's nun mal probieren können.  Testprogramm im Anhang,
Testobjekt ein ATmega128 in einem STK501.  Port F beschaltet
mit einer Widerstandskaskade von 9 x 4,7 kOhm, PF0 liegt
oberhalb des ersten 4,7 k Widerstands, PF7 unterhalb des
letzten.

Selbst mit angestöpseltem JTAG ICE sind die Messungen OK.

Hier ein Zyklus:

chan 0: 0.689150 V
chan 1: 1.378299 V
chan 2: 2.072336 V
chan 3: 2.771261 V
chan 4: 3.484848 V
chan 5: 3.973607 V
chan 6: 4.315738 V
chan 7: 4.677419 V

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.