- 12V Akku mit 280 Ah bauen         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Datenübertragung zwischen zwei atmega8 auf dem asuro

  1. #1
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063

    Datenübertragung zwischen zwei atmega8 auf dem asuro

    Anzeige

    Praxistest und DIY Projekte
    Soo... Die erste Schnapsidee sieht so aus:

    Die Prozessoren sind über Zwei Pins Miteinander Verbunden. Im folgenden werden die Pins so bezeichnet:

    Atmega1,Pin1:Pin11 (Interrupteingang!)
    Atmega2,Pin1:Pin21 (Interrupteingang!)
    Atmega1,Pin2:Pin12
    Atmega2,Pin2:Pin22

    Die erste Verbindung (Zwischen Pin11 und Pin21) ist für den Sendestatus, die Zweite für die daten.

    Zum Ánfang beginne ich mit bitweisem senden von daten. das ist nicht sonderlich effektiv, aber reduziert die fehlerquote.

    Im Standartzustand Liegen alle Pins auf LOW. Pin11 und Pin21 werden als Interrupteingang geschaltet. Jeder Prozessor macht seine Arbeit.

    Beispiel: Prozessor 1 Will eine Logische 1 an Prozessor2 Senden. Dazu macht er folgendes:

    Er setzt den DATENpin (Pin12) auf High (um eine 1 zu senden, low um eine 0 zu senden).
    DANN setzt er den Statuspin(Pin11) auch auf high und wartet ca 1ms.
    Dadurch wird bei Prozessor2 ein interrupt ausgelöst. Er Liest seinen Pin22 aus, findet heraus, dass strom anliegt und speichert eine 1 (wäre pin12 auf low geblieben, hätte er eine 0 gespeichert). DANN WARTET AUCH ER EINE millisekunde, damit er nicht nochmal das gleiche empfängt.

    NAchdem Prozessor1 gewartet hat, schalteter den pin11 wieder auf low. beide prozessoren machen weiter das, was sie sollen. evtl kann in der isr noch eine Variable "datenempfangen" gesetzt werden, dann kann der prozessor2 die daten gleich verarbeiten.

    genauso gehts umgekehrt.

    nochmal in kurzfassung:

    Sendender Prozessor legt auf den datenpin das, was er senden will (high für 1, low für 0). dann legt er den statuspin auf high.
    beim empfangende prozessor wird ein interrupt ausgelöst, dieser liest den status des datenpins aus und speichert eine 0 oder 1.
    prozessor1 setzt nach kurzer wartezeit seinen statuspin wieder auf low und macht weiter mit dem was er vorher auch gemacht hat. prozessor zwei wartet auch kurz, und macht dann mit dem wieiter was er vorher gemacht hat, oder verarbeitet das bit was gerade angekommen ist, oder...


    was sagt ihr dazu? immerhin eine übertragungsrate von fast 1000 Baud, wenn die Prozessoren wirklich nix anderes zu tun habenn... =)
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    01.11.2006
    Beiträge
    433
    die idee klingt ganz gut.
    aber: gesetzt den fall asuro 1 sendet alle seine mommentanen daten an den asuro 2
    dann sendet der
    (1) motor_richtung kommt
    (2) fwd fwd
    (3) motor_speed kommt
    (4) 140 140
    (5) odo daten kommen
    (6) 432 654
    (7) liniensensoren daten kommen
    ( 786 986
    (9) taster daten kommen
    (10) 16

    das ganze muss asuro 1 ins binär system umwandeln, dann muss asuro 2 die enstsprechenden befehle (motor_speed kommt, odo daten kommen....) interpretieren, die empfangenen 0 en und 1 en in EINE variable schreiben, und dann ins dezimalsystem umwandeln

    da kommt eineiges an verwaltungsaufwadn zusammen

    das einzige was mir mommentan als vorschlag einfällt ist, das man einen dritten port für die übertragung von steuerzeichen (oder so was halt) nutzen könnte. allerdings sind ports am asuro bekanntlichermasen kostbar

    mfg EDH

  3. #3
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    tja das stimmt...

    man müsste sich halt vorher festlegen was was bedeuten soll. man könnte sonst auch evvtl pakete von 4 bits oder sogar einem byte übertragen. das risiko ist halt, dass irgendwann zwischendurch ein anderer interrupt ausgelöst wird, dann bricht die ganze sache zusammen.

    ausserdem ist es eigentlich völlig egal, ob die steuerzeichen in binäre "codewörter" umgewandelt werden und über die zweite leitung oder die dritte umgewandelt werden. der empfangende prozessor kann sich eh nur eins zur zeit anschauen, eine parallele datenübertragung fällt mehr oder weniger flach.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    01.11.2006
    Beiträge
    433
    parallel geht garantiert nicht, das stimmt.
    aber mit einem driten port wüsste der asuro wenigstens ob jetzt daten oder befehle kommen. das müsste er dann nicht erst selbst rausfinden

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    na er muss doch dann den gesendeten bytecode umwandeln in einen befehl. also soll er das probieren. und wenn das was er da emfangen hat nicht der steuercode für den motor, nicht der für die liniensensoren, nicht der für die geschwndigkeit und auch keiner der anderen ist, dann sind es offensichtlich daten...

    aber das erste problem wäre ja folgendes: meinst du dass die datenübertragung auf oben genannte weise überhaupt theoretisch funktionieren könnte, mal ganz davon abgesehen, was der zweitprozessor dann mit den empfangenen bytes macht?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    37
    Beiträge
    4.255
    Wenn du zwei Pins nimmst, kannst du auch gleich I2C nutzen... und weil Ports knapp sind, kann man auch nen 1wire-ähnliches System mit nur einer bidirektionalen Leitung aufbauen...

    Und die Wartezeit im Empfänger kannst du dir auch sparen. Der Interrupt wird von der steigenden Flanke der "Status"-Leitung (ist ja eher ne Taktleitung) ausgelöst, dann wird der Datenpin abgefragt. Das ganze wiederholt sich dann erst, wenn die nächste steigende Taktflanke ankommt.

    Wie kommen die Pins auf den Low-Ruhezustand? dazu währen Pulldown-Widerstände nötig, die man extern anschließen müsste. Bei nem High-Ruhepegel könnte man die internen Pullups verwenden, was für einige Zentimeter Entfernung locker ausreicht.

    Ist das System bidirektional ausgelegt? Das kann ich noch nicht so richtig rauslesen. Wie würde dann der Fall gelöst, dass beide AVRs gleichzeitg anfangen zu senden?

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    01.11.2006
    Beiträge
    433
    [....] was für einige zentimeter entfernung locker ausreicht
    welche entfernung ?

  8. #8
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    naja man könnte natürlich auch einen high-ruhezustand nutzen... aber die steigende flanke gibts eben nur bei einem LOW-ruhezustand.

    allerdings wird der interrupt doch immer wieder ausgelöst, solange ein High pegel anliegt, oder nicht ? beim tasterinterrupt z.B. wird dieser immer und immer wieder ausgelöst, slange ien taster gedrückt wurde... wobie hier auch ein low pegel anliegen muss um den interrupt auszulesen.

    naja dann eben ein high pegel... =)

    ich wollte gerade die porterweiterung umgehen, um etwas eigenes zu entwickeln. einen zweiten atmega habe ich noch liegen, eine porterweiterung nicht =)

    bidirektional: ja.

    wenn beide gleichzeitig anfangen... öhm... keine ahnung. ich habe das risiko als gering genug angesehen, um es zu vernachlässigen... ansonsten passiert wahrscheinlich gar nix. =(
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hi,

    Wie uwegw schon sagte. Mit 2 Pins kann man doch den I2C Bus verwenden.
    Vorteil dabei:
    * ist ein bekanntes Protokoll, das einfach umzusetzen ist.
    * Adressen, Kommandos, Daten ist im Portokoll alles schon vorhanden.
    * fertige C-Libs zum Einbinden vorhanden.

    Der Asuro würde dabei als I2C Master laufen, der Co-Controller als I2C Slave. Da der TWI (I2C nach Atmel Bezeichnung) Bus beim Asuro durch die A/D Wandler für Batterieabfrage und die Schalter belegt ist, müßte man eine I2C Software Emulation schreiben. Die bibt es ebenfalls schon fertig von P.Fleury und wurde von mir auch schon erfolgreich auf der Asuro I2C Porterweiterung eingesetzt.

    Beim Co-Controller würde man natürlich die Hardware TWI benutzen.

    Gruß m.a.r.v.i.n

  10. #10
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    hmm... sag mal ich hab grad im asurowiki geschaut =)

    kann es sein dass da in der platinenzeichnung ein fehler ist? die widerstände r7,r8,r9 sollen laut schaltplan an vcc kommen, bei der platine sind sie jedoch am ende nur in einem loch, welches nicht mit vcc in verbindung steht...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test