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
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.
Zwar kann man das mit Threads lösen aber in diesem Fall geht das sehr gut auch ohne.
>> aber in diesem Fall geht das sehr
gut auch ohne.
magst Du mir auch verraten, wie das geht?
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)
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.
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.
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 } }
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.