mikrocontroller.net

Forum: Compiler & IDEs Blinkende LEDs als paralleles Programm


Autor: Simon R. (e-techniker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe eine Schaltung mit 2 Mikrocontrollern der ATMel-Familie 
(ATMega8) gebaut. Die Programierung erfolgt im AVR-Studio und in der 
Programmiersprache C.

Sie besteht aus 3 Platinen: 2 Platinen mit jeweils einem 
Mikrocontroller, dem externen Quartz sowie 4 LEDs.
Die dritte Platine entspricht der gemeinsamen Energieversorgung der 
beiden anderen Platinen.
schematischer Aufbau: Platine - Energieversorgung - Platine
Die Verbindung erfolgt jeweils über Flachbandkabeln.
Forderung an die Schaltung: Jeder Mikrocontroller soll ein eigenes 
Programm in der Endlosschleife ausführen (2 blinkende LEDs) und 
gleichzeitig aber auch mit dem anderen kommunizieren (Die beiden 
Mikrocontrollerschaltungen sind an einigen Ports miteinander verbunden).

Meine Frage: Wie mache ich das programmiertechnisch?

Bin für jede Antwort dankbar!

Simon

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du nutzt 2 der verbundenen Leitungen. Ist Leitung 1 auf High, so ist 
LED1 an. Das gleiche für die 2.LED.
Der eine Controller ist der Master, der die Blinkfrequenz erzeugt, der 
andere der Slave, der sie nur über die beiden IO Leitungen übernimmt.

Für mehr LEDs ist dieser Weg natürlich nicht geeignet, aber in deinem 
Fall schon... (Allerdings, warum brauchst Du dann 2 Controller?!)

Du solltest noch sagen, was das ganze werden soll, dann kann man auch 
über gezieltere Lösungsvorschläge diskutieren.

Autor: Simon R. (e-techniker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es sind 2 Mikrocontroller, weil es sich dabei um ein 
"Kommunikationssystem" handeln soll. Sie steuern sich gegenseitig an, in 
dem die Zustände des jeweiligen anderen abgefragt werden. aber sie 
sollen selber im Hintergrund noch ein eigenes Programm abspielen, 
nämlich die blinkenden LEDs.
Ziel ist die Untersuchung der Störfestigkeit eines solchen IT-Systems 
aus EMV-Sicht.
 Und wie genau funktionier das mit dem "Master-Slave"?Wie realisiere ich 
soetwas?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> noch ein eigenes Programm
Auf dem µC gibt es ja bloß ein Programm. Es kann also gar kein 2. 
Programm laufen.
Du musst also mit einem Programm 2 Aufgaben erledigen - dafür gibt es 
Timer mit Interupts.

Das Blinken der LED kann der Kontroller von alleine, dafür musst du den 
Timer nur passenden Konfigurieren.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die ATmega8 haben ein "Two-Wire Serial Interface", nimm das doch. 
Näheres dazu in der Atmel-Doku.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon R. schrieb:

> Meine Frage: Wie mache ich das programmiertechnisch?

Welche Möglichkeiten der Kommunikation hast du?
Musst du selber was erfinden, oder kannst du zb eine UART Verbindung 
zwischen den Controllern machen.

Ansonsten:
Das macht man so, wie jedes andere Programm auch, in dem ein µC 
'scheinbar' mehrere Dinge gleichzeitig machen soll: In dem man keine 
Warteschleifen in irgend einer Form benutzt, sondern einen 
Standard-Aufbau mit Hauptschleife und Jobflags macht. Ereignisse werden 
in Interrupts verfrachtet und setzen bei Bedarf die Jobflags, so dass 
die Hauptschleife bei Bedarf die entsprechende (kurze) Aktion 
durchführt.

Vielleicht erst mal mit 1 µC üben, ehe man sich an Mehrprozessorsysteme 
macht.

Autor: Simon R. (e-techniker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Auf dem µC gibt es ja bloß ein Programm. Es kann also gar kein 2.
>
> Programm laufen.

Dass es nur ein Programm gibt, ist schon richtig. Aber ich dachte es 
gibt vielleicht die Möglichkeit innerhalb des Hauptprogrammes eine Art 
Unterprogramm laufen zu lassen.

Autor: Simon R. (e-techniker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Welche Möglichkeiten der Kommunikation hast du?
>
> Musst du selber was erfinden, oder kannst du zb eine UART Verbindung
>
> zwischen den Controllern machen.

Ich habe selber etwas erfunden...einfaches Programm.

Wenn das System eingeschaltet ist (Schalter) leuchten zunächst 2 LEDs 
kontinuierlich auf (Grundzustand). Wenn ein Taster gedrückt wird, 
startet das Programm vom uC 1...sobald er sein Programm abgearbeitet 
hat, steuert er den 2. uC an, indem er einen Port auf High setzt. Der 
andere uC fragt den Zustand seines Ports ab und führt sein eigenes 
Programm aus. usw.

Aber ich wollte es erweitern...jeder soll neben der Kommunikation noch 
ein eigenes Unterprogramm ausführen, nämlich das Blinken der LEDs, die 
vorher stetig aufgeleuchtet haben.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon R. schrieb:

> Ich habe selber etwas erfunden...einfaches Programm.
>
> Wenn das System eingeschaltet ist (Schalter) leuchten zunächst 2 LEDs
> kontinuierlich auf (Grundzustand). Wenn ein Taster gedrückt wird,
> startet das Programm vom uC 1

Du gibst den Reset vom anderen Prozessor frei?

Gewöhn dir eine richtige Nomenklatur an!
Sobald ein Prozessor Spannung bekommt, läuft dort ein Programm ab! Ein 
Programm kann daher 'nicht starten' wenn ein Taster gedrückt wurde. Das 
Programm läuft bereits längst!

> Aber ich wollte es erweitern...jeder soll neben der Kommunikation noch
> ein eigenes Unterprogramm ausführen, nämlich das Blinken der LEDs, die
> vorher stetig aufgeleuchtet haben.

Lass mich raten:
Dein bisheriges Programm wimmelt nur so von Warteschleifen.

Die musst du los werden!

Autor: Simon R. (e-techniker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja...das mit den Warteschleifen stimmt schon :-D...aber zu meiner 
Verteidigung:Ich bin nicht der Experte was das Programmieren angeht.

Wie kann ich das sinnvoller machen?Wo sollte ich am besten Nachschlagen, 
um meinen Horizont bzgl. "sinnvolles Programmieren" zu erweitern? :-)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Multitasking

MfG
Falk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei man sagen muss:
Wenn es tatsächlich nur darum geht, eine LED nebenher blinken zu lassen, 
dann kann man das mit einem Timer und einer entsprechenden ISR machen. 
Der Timer+ISR agieren wie ein preämptives OS, welches den Hauptzweig 
regelmässig unterbricht und sich um die LED kümmert.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die saubere Lösung sieht so aus:

Du musst den Umstieg schaffen vom spielen einer Schachpartie mit einem 
Gegener zu einer Simultanpartie gegen 20 Gegner.

Spielt ein Schachspieler gegen einen Gegner, so sitzt er da und wartet 
bis sein Gegner einen Zug macht. Daraufhin analysiert er das Brett wählt 
seinen Zug aus und ... geht wieder in Wartestellung bis sein Gegner 
einen Zug macht.

Eine Simultanpartei funktioniert aber für den Grossmeister in der Mitte 
anders. Er geht von einem Brett zum nächsten. Sein Gegner signalisiert 
ihm dass er einen Zug hat, woraufhin der Grossmeister sich die Situation 
ansieht und seinen Zug macht. Danach geht er weiter zum nächsten Brett. 
Hat ein Gegner noch keinen Zug parat, dann wartet der Grossmeister nicht 
auf den Zug sondern geht gleich weiter zum nächsten Brett. Immer reihum. 
Gibt es an einem Brett etwas zu tun, dann wird dort kurz gearbeitet. 
Gibt es nichts zu tun, kommt gleich der nächste drann.
Auf die Art kann ein Gegner, der Schwierigkeiten hat einen Zug 
auszuwählen, nicht die komplette Simultanpartie lahmlegen. Im 
schlimmsten Fall kann es natürlich sein, dass er seinen Zug findet wenn 
der Grossmeister gerade von seinem Brett weggegangen ist. Dann muss er 
warten, bis er wieder an die Reihe kommt.
Da aber ein µC dieses Reihum-Weitergehen viele tausend mal in der 
Sekunde machen kann, ist in einem µC die Verzögerung nur mit Messgeräten 
nachweisbar. Für einen Menschen sieht es so aus, als ob der Meister 
sofort wieder da ist und sich um die Situation kümmert.
Das versteht man unter 'gleichzeitig' in einem Computer. Eine einzelne 
CPU kann natürlich nicht mehrere Dinge gleichzeitig tun. Aber sie kann 
kurze Aufgaben so schnell hintereinander, ineinander verschachtelt, 
abarbeiten, dass für den Menschen der Eindruck der Gleichzeitigkeit 
entsteht.

Autor: Simon R. (e-techniker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für eure Hilfe, werde mich über die ganzen Sachen schlau 
machen. :-)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger (kbuchegg) (Moderator)
warum überhaupt eine ISR, einfach nur dem Timer. Man müsste doch das PWM 
so langsam bekommen das damit die LED sichtbar blinkt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> @Karl heinz Buchegger (kbuchegg) (Moderator)
> warum überhaupt eine ISR, einfach nur dem Timer. Man müsste doch das PWM
> so langsam bekommen das damit die LED sichtbar blinkt.

Willst du ihn jetzt auch noch in PWM hineinjagen :-)
Im Grunde hast du schon recht.
Auch bei 16Mhz kann man mit dem Timer1 und 1024 als Vorteiler eine PWM 
erzeugen, die eine LED sichtbar blinken lässt. Aber wir wissen wiederrum 
nicht, ob der entsprechende Pin nicht schon beschaltet ist.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sehen wir es so. Es geht hier NICHT darum, mit diversen Tricks und 
Optimierungen die LED blinken zu lassen, sondern dem OP etwas Grundlagen 
zur Programmierung beizubringen.

MFG
Falk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.