8. April 2013

Kummunikation 2.0

[last Update: 22.04.13]
Hallo,

hier endlich mal wieder ein Post von mir ;)

Ich habe mich ein wenig über ein größeres Projekt gedanken gemacht und interessiere mich seit längerem wahnsinnig für Magnetschwebebahnen. Ich plane deswegen schon seit längerem ( ca. 3 Wochen ) wie man soetwas realisieren könnte. Natürlich sollten und werden dann auch Mikrocontroller zum Einsatz kommen.

Unter anderem habe ich mir Gedanken über die Kommunikation "Kontrollstation" -> Zug gemacht. Dies soll möglichst einfach von statten gehen. Der Sinn dahinter ist, dass man dann den Zug wie eine Modellbahn steuern können soll ( wenigstens starten und stoppen ).

Ich habe dazu die vorherige Möglichkeit Daten auszutauschen verändert. Nun kann nur einer Daten senden und der andere empfängt. Dies ist hier sinnvoll, da der Zug lediglich befolgen, aber nicht befehlen soll.

Momentan habe ich die Idee von zwei Möglichkeiten, die mir spontan eingefallen sind und die ich für relativ einfach erachte:
  1. Eine begrenzte Anzahl an Möglichkeiten:
    Hierbei gibt es z.B. 3 Leitungen ( Datenleitungen ), an denen entweder eine Spannung anliegt ( 1 ) oder eben nicht ( 0 ). Dabei ist in diesenfall die Zahl der Variationen auf 8 begrenzt ( 2^3 ).
  2. Eine UNbegrenzte Anzahl an Möglichkeiten:
    Diese Version funktioniert so ähnlich wie die aus dem letzten Post: Hier gibt es eine Datenleitung, eine Leitung, die angibt ob es ein neues Bit gibt ( dies wird angegeben indem die Leitung von 0 -> 1 bzw. von 1 -> 0 geht ) und eine Kontrolleitung ( diese funktioniert wie die Leitung, die die änderung angibt ).
    Ende der Übertragung ist nach der übertragung einer definierten Menge an Bits. Möglich wäre auch DNA-like eine Art "Stopp-Codon" ( also eine Bestimmte Reihe an Bits ) fest zu legen, nach der die Übertragung beendet wird.

Ich werden die zweite Idee beim nächsten Post mit Bildern, Code, etc. vorstellen.

Hier die Zusammenfassung der 2. Idee ( Leitungen nicht in der obigen Reihenfolge ):
  • Leitung 1: Kontrollleitung: Empfangender µController gibt dadurch an, ob der das gesendete Bit erhalten hat.
  • Leitung 2: Änderungsleitung: Gibt durch Änderung der Spannung ( 0V o. 5V ) an, dass die momentan auf der Datenleitung anliegende Spannung ( 0V o. 5V ) das nächste Bit ist.
  • Leitung 3: Datenleitung: Gibt durch Spannung ( 0V oder 5V ) den Wert des Bits an ( also 0 oder 1 ).
  • Ende der Übertragung ( 2 Möglichkeiten ):
    1. Ende nach definierter Menge an Bits
    2. Ende nach bestimmter Reihenfolge an Bits
Ich hoffe dieses bisschen Theorie hat euch nicht zum einschlafen gebracht.
Beim nächsten mal gibt es dann ein paar Bilder und Code zum selbst ausprobieren. Ob ich das Projekt mit der Magnetschwebebahn anfange oder doch etwas leichteres mache weiß ich noch nicht ... aber cool wäre so'ne Magnetschwebebahn schon ... ;)

Das ist neu (von 22.04.13):
Code fürs senden von Bits ( ohne Start- / Stopcodon, etc. ) fertig....
und ja er funktioniert ;)

mfg
Hauke

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