Forum: Mikrocontroller und Digitale Elektronik ATmega32 Eingang zeitlich abfragen


von Helmuth (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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

von Helmuth (Gast)


Lesenswert?

Hallo Falk,

kannst du mir das bitte mal näher erläutern?
Stehe ein bischen auf dem Schlauch.

Helmuth

von Falk B. (falk)


Lesenswert?


von Helmuth (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@  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

von Helmuth (Gast)


Lesenswert?

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

von blubb (Gast)


Lesenswert?

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

von Hc Z. (mizch)


Lesenswert?

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>.

von Helmuth (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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

von Helmuth (Gast)


Lesenswert?

@ 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
Noch kein Account? Hier anmelden.