www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega32 Eingang zeitlich abfragen


Autor: Helmuth (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Helmuth (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Falk,

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

Helmuth

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Helmuth (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Helmuth (Gast)
Datum:

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

Autor: blubb (Gast)
Datum:

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

Autor: Hc Zimmerer (mizch)
Datum:

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

Autor: Helmuth (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Helmuth (Gast)
Datum:

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

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.