Forum: Mikrocontroller und Digitale Elektronik Threading in C


von gast (Gast)


Lesenswert?

Hallo,

kann man einen AVR in C programmieren und Threads erstellen? Ich sende 
von einem PC an den Controller ein Telegramm über einen Datenbus. Die 
ankommenden Daten sagen dem µC wie lange einzelne Pins jeweils 
geschaltet werden sollen. Meistens gehen zwei Lampen zur gleichen Zeit 
an, die Eine muss aber früher ausgeschaltet werden als die Andere. 
Desshalb wäre meine Überlegung, es wäre das leichteste, wenn ich zwei 
Threads starte, in den jweils unabhängig ein Delay läuft. ISt das 
überhaupt möglich? WEnn ja, wie geht das?

: Verschoben durch Admin
von Marcus K. (marcusk)


Lesenswert?

du hast gar kein Betriebssystem, wer soll denn da Thread verwalten? 
Entweder musst du ein µC-Betriebssystem verwenden (wo ich wenig sinn 
drin sehe) oder du musst wie viele andere ohne Threads leben.

von Peter D. (peda)


Lesenswert?


von (prx) A. K. (prx)


Lesenswert?

Zwar kann man das mit Threads lösen aber in diesem Fall geht das sehr 
gut auch ohne.

von gast (Gast)


Lesenswert?

>> aber in diesem Fall geht das sehr
gut auch ohne.

magst Du mir auch verraten, wie das geht?

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:
>>> aber in diesem Fall geht das sehr
> gut auch ohne.
>
> magst Du mir auch verraten, wie das geht?

zb indem man einen Timer einsetzt, der einen Basiszeittakt generiert.

Wenn du kochst und 3 Töpfe am Herd hast, von denen der eine nach 10 
Minuten, der nächste nach 13 Minuten und der dritte nach 28 Minuten 
ausgeschaltet werden muss, du aber nur eine Uhr zur Hand hast, wie 
machst du das dann?
Und wie machst du es, wenn du keine Uhr hast, sondern nur ein 
Zeitsignal, welches regelmässig jede Sekunde einmal piepst?


(_delay_xx sind zwar praktisch und vor allen Dingen einfach. Aber 
aktives Warten, so dass in einem µC nichts anderes mehr passieren kann, 
ist meistens die denkbar schlechteste Lösung. Zu mehr als zu kurzen 
Wartezeiten sind diese Funktionen nicht zu gebrauchen)

von testit (Gast)


Lesenswert?

state machine ... typische anwendung

von (prx) A. K. (prx)


Lesenswert?

gast schrieb:

> magst Du mir auch verraten, wie das geht?

Eine Variante hat Peter schon skizziert.

Eine andere: Sorg beispielsweise für einen 100Hz Timer-Takt. Der zählt 
nur eine Variable hoch, sonst macht er nichts.

Im Programm wird pro Lampe vermerkt, wann mal wieder Aktivität ansteht:
   lampe1_an = uptime + 500
nach 5 Sekunden. Die Hauptschleife fragt diese Variablen ab und reagiert 
wenn uptime >= lampe1_an.

von gast (Gast)


Lesenswert?

Was heißt
>> Sorg beispielsweise für einen 100Hz Timer-Takt
??

Wie genau ist denn das ganze dann? Wenn ich ab einem Startsignal einmal 
nach 225 Ticks, nach 250 Ticks etc. etwas machen möchte und keinen Delay 
in einer Schleife verwende, wie denn dann? Also ich meine jetzt nach dem 
Prinzip wie es Karl heinz Buchegger mit den Töpfen dargestellt hat.

von stive (Gast)


Lesenswert?

Tach
ZB:


- Timerinterrupt so einstellen, dass er alle 5ms kommt

Aktion A alle 500ms
Aktion B alle 200ms

ZählerA = 100   (500ms/5ms=100)
ZählerB = 40    (500ms/5ms=40)



timerinterrupt{
ZählerA--;
if(!ZählerA)
{
setzte Flag das Zähler A abgelaufen ist;
ZählerA=100;    // Zähler wieder auf Anfangswert setzten
}

ZählerB--;
if(!ZählerB)
{
setzte Flag das Zähler B abgelaufen ist;
ZählerB=40;    // Zähler wieder auf Anfangswert setzten
}
}



main{
if(ZählerFlagA){
do FunktionA
}
if(ZählerFlagB){
do FunktionB
}
}

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:

> Wie genau ist denn das ganze dann? Wenn ich ab einem Startsignal einmal
> nach 225 Ticks, nach 250 Ticks etc. etwas machen möchte und keinen Delay
> in einer Schleife verwende, wie denn dann?

Wo kommen denn jetzt auf einmal die 255 Ticks her?

Wie lang sind denn deine Zeiten? Ich denke wir reden von Lampen und da 
ist es doch meistens ziemlich sinnfrei über Zeiträume im µs Bereich zu 
reden.

von gast (Gast)


Lesenswert?

Also ich habe zum Timer auch hier im Forum etwas gefunden. Aber auch 
wenn ich nur die Funktionen in main() in mein Programm übernehmen gibt 
es gleich 7-fach Mecker: ../main.c:254: error: 'TCCR0' undeclared (first 
use in this function)
und ähnliche Fehler tauchen da auf. Ist das Tutorial-Programm nicht für 
den AT90CAN128 gedacht? Wenn nicht, kennt jemand dafür auch ein Programm 
nach dem Prinzip von Karl heinz Buchegger? Also im 10Hz-Takt prüfen, ob 
ein bestimmter Zählerstand erreicht ist und dann etwas tun. Mein µC wird 
mit 16 MHz gespeist.

von mpr (Gast)


Lesenswert?

Och jetzt komm, die paar Sachen wirst du doch wohl angepasst bekommen. 
Es wurden dir doch schon Tipps gegeben, jetzt bist du mal mit denken 
dran. google kann nicht alles...

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.