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.
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
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...
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.
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...
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...
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?