Forum: Mikrocontroller und Digitale Elektronik Attiny9 TPI, Doppelbelegung von Pins


von Tycho B. (asellus)


Angehängte Dateien:

Lesenswert?

Hallo Allerseits,

Der Attiny9 (4,5,10) hat nur 6 Pins, 3 davon werden für 
TPI-Programmierschnittstelle benötigt + 2 Pins für Versorgung. In der 
Atmel AVR918 AppNote wird beschrieben, wie man die Pins trotzdem nutzen 
kann. Dazu werden zwischen uC und Applikation Widerstände eingesetzt, 
damit der Programmer die Applikationspegel überschreiben kann.

Leider funktioniert es so bei mir nicht. Ich habe die Schaltung soweit 
reduziert, dass ich nur den Atmel-ICE an den uC angeschlossen habe. So 
kann ich die Device Signature auslesen, die Verbindung funktioniert 
also. Wenn ich aber an Pin 1 einen externen Pegel anlege, auch über 
einen Widerstand, dann funktionert nichts mehr. Einfachheithalber habe 
ich Pin 1 (TPI Data) mit 20kOhm an Masse gelegt. Den Pegel zu 
überstimmen ist eigentlich ein Leichtes, es funktioniert trotzdem nicht. 
Wenn ich 20k an VCC lege, dan läuft es wieder.

Es scheint, dass der Atmel-ICE open collector Ausgänge hat und keine 
push-pull. Damit klappt doch die Entkopplung nicht mehr, oder? Wenn ich 
einen Pull-Up für ICE am Pin 1 installere und z.B. einen Schmitt-Trigger 
über einen Widerstand am uC einlese, und der Schmitt-Trigger-Ausgang 
gerade LOW ist, dann muss ich den Pull-Up so dimensionieren, dass uC 
HIGH interpretiert und ICE den LOW ziehen kann. Ohne ICE, also im 
Normaleinsatz, wird der Pin durch Pull-Up nun immer HIGH sehen, egal was 
der Schmitt-Trigger macht.

Wie kann man nun die uC-Pins fürs TPI-Programmieren UND für die 
Applikation nutzen?

von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

vielleicht kannste das vom ISP übernehmen. Die "PA" Leitungen gehen 
weiter in die Schaltung. Die "ISP" Leitungen gehen zum ISP 
Programmierstecker. Mittels Resetsignal erfolgt die Umschaltung 
automatisch.

von Benedikt M. (bmuessig)


Lesenswert?

Veit D. schrieb:
> Mittels Resetsignal erfolgt die Umschaltung
> automatisch.

Für einen ATtiny9 ist das aber ein Overkill. Wenn man nur drei bis vier 
I/O Pins benötigt, aber dann einen Mux-IC einbaut, hat man keinen Platz 
gewonnen. Da würde sich ein größerer ATtiny dann eher anbieten.

von Tycho B. (asellus)


Lesenswert?

Benedikt M. schrieb:
> Veit D. schrieb:
>> Mittels Resetsignal erfolgt die Umschaltung
>> automatisch.
>
> Für einen ATtiny9 ist das aber ein Overkill. Wenn man nur drei bis vier
> I/O Pins benötigt, aber dann einen Mux-IC einbaut, hat man keinen Platz
> gewonnen. Da würde sich ein größerer ATtiny dann eher anbieten.

Danke an Veit, aber genau so ist es. Ich wollte den Attiny9 benutzen, 
weil ich Platz sparen wollte und seine Funktionalität mir voll 
ausreicht.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

hmmm okay, Platzproblem, dann schlage ich einen 8 Pin ATtiny212 vor der 
wird mittels UPDI programmiert. Dafür wird kannste deinen ICE nehmen 
oder einen Widerstand und Python.

von Tycho B. (asellus)


Lesenswert?

Veit D. schrieb:
> Hallo,
>
> hmmm okay, Platzproblem, dann schlage ich einen 8 Pin ATtiny212 vor der
> wird mittels UPDI programmiert. Dafür wird kannste deinen ICE nehmen
> oder einen Widerstand und Python.

Ja, das ist immer eine Option.
Aber bezogen auf die Eingangsfrage heisst das, dass es nicht geht?

Oder es geht so: ich baue eine Zwischenschaltung für den ICE, die aus 
seinen open collector-Ausgängen push-pull macht?

von Benedikt M. (bmuessig)


Lesenswert?

Tycho B. schrieb:
> Oder es geht so: ich baue eine Zwischenschaltung für den ICE, die aus
> seinen open collector-Ausgängen push-pull macht?

Hast Du verifiziert, dass der ATtiny bei der TPI-Übertragung die Pins 
mit Pull-Up versieht?

von Tycho B. (asellus)


Lesenswert?

Benedikt M. schrieb:
> Tycho B. schrieb:
>> Oder es geht so: ich baue eine Zwischenschaltung für den ICE, die aus
>> seinen open collector-Ausgängen push-pull macht?
>
> Hast Du verifiziert, dass der ATtiny bei der TPI-Übertragung die Pins
> mit Pull-Up versieht?

Ich weiss nicht genau wie ich das nachmessen soll. Ich habe keinen Oszi 
zuhause. Wenn ich nur den Programmer ausmesse, also uC abgestöpselt, 
dann sehe ich mit Multimeter am Reset 4,6V 103uA, CLK 4,6V 103uA und 
Data 3,8V 5uA gegen Masse. 4,9V sind von einer externen Spannungsquelle 
auch dran.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

wenn der ICE mit dem ATiny direkt verbunden ist klappt alles?
Das was an Schaltung angeschlossen ist darf während der Programmierung 
nicht aktiv sein. Was hängt da dran? Ansonsten würde ich es einmal mit 
10k Längswiderständen versuchen.

von Tycho B. (asellus)


Lesenswert?

Veit D. schrieb:
> Hallo,
>
> wenn der ICE mit dem ATiny direkt verbunden ist klappt alles?
> Das was an Schaltung angeschlossen ist darf während der Programmierung
> nicht aktiv sein. Was hängt da dran? Ansonsten würde ich es einmal mit
> 10k Längswiderständen versuchen.

Wie geschrieben, da ist ein Schmitt-Trigger dran, und der ist aktiv 
(LOW). Serienwiderstand von 20K hat nichts gebracht.

von Veit D. (devil-elec)


Lesenswert?

Tycho B. schrieb:
> Veit D. schrieb:
>> Hallo,
>>
>> wenn der ICE mit dem ATiny direkt verbunden ist klappt alles?
>> Das was an Schaltung angeschlossen ist darf während der Programmierung
>> nicht aktiv sein. Was hängt da dran? Ansonsten würde ich es einmal mit
>> 10k Längswiderständen versuchen.
>
> Wie geschrieben, da ist ein Schmitt-Trigger dran, und der ist aktiv
> (LOW). Serienwiderstand von 20K hat nichts gebracht.

Der Eingang oder Ausgang vom Schmitt-Trigger?
Wenn es der Eingang ist sollte es gar keine Problem beim flashen geben, 
auch ganz ohne Widerstände. Was die Schaltung während des flashens macht 
ist eine ganz andere Frage.
Wenn es der Ausgang vom Schmitt-Trigger wird ein Widerstand benötigt. 
Nur muss sichergestellt werden das während des Flashens sich der Pegel 
seitens des Schmitt-Triggers nicht ändert.

Der Programmer kann nur einen bestimmten Strom auf den Signalen 
schalten. Deswegen muss zur Schaltung hin ein Widerstand rein, damit der 
Programmer nicht überlastet wird und die Pegel weit genug runter oder 
hoch ziehen kann. Allerdings baut man sich damit einen Spannungsteiler. 
Ich weiß nicht was der ICE für Ströme verkraftet, aber verschiedene 
Werte der Widerstände solltest du nochmal probieren. Bis runter auf 1k 
sollte machbar sein. Weil das flashen sehr schnell geht kommst du mit 
einem Multimeter nicht weit. Du müßtest dann schon die Spannungspegel 
mit Oszi anschauen um beurteilen zu können ob es den unzureichenden 
Pegeln liegt oder doch an etwas anderem.

von Tycho B. (asellus)


Lesenswert?

> Der Eingang oder Ausgang vom Schmitt-Trigger?
Ausgang

> Wenn es der Eingang ist sollte es gar keine Problem beim flashen geben,
> auch ganz ohne Widerstände. Was die Schaltung während des flashens macht
> ist eine ganz andere Frage.
> Wenn es der Ausgang vom Schmitt-Trigger wird ein Widerstand benötigt.
> Nur muss sichergestellt werden das während des Flashens sich der Pegel
> seitens des Schmitt-Triggers nicht ändert.
Pegel des Schmitt-Triggers ändert sich nicht. Ich habe 1k, 4k7 und 20k 
zwischen Schmitt-Trigger Ausgang und TPIData probiert, ohne Erfolg.
>
> Der Programmer kann nur einen bestimmten Strom auf den Signalen
> schalten. Deswegen muss zur Schaltung hin ein Widerstand rein, damit der
> Programmer nicht überlastet wird und die Pegel weit genug runter oder
> hoch ziehen kann. Allerdings baut man sich damit einen Spannungsteiler.
> Ich weiß nicht was der ICE für Ströme verkraftet, aber verschiedene
> Werte der Widerstände solltest du nochmal probieren. Bis runter auf 1k
> sollte machbar sein. Weil das flashen sehr schnell geht kommst du mit
> einem Multimeter nicht weit. Du müßtest dann schon die Spannungspegel
> mit Oszi anschauen um beurteilen zu können ob es den unzureichenden
> Pegeln liegt oder doch an etwas anderem.
Ich habe einen Logikanalysator hier. Die Idee mit push-pull war Quatsch, 
weil Data-Leitung bidirektional verwendet wird, also muss es open 
collector sein.

: Bearbeitet durch User
Beitrag #6299638 wurde vom Autor gelöscht.
von Benedikt M. (bmuessig)


Lesenswert?

Deinen Messungen zufolge sitzen die Pull-Ups im Atmel ICE und bilden den
oberen Teil des Spannungsteilers. Du solltest die Werte der Pull-Ups
bestimmen, um die Serienwiderstände zum Schmitt-Trigger korrekt wählen
zu können.

von Tycho B. (asellus)


Lesenswert?

Benedikt M. schrieb:
> Deinen Messungen zufolge sitzen die Pull-Ups im Atmel ICE und bilden den
> oberen Teil des Spannungsteilers. Du solltest die Werte der Pull-Ups
> bestimmen, um die Serienwiderstände zum Schmitt-Trigger korrekt wählen
> zu können.

Der kleinste Widerstand, bei dem ich programmieren kann, ist 47k.
Mir war im Gedächtnis, dass die Eingangsimpedanz eines Atmel-Pins so ca. 
50k ist(oder war es PullUp?). Damit hätte ich doch 50:50 Spannungsteiler 
für das Nutzsignal und in der Applikation würde ich den 
Schmitt-Trigger-Pegel nicht mehr korrekt erkennen.

Nun habe ich den Programmer abgeklemmt, der uC ist unter Strom. Den 
Pegel des Schmitt-Trigger-Ausgangs habe ich auf 0 und 5V gesetzt. Am 
uC-Pin liegt die volle Spannung an. Es scheint, dass die Pin-Impedanz 
doch viel höher ist.

von DR (Gast)


Lesenswert?

Guck ins Datenblatt. Die Dinger werden in Millionenstückzahlen verbaut, 
du kannst absolut sicher sein, dass die Datenblattangaben über 
Eingangs-/Ausgangsparameter der Pins korrekt sind. Wenn es dann trotzdem 
nicht geht, liegt der Fehler in deiner Software.

von Tycho B. (asellus)


Lesenswert?

DR schrieb:
> Guck ins Datenblatt. Die Dinger werden in Millionenstückzahlen verbaut,
> du kannst absolut sicher sein, dass die Datenblattangaben über
> Eingangs-/Ausgangsparameter der Pins korrekt sind. Wenn es dann trotzdem
> nicht geht, liegt der Fehler in deiner Software.

Isch abe gar keine Software.

Ja, 50k waren die pullups, Inputimpedanz ist mindestens 5M.
Es geht also doch, nur im Gegensatz zu den Werten, die ich im Netz 
gefunden habe (1k, 4k7), muss der serielle Widerstand deutlich größer 
sein.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Tycho B. schrieb:
> Ja, 50k waren die pullups, Inputimpedanz ist mindestens 5M.
> Es geht also doch, nur im Gegensatz zu den Werten, die ich im Netz
> gefunden habe (1k, 4k7), muss der serielle Widerstand deutlich größer
> sein.

Nö, der Pull-Up im Programmieradapter muss entsprechend niederohmig 
sein. 1k ist OK, macht ja gerade mal 3,3mA bei 3,3V.

RTFM. Siehe Datenblatt, Abschnitt 14.3.9 Collision Detection Exception

"The TPIDATA line is driven by a tri-state, push-pull driver with 
internal pull-up. The output driver is always enabled
when a logical zero is sent. When sending successive logical ones, the 
output is only driven actively during the first
clock cycle. After this, the output driver is automatically tri-stated 
and the TPIDATA line is kept high by the internal
pull-up. The output is re-enabled, when the next logical zero is sent."

Eine arg verquere Formulierung für einen Open Collektor Ausgang!

Ergo. Pack einen 1K Pull-Up an TPDATA auf deinem Programmierdadapter 
gegen VCC und alles wird gut, dann reichen auch 10k als 
Entkoppelwiderstand zu externen Ausgängen, die Eingänge vom AVR speisen 
sollen.

von Tycho B. (asellus)


Lesenswert?

Falk B. schrieb:
> Pack einen 1K Pull-Up an TPDATA auf deinem Programmierdadapter
> gegen VCC und alles wird gut, dann reichen auch 10k als
> Entkoppelwiderstand zu externen Ausgängen, die Eingänge vom AVR speisen
> sollen.

Danke für den Vorschlag. Es ist etwas unverständlich, warum Atmel 
einerseits die Möglichkeit des dual use anzeigt, andererseits es mit 
ihrem ICE-Programmer nicht ohne weiteres geht (also im Falle eines 
aktiven Pegels am Port wie bei mir). Sie gehen aber in der Appnote nicht 
auf die Werte der Widerstände ein, die Werte von 1k/4k7 habe ich aus dem 
avrfreaks-Forum. Vielleicht ist 50k normal.

Es ist jedoch so, dass ich nur ungern am Programmer rumlöten würde, nur 
wenn es mit 50k nicht funktioniert.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

die Werte der I/O Pullups vom µC stehen im Complete Datasheet Kapitel 
17.2.
Zudem du nicht rumlöten musst, kannst den vorgeschlagenen Pullup von 
Falk extern anklemmen. Oder gar in dein Layout einbauen. Oder baust dir 
ein zweites Programmierkabel mit Widerstand drin. Oder ... beim 
nächstenmal einen der TinyAVR 1 Serie   :-)   Wünsche erstmal maximale 
Erfolge.

von Tycho B. (asellus)


Lesenswert?

Veit D. schrieb:
> Oder gar in dein Layout einbauen.

Die Pullups im Layout müsste ich dann über nRST aktivieren/deaktivieren, 
weil sonst sie mir ständig die Eingänge übersteuern, oder?

von Falk B. (falk)


Lesenswert?

Tycho B. schrieb:
> Die Pullups im Layout müsste ich dann über nRST aktivieren/deaktivieren,
> weil sonst sie mir ständig die Eingänge übersteuern, oder?

Bau dir einen Zwischenadapter für dein Programmierkabel! Alles andere 
ist Nonsense, denn damit geht der Vorteil der kleinen Baugröße des 
Tiny(!) verloren.

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.