Hallo Forum, ich würde gerne zwei AVRs (Tiny und Mega) über einen ISP-Stecker flashen. Folgender Hintergrund: Es gibt eine Leiterplatte mit einem Mega64 mit einem ISP-Stecker. Zur Laufzeit wird an diesen Stecker ein Flachbandkabel zu einer anderen Platine gesteckt. Auf dieser arbeitet ein ATTiny. Auch dieser hat den gleichen ISP. Beide kommunizieren zur Laufzeit über diese Verbindung, zum Programmieren werden sie getrennt und dann einzeln geflasht. Zur Vereinfachung soll der Mega und der Tiny jetzt auf nur eine Leiterplatte. Sinnvollerweise werden die MISO, MOSI und SCLK-Leitungen direkt verbunden. Deshalb habe ich nur einen ISP-Stecker. Über einen Jumper könnte ich jetzt auswählen, welcher der beider geflasht wird. Jetzt aber das Problem: der andere, der gerade nicht programmiert wird, versucht mit dem anderen zu reden und stört somit das ISP-Protokoll. Wenn ich ihn versuche abzuschalten (Reset auf 0) wird er auch mit programmiert. Gibts hier irgendeine sinnvolle Lösung, die mit möglichst wenig Jumpern und Kabeln auskommt?
Rangi Jones schrieb: > Gibts hier irgendeine sinnvolle Lösung, die mit möglichst wenig Jumpern 2 umschalt (3pin) - Jumper damit schaltet du jeden Atmel zwischen Dauerreset - Normal - Programieren um.
Hallo Rangi, wenn die zwei Controller über diese Verbindung kommunizieren sollen, bedeutet das doch, dass die MISO und MOSI gekreuzt werden müssen? Bist du sicher, dass die ISP Steckverbindung dann für beide Controller korrekt belegt ist? Bitte korrigiert mich falls ich jetzt einen Dreher im Kopf habe. Gruß Jochen
Rangi Jones schrieb: > Wird der im Dauerreset nicht "mitprogrammiert"? oh, stimmt. Wenn du noch einen Pin an den Atmels frei fast, kannst du ja abfragen wie der Jumper steht. Wenn der 1.Programiert wird dann darf der 2. einfach nichts machen.
@Jochen: Ja, du hast recht, aber ich verwende für die Kommunikation nicht die SPI sondern ein eigenes Protokoll.
@PeterII hab ich auch schon dran gedacht, aber leider habe ich auf dem Tiny kein Pin mehr frei.
1. MISO und MOSI werden immer 1zu1 verbunden (heißen ja MasterInSlaveOut und MasterOutSlaveIn, ändern also immer richtig ihre Richtung) 2. Fürs programmieren würde ich Reset an beide Controller führen und dafür die SCK-Leitung umschalten. Die muss man dann zwar bei jedem Controller mittelohmig (paar k) hoch oder runter ziehen damit kein noise einstreut, aber das sind nur 2 resis.
Rangi Jones schrieb: > Zur Vereinfachung soll der Mega und der Tiny jetzt auf nur eine > Leiterplatte. So eine Notlösung hatte ich auch schon mal vor. Der Tipp, der mir damals geholfen hat: 'Nimm einen größeren ATmega für alles!' (Ich hatte allerdings auch dazugesagt, was ich konkret machen will.)
@Ralf G. Noch größer wird echt schwer. Ich brauche 3 serielle Schnittstellen im Vollduplex. Dann bleibt nur noch ein Mega640/1280/2560. Den gibts aber nur im TQFP100-Package. Das bekomme ich nicht mehr gelötet. Die andere alternative wäre ein Soft-UART. Aber für Voll-Duplex brauche ich 2 Timer. Die habe ich aber nicht mehr frei, maximal einen. Ansonsten müsste ich vom AVR weggehen. Das bereit aber Arbeit und Schmerzen.
Rangi Jones schrieb: > ja, aber nicht auf selbergemachten Leiterplatten. warum denn nicht? Meist ist das Routing dann ein Problem aber doch nicht das Löten. Du könnest auch nur die großen Atmel programmieren und diese Programmiert dann den kleinen.
@Peter Das bringt mich auf eine Idee mit der Frage: könnte das funktionieren? Der ISP wird mit dem Mega verbunden, ganz normal. Die Verbindung zum Tiny erfolgt dann nicht mehr über die MISO, MOSI und SCKL-Leitungen des Megas, sondern über irgendwelche anderen Portpins. Wenn der Tiny jetzt programmiert werden soll, muss ich diese Leitungen transparent durchleiten. Dazu würde ich PCINTs verwenden und bei jeder Änderung an den Leitungen den Weg durchschalten. Der Reset vom ISProgrammer geht zu einem 3er Jumper. 1-2 zum Mega-Reset-Pin und 2-3 zum Tiny-Reset-Pin und zu einem Portpin (Input) des Megas. Um zu erkennen das der Tiny angesprochen werden soll, kann ich die Reset-Leitung auf dem Megas einlesen. Sobald hier ein Low kommt, schalte ich den Weg (MISO, MOSI und SCLK) durch und die Interrupts frei. Ist die Reset-Leitung während des gesamten Vorgangs ISP (alles was da so dran hängt, Fuses, etc.) immer 0 oder geht wird damit auch etwas codiert? Kann das mit der Laufzeit (PCINT-ISR @ 20MHz) funktionieren?
Rangi Jones schrieb: > Kann das mit der Laufzeit (PCINT-ISR @ 20MHz) funktionieren? keine Ahnung, aber ich würde es ohne Interrupt machen. einfach in einer schleife eingang auf ausgang zuweisen und da so lange wie der Jumper das will.
1 | while( Jumper ) |
2 | pinOut = pinIN; |
@Peter II ja, auch eine Idee, am besten gleich in der ISR. Dann nerven auch andere Interrupts nicht. In diesem Modus kann der ohnehin nichts sinnvolles machen, ob er das in der ISR macht oder draussen ist egal.
Wiso so kompliziert? Einfach Vcc (5v) schalten. Mikrocontroller ohne Spannung lässt sich nicht flashen! Mit Dioden, Wiederständen oder einem 74xx
Eduard Scheske schrieb: > Mikrocontroller ohne Spannung lässt sich nicht flashen! außer wenn er über seine IO-Pins sich die 5V besorgt. (z.b. I2C Bus)
@Eduard Scheske Das ist garkeine gute Idee. Die SPI-Leitungen des ISP und des Controllers versorgen den abgeschalteten IC über die Clamping-Dioden also 5V - 0,7V = 4,3V. Das reicht allemal, das der anläuft und auch arbeitet. Dann belastet es auch die Datenleitung und löst u.u. auch einen Kurzschluss aus.
Rangi Jones schrieb: > direkt verbunden. Deshalb habe ich nur einen ISP-Stecker. Über einen > Jumper könnte ich jetzt auswählen, welcher der beider geflasht wird. > Jetzt aber das Problem: der andere, der gerade nicht programmiert wird, > versucht mit dem anderen zu reden und stört somit das ISP-Protokoll. > Wenn ich ihn versuche abzuschalten (Reset auf 0) wird er auch mit > programmiert. > > Gibts hier irgendeine sinnvolle Lösung, die mit möglichst wenig Jumpern > und Kabeln auskommt? Reset von anderem uC abfragen ? Wenn auf 0, still sein, keine Kommunikation, alles andere kann gehen. Falls später gewünscht, Pin als Ausgang schalten und anderen uC flashen.
Hi, also Jumpern mit 2x2 Jumper für jede Leitung kontakt 12 flashen vom Mega, 34 der Tiny und dann Arbeitsstellung 24 bzw. 12. Hab ich nen Fehler? Hoffe geholfen zu haben. MfG ich
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.