Hallo zusammen, ich habe folgendes Problem. Bin noch ziemlich in den Anfängen mit der Programmierung der AVR's in c. Einfache Ein/Ausgaben, LCD, ADC und PWM habe ich zwar dank der Seite www.mikrocontroller.net und deren Forum hingekriegt (an dieser Stelle nochmal herzlichen Dank), aber bei fast allen meinen ernsthaften Projekten stosse ich an ein Problem! ich muss eine Zeit ein oder ausschaltverzögert starten oder einen Impuls verlängern. Natürlich habe ich zu diesem Problem das Forum schon durchgesucht und auch in anderen Foren aber nichts wirklich brauchbares gefunden. Was ich gefunden habe war ein Scheduler der erlich gesagt für meinen Stand der c Kentnisse zu komliziert ist. Aber dasa was ich verstanden habe löst nicht wirklich mein Problem Also meine Frage: ist es überhaupt möglich in c so etwas zu programmieren? Im angehängtem Code habe ich versucht das Problem anzugehen. Hoffe auf viele Anregungen und Vorschläge. Schonmal vielen Dank!
Alexander S. schrieb: > Also meine Frage: ist es überhaupt möglich in c so etwas zu > programmieren? In C geht alles. Alexander S. schrieb: > Im angehängtem Code habe ich versucht das Problem anzugehen. Funktionen gehören in ein *.c-File und haben in einer Headerdatei nichts verloren. Sowas ist kein Programm. Daß in der Timer-ISR Variablen hochgezählt werden, um längere Zeiten zu erzeugen ist gut. Was nicht gut ist, ist der Timermodus. Ich denke mal du willst Millisekunden zählen. Dann tu das auch. Guck dir den CTC-Modus an. Damit lässt sich der Timer besser einstellen. Den Sinn deiner Funktionen kann ich irgendwie nicht erkennen, weil man nicht sieht, wann und wieso sie aufgerufen werden. Also vernünftiges Programm posten. mfg. PS Auch wenn es dem Compiler egal ist, aber Variante mit "W" tut schon ein bisschen weh in den Augen.
Aber... Die Prozessoren haben meist mehrere Timer, die durch die Belegung unterschiedlichster Register initialisiert werden. Es werden verschieden "breite" Variablen zur Steuerung, sogar bei ein und demselben Prozessor, verwendet. Die Zeitbasen und natürlich deren Initialisierung sind sehr unterschiedlich. Dazu kommt noch wenigstens ein Dutzend Betriebsarten. Vor lauter ifdef's kommst Du dabei gar nicht mehr zum Kodieren. Wer so etwas dann auch noch warten will... Freiwillige vor! Ich stell' mich gern ganz hinten an.
Also zuerst mal danke für die ersten Beiträge. Thomas bei dir muss ich mich wohl für meine Gramatik entschuldigen, ist leideer meine Schwäche. Das in einer Headerdatei keine Funktionen hingehören ist mir neu, weil wenn ich die printf Funktion aufrufen will binde ich die stdio.h ein. Oder verstehe ich was falsch? Wie gesagt ich bin noch dabei es zu lernen. Sorry wegen der Unübersicht des Codes. die Funktion timer_1 soll dan nach einbinden der Headerdatei Timer.h folgend aufgerufen werden. if(timer_1(10,2)) { etwas tun wenn 10 Sekunden vergangen sind } Hoffe du kannst jetzt nachfolziehen was ich meine. Amateur der von mir gewählte Ausdruck universel ist natürlich weit ausgeholt, in meinem Fall würde es reichen wenn ich die Headerdatei für die Kontroller Mega 8 - 32 benutzen könnte.
Alexander S. schrieb: > Das in einer Headerdatei keine Funktionen hingehören ist mir neu, weil > wenn ich die printf Funktion aufrufen will binde ich die stdio.h ein. > Oder verstehe ich was falsch? Mit der Headerdatei wird dem Compiler die Funktion bekannt gemacht. Die steht aber in einer Library. Das sind ganz einfach gesagt, etliche *.c, die schon compiliert sind. Für den Anfang arbeitest du erstmal nur in einer *.c-Datei. Dann kannst du auf eigene Headerdateien ganz verzichten. Die dienen in ersten Linie dazu, Funktionen und Variablen anderen *.c-Dateien im Projekt bekannt zu machen. Also wenn du mehrere *.c-Dateien hast. Oder auch um Code aus anderen Projekten einzufügen. Aber so weit bist du noch nicht. Die Headerdateien der libc musst du natürlich weiterhin einbinden, also stdio.h & Co. mfg.
Alexander S. schrieb: > gefunden habe war ein Scheduler der erlich gesagt für meinen Stand der c > Kentnisse zu komliziert ist. Aber dasa was ich verstanden habe löst > nicht wirklich mein Problem Dein Ansatz ist ja grundsätzlich nicht so schlecht. Nur versuch noch nicht, dafür eine allgemeingültige Ein_Für_Allemal_Lösung zu finden. Denn wenn etwas allgemein verwendbar sein soll, dann werden die Dinge meistens kompliziert. Wohingegen der jeweilige Spezialfall meist sehr einfach ist. Tip. Meistens vereinfachen sich solche Timing-Sachen, wenn du die Dinge umdrehst. Zähl nicht die Zeit hinauf, sondern herunter! Aus deinem Hauptprogramm gibst du eine Zeit vor (indem du sie einer Variablen zuweist) und in der ISR zählst du die Zeit sukzessive herunter, bis die 0 erreicht wurde. Und dann machst du deine Aktion (die in vielen Fällen einfach nur das Schalten eines Portpins ist). zb. das zeitverzögerte Ausschalten einer LED
1 | volatile uint8_t offTime; |
2 | |
3 | ISR( ... ) |
4 | {
|
5 | if( offTime > 0 ) |
6 | {
|
7 | offTime--; |
8 | if( offTime == 0 ) |
9 | LED ausschalten |
10 | }
|
11 | }
|
12 | |
13 | int main() |
14 | {
|
15 | ...
|
16 | Timer initialisieren |
17 | ...
|
18 | |
19 | sei(); |
20 | while( 1 ) |
21 | {
|
22 | ....
|
23 | if( irgendwas ) |
24 | {
|
25 | LED einschalten |
26 | offTime = 30; |
27 | }
|
28 | }
|
29 | }
|
wenn 'iegendwas' eintritt, dann schaltest du die LED ein und setzt in offTime die notwendige Zahl für die zeitverzögerung. In der ISR wird diese 'Zeit' dann runtergezählt und wenn die so vorgegebene Zeit verstrichen ist, dann schaltet die ISR die LED wieder aus. ganz einfach. ganz simpel. Und was mit einer derartigen Variablen geht, geht auch mit 3. Prinzipiell gehts auch mit 200, nur nimmt man dann schon ein Array für die Zeitvariablen und keine 200 Einzelvariablen mehr. Das ist jetzt natürlich auf den speziellen Anwendungsfall 'zeitverzögertes Ausschalten' einer LED zugeschnitten. Wenns allgemeiner verwendbar sein soll, dann wirds etwas komplizierter. Daher belass es momentan dabei und schneidere dir diese Funktionalität für deinen konkreten Anwendungsfall zurecht.
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.