Forum: Mikrocontroller und Digitale Elektronik 2 AVRs 1 ISP wie schalten?


von Gerald (Gast)


Lesenswert?

Hallo Ihr Klugen Menschen,

ich habe gerade geschlagene zwei Stunden nach der richtigen Doku 
gesucht, wo das beschrieben ist, was ich brauche, aber nicht mehr 
gefunden. Vor ein paar Jahren bin ich mal drüber gestolpert (ich glaube 
sogar hier im Forum), aber wenn man's dann später mal braucht ...

Ich bastle gerade eine Platine mit 2 AVR-Tinys drauf (ein 4313 und ein 
861), sowie einem ISP-Steckerchen, über das ich die beiden Dinger 
programmieren will. Aber natürlich immer nur einen von den Beiden, nicht 
beide gleichzeitig. Welcher gerade dran ist, will ich mit einem Jumper 
auswählen.

Wie verschalte ich den ISP-Stecker und die MOSI/MISO/RESET/SCK-Pins mit 
diesem Jumper jetzt am Besten, so dass der gerade nicht zu 
programmierende weder stört noch aus Versehen gelöscht wird?

Es gibt mehrere Möglichkeiten, eine davon wäre natürlich zwei getrennte 
ISP-Stecker, was ich aber unelegant finde. Es gibt auch - wenn ich mich 
richtig erinnere - von Atmel eine PDF-Datei mit einem "HowTo", aber eben 
... das Internet ist groß, verdammt groß, und eine einzelne PDF ist da 
die berühmte Stecknadel im Heuhaufen.

Hat jemand von Euch diese Information gerade mal kurz parat?

Vielen Dank.

Gerald.

von R. M. (Gast)


Lesenswert?

Ob dein Vorhaben mit geringem Aufwand möglich ist, hängt davon ab, 
welche Funktion die ISP-Pins der beiden Controller in deiner Schaltung 
haben.
Im unwahrscheinlichsten Falle, nämlich das sie nicht für etwas Anderes 
genutzt werden und sich hochohmig verhalten (Eingang), brauchst du nur 
eine Umschaltmöglichkeit (Jumper) für den Resetanschluss. Der mit nicht 
aktivem Reset, wird weiter sein Programm abarbeiten. Ist natürlich 
Verschwendung von Ressourcen, gerade bei Tinys. Wenn die Pins genutzt 
werden sollen, dürfen sie nur bei aktivem Reset zum ISP durchgeschaltet 
werden. Könnte man mit Analogsignalschaltern a la 4066 machen. Das macht 
dann aber die Platzersparnis gleich wieder zunichte - schade!
mfG

von c-hater (Gast)


Lesenswert?

Gerald schrieb:

> Ich bastle gerade eine Platine mit 2 AVR-Tinys drauf (ein 4313 und ein
> 861), sowie einem ISP-Steckerchen, über das ich die beiden Dinger
> programmieren will. Aber natürlich immer nur einen von den Beiden, nicht
> beide gleichzeitig. Welcher gerade dran ist, will ich mit einem Jumper
> auswählen.
>
> Wie verschalte ich den ISP-Stecker und die MOSI/MISO/RESET/SCK-Pins mit
> diesem Jumper jetzt am Besten, so dass der gerade nicht zu
> programmierende weder stört noch aus Versehen gelöscht wird?

Die Umschaltung kann (unter gewissen Randbedingungen) einfach über das 
Reset-Signal vom ISP-Stecker erfolgen. Das kannst du per Jumper entweder 
an den einen oder an den anderen µC legen. Damit ist erstmal 
sichergestellt, dass du nur den wirklich Gemeinten umprogrammierst.

Nun zu den Randbedingungen: So lange an den drei anderen für ISP 
genutzten Pins nix anderes hängt, sollte das schon alles gewesen sein. 
Ansonsten wird es mehr oder weniger kompliziert...

von Gerald (Gast)


Lesenswert?

Oha, da bin ich gleich in die erste Falle hineingelaufen, nämlich nicht 
genau zu erklären, was ich machen will. Hier also ein Nachtrag zum 
Problem.

Die beiden Kleinen auf der Platine warten nämlich darauf, dass sie über 
eben diese Leitungen, die am ISP-Stecker liegen, ihre Befehle bekommen, 
und zwar sind sie beide als I2C-Slaves programmiert. Die Tinys verwenden 
ja für I2C und ISP die gleichen Pins, so dass der 10-polige Stecker im 
Normalfall (also zum Nicht-Programmier-Zeitpunkt) mit einem I2C-Master 
auf einer anderen Platine verbunden wird. MOSI wird zu SDA, und SCK wird 
zu SCL.

Die Möglichkeit, die Reset-Leitung zu jumpern, ist also nicht geeignet, 
weil dann der andere Tiny, der nicht resetet wird, sein Programm weiter 
ablaufen liesse, und dieses Programm würde die ISP-Befehle auf 
MOSI/MISO/SCK als I2C-Befehle interpretieren. Als Folge davon würde er 
womöglich dann bei bestimmten Bytes plötzlich anfangen zu antworten und 
so die weitere Programmierung seines Kollegen stören.

Deswegen scheidet diese Möglichkeit aus. Es müssen irgendwie beide Tinys 
(auch der gerade nicht programmierte) während der Programmierung auf 
passiv geschaltet werden, ohne dass dadurch aber sein Programm 
beschädigt wird. Die Reset-Leitung sollte also an beide ICs verdrahtet 
bleiben, denn genau dazu ist sie ja da: Um den Prozessor passiv zu 
machen.

In der besagten Doku (die ich eben jetzt nicht mehr finde) wurde wohl 
eine andere Leitung gejumpert. Atmel empfiehlt für solche Fälle eine 
bestimmte Methode, die ich aber eben nicht mehr weiß. Rein logisch 
betrachtet, würde ich darauf tippen, dass man die SCK-Leitung auftrennen 
muss, aber ich bin mir eben nicht sicher, und es selbst auszuprobieren 
ist nervig. Deswegen möchte ich diese Doku gerne nochmal nachlesen, oder 
jemanden fragen, der sowas schon gemacht hat.

Vielen Dank

Gerald.

von InFo (Gast)


Lesenswert?


von c-hater (Gast)


Lesenswert?

Gerald schrieb:

> Die Möglichkeit, die Reset-Leitung zu jumpern, ist also nicht geeignet,

OMG...

Natürlich ist sie "geeignet", sie stellt schließlich die einzige 
Möglichkeit dar, um überhaupt zum gewünschten Ergebnis zu kommen...

Sie muss halt noch von weiteren geeigneten Maßnahmen flankiert werden, 
wenn die optimistische Grundbedingung nicht zutrifft, dass die ISP-Pins 
"frei" sind...

von R. M. (Gast)


Lesenswert?

Dann spinne ich mal rum:
SDA (MOSI) und SCL (SCK) sind durchverbunden für I2C und ISP
MISO müsste auch durchverbunden sein, für ISP
Falls die MISO-Schiene nicht für was Anderes gebraucht wird, könnte man 
sie zu "Friedenszeiten" mit Pullup gemeinsam hochziehen. In die 
Programme beider Controller kommt ein Pin-Change-Interrupt, der bei 
"Wackeln" an MISO, die I2C hochlegt und den Käfer bis zum nächsten Reset 
in einen sicheren Zustand bringt (blockiert).
Anders wird man die Rückwirkungen auf den Gegenüber nicht vermeiden 
können. Die Strombegrenzungswiderstände aus der AN verhindern ja auch 
nicht das Gewackel, wenn die Gegenseite auf "Hören" steht und die Sache 
missversteht.
Könnte vielleicht klappen...

von Bernd (Gast)


Lesenswert?

Noch ne andere Idee: Wie wäre es damit die SCK Leitung zu jumpern?

Die RST Leitung geht an beide Controller und hält beide während dem 
Programmieren im Reset. Da die SCK Leitung nur zu einem Controller geht, 
registriert nur dieser die Programmierbefehle. Der andere Controller 
sollte keine Befehle sehen, weil er keinen Takt hat.

Übersehe ich was?

von Flau (Gast)


Lesenswert?

Ja, den Beitrag von InFo (Verweis auf Atmel AppNote AVR042, Punkt 
4.1.1).
Dort wird genau das vorgeschlagen. Vielen Dank an InFo.

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.