SPI Verdrahtung zw. 2 ATMega8

Meine zusätzliche Leitung war eigentlich gedacht als BusFree Signal. CS bräuchte es trotzdem noch pro Slave. Oder man macht es TWI ähnlich, erstes Byte = Slave Select (Sternschaltung). Quasi eine Art TWI via SPI. Hat zwar mit den Ursprungsprotokollen ungefähr so viel gleich wie eine Mikrowelle und eine Banane, aber möglich wäre es ^^
Unüblich ist es aber nicht, man bedenke was heutzutage alles durch USB geprügelt wird...
 
Eben, zusätzlich zu den CS-Netzen. Aber auch auf die generelle "Bus-belegt-Leitung" könnten zwei Master gleichzeitig zugreifen...
Beim TWI ist das wegen dominant-rezessiven Pegeln kein Problem - da können mehrere Teilnehmer den freien Bus sehen, quasi-gleichzeitig (clock stretching) 'ne Startcondition generieren, und dann munter senden. die erste Bitkollision arbitriert, der Sender der dominanten null gewinnt...
Solange die dasselbe Telegramm senden (also insbesondere den selben Slave ansprechen, diesem ggf dasselbe Kommando erteilen) bekommen sie nichts voneinander mit, hat keiner verloren. Die Antwort des Slaves ist dann erst recht konform...

Oder man macht es TWI ähnlich, erstes Byte = Slave Select
so ähnlich machen das die Geschwister der von Achim verwendeten Schieberegister. Wenn Du das mit'nem AVR so machen willst müssen alle Slaves (mit derselben physischen /CS-Leitung) erstmal ihren MISO als Eingang schalten... geht
 
Eben, zusätzlich zu den CS-Netzen. Aber auch auf die generelle "Bus-belegt-Leitung" könnten zwei Master gleichzeitig zugreifen...
Beim TWI ist das wegen dominant-rezessiven Pegeln kein Problem - da können mehrere Teilnehmer den freien Bus sehen...
Nix was nicht auch per AVR geht. BB (Bus Busy) Pin auf Pullup, 1 (ich will auf den Bus), x Clock warten und SCK überwachen. Kein gezappel -> Sieg. Bus frei, Daten raus. Stellt sich nur die Frage wo das überhaupt eingesetzt werden würde (wenn überhaupt). Aber ich find die Idee gut.
 
Das können immer noch mehrere gleichzeitig machen, die haben dann auch gleichzeitig gewonnen. Unwahrscheinlich, ja - aber genau das macht ja solche sporadischen (sehr seltenen) Fehler so schwer auffindbar.
Das hast du aber überall. Was meinste was im PC Netzwerk los ist. Und da kann man sogar noch die "Absender"Adresse verfälschen.
Kollision ist natürlich möglich, aber tendenziell vernachlässigbar, zumindest wenn man sich nicht allzu blöd anstellt.
 
Aber bei SPI hast Du in dem Fall 'n Kurzschluß, den die Ausgangstreiber der beiden Master wegstecken müssen...
(jaja, Serienwiderstand einbauen blablub)
 
Nö. Nicht als Ausgang treiben sondern als Input. Wahlweise PullUp an oder aus.
Oder sprechen wir grad aneinander vorbei?
 
Soweit war das klar, ich war mir allerdings mit den Overrides nicht sicher...
Hmm... das müßte sogar noch einfacher gehen...
DDOE (Data Direction Override Enable) des /SS ist: "SPE • /(MSTR)" - solange SPI aktiviert ist, und der aktivierter Slave, wird der Override erzwungen...
DDOV (Data Direction Override Value) ist dann "0", also Eingang.

angenommen, man setzt das DDR-Bit (Ausgang), aber hat das MSTR gelöscht - dann greift der Override, der Pin bleibt Eingang. Sobald man MSTR setzt, wirkt das (dauerhaft) gesetzte DDR-Bit. -> Ausgang
Bleibt das PORT-Bit gelöscht, kannst Du nur mit MSTR zwischen Aktiv-Gnd und Tristate-Eingang wechseln (MSTR ist beim Mega8 direct bit accessible). willst Du den internen Pullup nutzen, darf PORT nur außerhalb des Master-Mode gesetzt sein (sonst haste im worst case genau da 'n anderen Master der schneller war, und bereits die Leitung auf Gnd hat)...

Allerdings darfst Du in so einem Bus-Netz nur Bausteine mit dieser Funktion einsetzen.
 
Hallo

Ich hab's hinbekommen mit Hilfe der "Atmel-2585-Setup-and-Use-of-the-SPI_ApplicationNote_AVR151" - allerdings muss ich noch etwas Arbeit reinstecken, da ich die Interruptroutinen (Master & Slave) nicht "zum Laufen" bekommen habe (naja, es wäre auch zu einfach gewesen ;)); außerdem muss ich die Verbindung Master <-> Slave mittels Stecker machen, da beim Programmflashen die Verbindung Master <-> Slave stört ;).

mfg

Hero_123

NB - Frohe Weihnachten :)
 
… außerdem muss ich die Verbindung Master <-> Slave mittels Stecker machen, da beim Programmflashen die Verbindung Master <-> Slave stört ;).
Spiegelschrift. Selbes Problem. PullUp am CS vergessen? ;)
Beim Programmieren sind alle Pins (die nicht dafür verwendet werden, also auch CS) TriState.
 
PullUp am CS vergessen?
Ich füge "externen" hinzu. Wie Thomas geschrieben hat, sind die internen Pullups während des Reset (SPI-ISP läuft bei aktivem Reset) und danach bis Dein Programm sie ggf aufschaltet, deaktiviert; alle Pins Tristate.

P.S.: Irgendwo hab ich auch schon mal 'ne Fuse gefunden, die den Default-Zustand (während/nach einem Reset) irgendwelcher Pins oder so festlegt. War AFAIR bei irgendwelchen PWM-Pins... Wahrscheinlich bei X-Core-ATtinies...
 
Hallo

Ich habe nun auch das interruptgesteuerte Mehrfach-Empfangen hinbekommen, leider sind da die c-files der "Atmel-2585-Setup-and-Use-of-the-SPI_ApplicationNote_AVR151" nicht besonders hilfreich - das Empfangen per Interrupt klappt da nur 1 mal :confused:. Z. Zt sende ich per polling, empfangen wird per Interrupt.

Der externe Pull-Up Widerstand am SS (=CS gemäß TommyB) - wie groß sollte der sein? Ich habe da nichts gefunden...

mfg

Hero_123
 
SlaveSelect, ChipSelect, ChipEnable, ... alles das Selbe, kommt drauf an welches Datenblatt man liest ;)

PullUp / PullDown, da kommt es auf den Wert nicht so genau an. Irgendwas zwischen 1k und 10k. Ich nehme meistens 4k7, kannst aber das nutzen was da ist. Habe auch schon hochohmigeres gesehen. Der muss ja nur dafür sorgen dass das Signal high ist wenn der Controller im Programmiermodus ist, muss also nur den Pin des einen ICs treiben. Andererseits für den Normalbetrieb darf er den Master nicht zu sehr belasten, 1 ohm wäre also blöd ;)
 
Hllo TommyB, Hallo LotadaC

Ich habe nun beim SS(=CS) einen 10k Widerstand (SS ->Vcc) reingehängt, beim Flashen gibt es aber immer doch eine Warnmeldung; ich habe mal einen Screenshot der Warnmeldung, der Fuses, der Lockbits und einen Screenshot mit korrektem Flashen angehängt - beim fehlerhaften (??) Flashen steht ja "WARNING...Flash byte adress 0x18D8 is 0x6C (should be 0xFF) ... FAILED" - wie bzw wo kann ich da diese Flash byte adress ändern (beim Flashen war SS/MISO/MOSI/SKC bei beiden ATMega8 verbunden, geflasht habe ich den Slave).

Wenn ich die Verbindung (SS/MISO/MOSI/SKC) auftrenne, gibt es keine Warnung. Kann ich die Warnung ignorieren? Eigentlich deutet das ja darauf hin, dass etwas nicht ok ist...auch wenn's nur 'ne Warnung ist...

Anbei Screenshots der Fuses, Lockbits, korrektes und fehlerhaftes Flashen:

Flashen_Fehler.gif Flashen_Korrekt.gif Fuses.gif Lockbits.gif

mfg

Hero_123
 

Anhänge

  • Flashen_Fehler.gif
    Flashen_Fehler.gif
    44,6 KB · Aufrufe: 6
  • Flashen_Korrekt.gif
    Flashen_Korrekt.gif
    47,2 KB · Aufrufe: 6
  • Fuses.gif
    Fuses.gif
    32,3 KB · Aufrufe: 5
  • Lockbits.gif
    Lockbits.gif
    29,7 KB · Aufrufe: 6
Zuletzt bearbeitet:
Du hast zwei ATmega8 auf zwei Experimentierplatinen, beide je mit (eigener?) Stromversorgung, Standard-Abblockkerkos usw. Du hast jetzt bei beiden 1:1 verdrahtet: MISO, MOSI, SCK, /CS. /CS außerdem via 22K auf Vcc.

Zum Flashen verwendest Du ein STK500? Mit irgendeinem Top-Shield?

Du verbindest jetzt den Programmer mit einem der Beiden Megas, also Stromversorgung, MISO, MOSI, SCK, /Reset. Auslesen kannst Du den Controller zwar (Signature, Fuses, LBs) aber nach dem Flashen kommt der Fehler?

Als was ist der andere Mega konfiguriert? Master oder Slave, und welchen Zustand hat er beim Programm-Versuch? (Er darf nicht im Reset sein).

Verpaß MISO, MOSI und SCK mal je einen Serienwiderstand (470R..1K) zwischen den beiden Megas, der Programmer muß dann auf die Seite des Controllers, der geflasht werden soll...

Ansonsten: die SCK-Frequenz des Programmers ist deutlich unter 1/4 des Controllertaktes?

Tante Edith würde dann auch der /CS Leitung noch'n Serienwiderstand verpassen, das spielt zwar eigentlich keine Rolle, aber dann kannst Du zwischen den beiden AVR nicht mal dann einen Kurzschluß auslösen, wenn Du es mit Macht drauf anlegst. Der Symmetrie halber dann an beiden AVR 'n externen Pullup (dat Hünafutta kost ja nix)
 
Zuletzt bearbeitet:
Hallo LotadaC

Vielen Dank für Deine Hilfe!

Die beiden ATMega8 sind zwar auf 2 getrennten Boards, haben aber eine gemeinsame Spannungsversorgung. Ich habe 1*10kOhm an einem SS - Vcc angeschlossen.
Verbunden sind MISO-MISO, MOSI-MOSI, SCK-SCK. SS-SS (quasi von Pin zu Pin ohne Kondensator etc).
Programmiert wird mittels AVR Studio4 4.18.700, avr-gcc v 4.3.3
Der Slave wird mittels ISP geflasht (ist der UCOM IR2 Adapter von NICAI SYSTEMS http://www.nicai-systems.com/en/robotics/nibo2/ucom-ir2-x).
Eingestellt ist dieses Ding als STK500 (fkt ja auch, wenn ich ohne Verbindung flashe, habe damit auch die Fuses des Slave gesetzt).

Der Master wird mittels mySmartUSB MK2(von myavr.de, http://shop.myavr.de/Systemboards und Programmer/mySmartUSB MK2 (Programmer und Bridge).htm?sp=article.sp.php&artID=42) geflasht ( => nicht per ISP, der Master hat auch einen Bootloader, der Slave hingegen nicht).

Wird der Slave geflasht, ist der Master nicht im Reset; wird der Master geflasht, ist der Slave nicht im Reset (es wird immer einer nach dem anderen geflasht).
Wird der Slave geflasht, ist am Master zwar das mySmartUSB MK2 angeschlossen, aber nicht als Flashgerät aktiv (das Ding muss angesteckt sein, sonst ist der Master im Reset!!!!).
Wird der Master geflasht, steckt am ISP des Slave kein Gerät (Slave wird nicht geflasht).

Serienwiderstände - habe ich z.Zt keine (muss ich mir erst noch organisieren, bin kein toller Bastler :confused:)

SCK-Frequenz: 3.686411Hz/64

Flashen scheint wohl bei beiden zu funktionieren, aber beim verifizieren kommt jeweils eine Fehlermeldung (siehe Anhänge von diesem und dem vorherigen Beitrag #35).

Anbei die Fehlermeldung, wenn ich den Master (mit mySmartUSB MK2) flashe.
Master_Fehler_flashen.gif Master_Fehler1_flashen.gif Master_Fuses.gif

mfg

Hero_123
 
Hmmm...
Ich würde die gesamte verbindung zwischen den beiden megas trennen und dann flashen/verfizieren.
Danach verbindung wieder herstellen.
73 de addi
 
Ist nicht ganz eindeutig, aber der Master scheint über einen Bootloader "von innen" geflasht zu werden, wahrscheinlich via UART. Den Bootloader interessiert natürlich nicht, was währenddessen auf dem SPI-Bus los ist.
Insbesondere wird das nicht während des Reset durchgeführt sondern (sehr wahrscheinlich) immer nach einem Reset.

Der Slave hingegen soll via SPI-ISP geflasht werden.
Ich würde die gesamte verbindung zwischen den beiden megas trennen und dann flashen/verfizieren.
Das ist ja nicht das Problem, siehe:
Wenn ich die Verbindung (SS/MISO/MOSI/SKC) auftrenne, gibt es keine Warnung.
Die Warnung gibt's, wahrscheinlich, weil der Master als solcher Pegel auf SCK und MOSI legt, der Programmer auch. Der Programmer scheint stärker als der Master zu sein, aber der Slave kommt nicht mehr sauber durch.

Man könnte entweder die Serienwiderstände reinpacken (sind von ATMEL auch empfohlen) - alternativ könnte man auch per Software dafür sorgen, daß der Master seine SPI-Beine "hochnimmt" (also Tristate), sobalt der Slave Reset gehalten wird. Also den Reset des Slave mit irgendeinem anderen Pin (also dort nicht der Reset) des Masters verbinden, der dann in der Software des Masters überwacht wird (möglichst 'per IRQ), wenn der Pegel auf Low geht (durch den Programmer am Slave), deaktiviert der Master sein SPInterface UND schaltet die entsprechenden Beine Tristate. Wird dort wieder eine Steigende Flanke erkannt, darf der Master sein SPI wieder in Betrieb nehmen.

Grundsätzlich kann man natürlich die Verbindung auch vor/während jedes Programmiervorganges unterbrechen, aber darum gings hier ja eben nicht.

Als was ist der andere Mega konfiguriert? Master oder Slave,
Bei einem Slave gäbe es diese Problem nicht, ist er via /CS nicht selektiert, bleibt er Tristate.
Serienwiderstände - habe ich z.Zt keine (muss ich mir erst noch organisieren, bin kein toller Bastler :confused:)
Du kannst auch mal 4K7 probieren... oder vielleicht auch 10K, wenn Du nichts anderes da hast. Wirst ja danach sehen, ob die AVR sich dann noch verstehen.
 
  • Like
Reaktionen: TommyB
Oder man zwingt den Master per Jumper während des flashens in Reset (ggf. auch per Software realisierbar).
Oder ... Vorsicht, das wird jetzt kompliziert - man nutzt einen Bootloader im Master der die Slaves selber flashen kann. Das setzt aber Bootloader Code und spezialisierte PC Software voraus. Wäre mal ein interessantes Projekt.

@LotadaC: Glubscher weg vom Timestamp :D
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)