5. Januar 2013

Kommunikation zwischen zwei Mikrocontrollern

Hallo,

Allen erst mal frohe Weihnachten nachträglich und ein Frohes neues Jahr!
Zu Beginn möchte ich euch von einigen Weihnachtesgschenken berichten. Diese haben natürlich mit Elektronik und diesem Blog zu tun, aber hier erst mal eine Liste:
- Abstandswarner
- Berührungssensor
- Motorsteuerung ( Mit Adapterplatine für die Pfostenleiste am Pollin-Board )
Zu diesen drei Sachen gibt es am Ende dieses Artikels und im nächsten Beitrag mehr ( wenn alles fertig verlötet ist ;) ) zudem schreibe ich dann darüber, wie es überhaupt weitergeht.

Heute jedoch zeige ich euch, wie ich es endlich hinbekommen habe, dass zwei Mikrocontroller miteinander "Reden", sprich ein paar Daten austauschen.

Der bei mir Vorhandene Aufbau für diesen Artikel bestand aus:
Das gesamte Steckbrett mit Pfostenleiste
  • 1x ATmega8
  • 1x ATmega16
  • 1x Pollin-Board ( geht natürlich auch ohne, nur ich habe zur Kontrolle die LEDs auf dem Board verwendet ).
  • 1x Steckbrett ( s. Bilder ).
  • 18x Kabel ( nicht alle sind nötig ;) )


Die Idee und der praktische Nutzen: 

1.) Idee:
4-Bit Austausch mit nur 5 Leitungen und 0 Übertragungsfehlern.
Die ersten vier Leitungen sind für die Daten ( also die 4-Bits ), während die fünfte die Kontrollleitung ist, mit der eine Fehlerlose Übertragung gewährleistet wird ( mehr dazu weiter unten ).
2.) Der Nutzen:
Das ganze dient unter anderem dazu, dass man an einem Mikrocontroller nicht alle Pins belegt hat, sondern nur fünf. Ein zweiter Mikrocontroller übernimmt dann die Arbeit für den ersten, der seine Rechenleistung und auch seine Pins für andere ( eventuell wichtigere ? ) Dinge widmen kann.

Pinbelegung am ATmega8
Die Umsetzung:

1.) Aussuchen der Pins:

Ich habe am ATmega8 die Pins PC0 - PC4 genommen, da diese nahe beieinander liegen, sodass das verkabeln auf dem Steckbrett relativ einfach war. Es können allerdings auch alle möglichen andere Pins gekommen werden!
Am ATmega16 habe ich PA0-PA4 genommen. Da ich durch das Pollin-Board am ATmega16 nichts verkabeln musste und diese noch frei sind, nahm ich diese. Auch hier können alle anderen, freien Pins genommen werden ( Achtung: Beim Pollin-Board sind einige Pins, die z.B. PD5, durch ein Element des Boardes, hier eine LED, vorbelegt! ).

Hier also nochmal die ausgesuchten Pins:
Pin Typ
ATmega8
ATmega16
Datenpins PC0 - PC3 PA0 - PA3
Kontrollpin PC4 PA4


Schaltplan für Verbindungen
2.) Vorgang der Software:

Die Software, also die beiden Programme, die auf den Mikrocontrollern laufen, sollten ohne Großen Aufwand und Fehler die Daten übertragen, dabei hat sich nach einigen Fehlversuchen folgender Ablauf ergeben:
Im folgenden sind m16 = ATmega16 und dementsprechend m8 = ATmega8!

    Der ATmega8 auf dem Steckbrett
  1. m16 setzt PA0-PA3 auf die gewünschten Bits ( also An/Aus ).
  2. m16 wartet solange, bis auf PA4 eine Spannung liegt.
  3.  m8 prüft ob er etwas mit der Kombination aus 0len und 1en etwas anfangen kann und führt die Aktion aus, die er dann machen soll ( im Code-Beispiel: LED an- / ausschalten ).
  4. m8 setzt auf PC4 ( am m16 ist es PA4 ) eine Spannung an.
  5. m8 wartet solange, bis PC0-PC3 vom m16 auf 0 geschaltet wurden.
  6. m16 registriert, dass auf PA4 eine Spannung liegt und schaltet dementsprechend alle Ports auf 0 ( also PA0-PA3 ).
  7. m16 wartet zur Sicherheit solange, bis auf PA4 KEINE Spannung mehr anliegt ( kann man auch weglassen, aber ich habe diese Schleife zur Sicherheit drin gelassen, da ein erneuter Übertragungsversuch nicht immer klappt ).
  8. m8 registriert, dass alle Datenpins ( PC0-PC3 ) auf 0 gesetzt wurden, verlässt die Schleife ( 5. ) und setzt PC4 auf low ( 0 ).


Nun können wieder neue Bits gesendet werden, sprich es kann bei 1. wieder losgehen.

3.)  Das Programmieren:
Nach anfänglichen Schwierigkeiten funktionierte der Code dennoch recht schnell und übertrug die Bits bisher ohne Fehler. Er ist zwar nicht sehr sauber programmiert und es gibt auch viele Stellen für Verbesserungen, aber immerhin erfüllt er einen Zweck.


Demnächst kommt eventuell noch ein Beitrag, wo ich dann die check() und send() Funktionen in eine Headerdatei packe und auch noch ein wenig überarbeite.


          Download: Kommunikation.7z ( 18 kb )         


Der Download Enthält:
- Sourcecode für m8/16
- Makefiles für m8/16 ( stk500v2 Bootloader )

Was als nächstes kommt:
Zu Weihnachten habe ich ja ein paar kleine Spielereien ( s.o. ) bekommen, die man alle prima mit einem Mikrocontroller verbinden kann. Also wird es demnächst ein paar neue Bauteile / Boards geben, die ich dann mit meinem Pollinboard und / oder einem einzelnen µC verbinde.

Viel Spaß beim testen und basteln ;)

mfg
Hauke