Forum: Compiler & IDEs Blinkende LEDs als paralleles Programm


von Simon R. (e-techniker)


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

von Fabian (Gast)


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.

von Simon R. (e-techniker)


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?

von Peter (Gast)


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.

von Michael (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Simon R. (e-techniker)


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.

von Simon R. (e-techniker)


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.

von Karl H. (kbuchegg)


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!

von Simon R. (e-techniker)


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? :-)

von Falk B. (falk)


Lesenswert?

Siehe Multitasking

MfG
Falk

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

von Simon R. (e-techniker)


Lesenswert?

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

von Peter (Gast)


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.

von Karl H. (kbuchegg)


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.

von Falk B. (falk)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.