Hi, ich habe mal kurz eine Frage. Ich möchte einen Eingang an einem atmega32 (16 Mhz) abfragen. Was ja so gesehen kein Problem ist. Aber er soll in einer definierten Zeit (50ms) abgefragt werden. Ist der Eingang Lo soll ohne Fehler aus der 50ms Schleife gesprungen werden, ist dieser nach 50ms immer noch Hi so wird ein Fehler-Flag gesetzt. Ich hoffe meine Beschreibung ist so verständlich. Ich habe mal meinen Code angehängt, kann mann das so machen? oder gigt es eine bessere Lösung. for (unsigned int timer=0; timer < 10; timer++) // wait 50ms { for (unsigned int timer=0; timer < 10000; timer++) // wait 50ms { if (0 == EINGANG x) // input lo? { goto step1; // ok input was lo } } } ERROR_FLAG |= (1<<1); step1: Für eure Tipps vielen Dank im voraus. Gruß Helmuth
@ Helmuth (Gast) >Beschreibung ist so verständlich. Ich habe mal meinen Code angehängt, >kann mann das so machen? Ja, ist aber ziemlicher Mist. > oder gigt es eine bessere Lösung. Ja, nimm einen Timer und den dazu passenden Interrupt MfG Falk
Hallo Falk, kannst du mir das bitte mal näher erläutern? Stehe ein bischen auf dem Schlauch. Helmuth
Danke wie ein Interrupt programmiert wird kenn ich bereits. Mir ging es darum zu verstehen wie es mit Interrupt einfacher sein soll als mit einer Schleife.
@ Helmuth (Gast) >Mir ging es darum zu verstehen wie es mit Interrupt einfacher sein soll >als mit einer Schleife. Ganz einfach, deine tolle Schleife legt dir den gesamten Prozessor lahm! Aber Hauptsache 16MHz, damit der auch wirklich SCHNELL im Kreis laufen darf. ;-) Siehe Multitasking MFG Falk
Das verwendete Board hat nun einmal 16Mhz, war also nicht meine Idee. Er soll aber während er dein Eingang abfragt auch nichts anderes machen. MFG Helmuth
ist aber nicht sinnvoll sich ein delay und schleifengewühle anzugewöhnen kommt mal etwas hinzu stimmt plötzlich das timing nicht mehr mach einen timer der einfach alle 50ms zuschlägt wenn der nix anderes machen soll .. leg ihn dazwiscen schlafen ^^ siehe dazu Timer im CTC modus das Compareregister wird dazu mit einem wert geladen der eben 50ms entspricht die ISR wird so zyklisch alle 50ms aufgrufen wird die pinabfrage nicht verwendet .. kannste den timer für was anbderes weiterverwenden oder eben wieder stilllegen
Du hast nicht geschrieben, wie genau die 50 ms sein müssen. Wenn die aber nur annähernd etwas Ähnliches wie "genau" sein sollen, solltest Du einen Timer nehmen. Alles andere ist Hingepfriemel, das möglichweise bei der nächsten Compilerversion, sicher aber schon bei anderen Compilerflags nicht mehr stimmt. Übringens: einen goto in einer solch simplen Programmstruktur zu benötigen grenzt schon an <zensiert>.
Hallo, habe jetzt erst wieder Zeit gefunden um Eure Antworten zu lesen. Bei meiner Beschreibung habe ich vergessen, dass das Programm als Unterprogramm aufgerufen und einmal durchlaufen wird. An der stelle an der dieser Eingang abgefragt werden soll, warte ich auf den Pegel einer externen Hardware. Diese muss innerhalb von 50ms den Pegel auf lo ziehen, ist dies innerhalb dieser 50ms passiert soll via goto die Schleife verlassen werden. Ist der Pegel nach 50ms immer noch hi so wird ein Flag gesetzt und das Unterprogramm weiter abgearbeitet. Ich dachte so währe es die einfachste möglichkeit diese Abfrage zu gestalten. Natürlich bin ich für Ratschläge immer offen, denn so lernt man immer was dazu. Ich frage mich nun ob das ganze dann mit einem Timer nicht zu komplex wird. Da dieses Unterprogramm wie bereits erwähnt nur einmal durchlaufen werden soll und der Controller in dieser Zeit nichts weiteres zu tun hat. Ps. was ist so negativ an einem goto? MFG Helmuth
@ Helmuth (Gast) >Bei meiner Beschreibung habe ich vergessen, dass das Programm als >Unterprogramm aufgerufen und einmal durchlaufen wird. Dann musst du ggf. dein Programm neu strukturieren. > An der stelle an >der dieser Eingang abgefragt werden soll, warte ich auf den Pegel einer >externen Hardware. Diese muss innerhalb von 50ms den Pegel auf lo >ziehen, ist dies innerhalb dieser 50ms passiert soll via goto die >Schleife verlassen werden. Aua! > Ist der Pegel nach 50ms immer noch hi so wird >ein Flag gesetzt und das Unterprogramm weiter abgearbeitet. Das kann man alles SAUBER ohne goto machen. >Ich frage mich nun ob das ganze dann mit einem Timer nicht zu komplex >wird. Nein. >Da dieses Unterprogramm wie bereits erwähnt nur einmal durchlaufen >werden soll und der Controller in dieser Zeit nichts weiteres zu tun >hat. Goto ist trotzdem schlecht. Es erzeugt Spaghetticode, der stark zu Fehlern neigt. Ausserdem ist er ein Zeichen für unklares Denken des Programmierers. MFG Falk
@ Falk Kannst du mir den evtl. einen Tipp geben. Ich bin immer offen für neue Sachen. Denn bei dieser Sache stehe ich voll auf dem Schlauch, für mich war das so die geeignete Methode. MFG Helmuth
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.