www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Threading in C


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Marcus Kunze (marcusk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: A. K. (prx)
Datum:

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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> aber in diesem Fall geht das sehr
gut auch ohne.

magst Du mir auch verraten, wie das geht?

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

Bewertung
0 lesenswert
nicht 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)

Autor: testit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
state machine ... typische anwendung

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: stive (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}
}

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

Bewertung
0 lesenswert
nicht 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.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mpr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

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.