Forum: Compiler & IDEs _delay_ms Funktion und Interrupts


von Rush .. (rush)


Lesenswert?

Mal kurze Frage zur Delayfunktion?
Funktioniert die Hardwareperipherie (Timer/Counter, ICP-Interrupt, etc.) 
eines Atmel Controllers auch zum Zeitpunkt einer _delay_ms Funktion?
Werden, wenn sich der Controller gerade ind er Delayfunktion befindet 
zum Beispiel Interrupts erkannt, oder funktioniert die Tastenentprellung 
mittels Timer trotzdem oder mach der Controller zu diesen Zeitpunkt 
wirklich überhaupts nicht ??

So, dat wars schon?

von Oliver (Gast)


Lesenswert?

Die delay-Funktionen sind nichts anderes als Programmschleifen. Der 
Prozessor arbeitet da ganz normal sein Programm ab, alle Interrupts, 
Timer, etc. sind natürlich voll funktionsfähig.

Teilweise ausschlaten kann man den über die verschiedenen sleep-Modi zum 
Stromsparen. Da sind dann je nach Modus nicht mehr alle Interrupts und 
Timer funktionsfähig. Das hat mit delays aber nichts zu tun.

Oliver

von Rush .. (rush)


Lesenswert?

Alles klar, dankeschön.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Oliver wrote:
> Die delay-Funktionen sind nichts anderes als Programmschleifen. Der
> Prozessor arbeitet da ganz normal sein Programm ab, alle Interrupts,
> Timer, etc. sind natürlich voll funktionsfähig.

Das schon, wenn man damit leben kann, dass die Warteschleifen nicht mehr 
akkurat arbeiten, also wenn sie fuer nichts zeitkritisches verwendet 
werden.

von wt (Gast)


Lesenswert?

Michael hat recht. Es ist dringend zu empfehlen, die ISR auszuschalten.
etwa:

#asm("cli")
delay_ms(2);
#asm("sei")

Für unkritische Sachen kann man sich kurze eigene Delay Funktion 
schreiben.

von Falk B. (falk)


Lesenswert?

@wt (Gast)

>Michael hat recht. Es ist dringend zu empfehlen, die ISR auszuschalten.
>etwa:

Quark. Das KANN notwendig sein, IST es aber meistens nicht.

>Für unkritische Sachen kann man sich kurze eigene Delay Funktion
>schreiben.

Quark^2. Dann erinden 99% aller Leute das Rad neu, nur eckig. Die 
Funktionen der libc sind gestestet und funktionieren prima.

MFG
Falk

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Falk Brunner wrote:

>>Michael hat recht. Es ist dringend zu empfehlen, die ISR auszuschalten.
>>etwa:
>
> Quark. Das KANN notwendig sein, IST es aber meistens nicht.

Insbesondere hatte der OP ja gerade befürchtet, dass der Prozessor
während eines _delay_XX sonst nichts mehr machen könnte, was ihn
offenbar gestört hätte.

von Karl H. (kbuchegg)


Lesenswert?

Eben.

Die Quintessenz kann nur sein:
WENN man ISR weiterlaufen haben möchte UND gleichzeitig genaues Timing 
benötigt, DANN sind die _delay_xx Funktionen nicht das geeignete Mittel.

von wt (Gast)


Lesenswert?

@ Falk

ich rede über wirkliche RealTime Systeme. Du bewegst Dich anscheinend 
irgendwo auf der Stufe zwischen RS232 und 2x16 LCD. Nicht mal vernünftig 
genaue Zeitmessung lässt sich mit deiner Methode implementieren.
Mir bleibt nur die Hoffnung, daß die 99% der Leute anders denken als Du.

gruß

von wt (Gast)


Lesenswert?

Es gibt hier bereits paar Beiträge, die genau mit diesem Thema sich 
auseinander setzen.

von Oliver (Gast)


Lesenswert?

>ich rede über wirkliche RealTime Systeme.
1
#asm("cli")
2
delay_ms(2);
3
#asm("sei")

ROTFL

Immerhin erzielst du mit diesem Code eine garantierte Nicht-Reaktion von 
2ms. Ist in gewisser Weise auch "Real-Time".

Oliver

von Falk B. (falk)


Lesenswert?

@wt (Gast)

>ich rede über wirkliche RealTime Systeme.

Sieht man gleich . . .

> Du bewegst Dich anscheinend
>irgendwo auf der Stufe zwischen RS232 und 2x16 LCD.

Oh Meister, ich bin deines Blickes unwürdig.

> Nicht mal vernünftig
>genaue Zeitmessung lässt sich mit deiner Methode implementieren.

War das das Thema?

>Mir bleibt nur die Hoffnung, daß die 99% der Leute anders denken als Du.

Bleibt nur die Hoffnung, dann nicht alles solche Dampfplauderer sind wie 
du. Ja ich weiss, dies Hoffnung stribt recht schnell ;-)


@ Oliver (Gast)

>Immerhin erzielst du mit diesem Code eine garantierte Nicht-Reaktion von
>2ms. Ist in gewisser Weise auch "Real-Time".

Das ist ein "I've got really time" System, auch als Jamaika-Stil bekannt 
;-)

MfG
Falk

von Rush .. (rush)


Lesenswert?

Leute streitet doch nicht :-D

Wollte doch nur wissen ob der Prozessor für den delaymoment sich aufs 
ohr legt und "nicht ansprechbar" ist oder ob er nebenbei doch noch ISR's 
abarbeiten kann. Das wurde ja schon ganz am Anfang geklärt...

von wt (Gast)


Lesenswert?

@Oliver

#asm("cli")
delay_ms(2);
#asm("sei")

klar ist das ein quatsch, es ging ja um grundsätzliche Vorgehensweise 
mit Funktionen wie delay_us oder _ms. Wenn der ISR nich aus ist kann ich 
mich nicht darauf verlassen, daß 2us auch 2us sind.

@Rush
Du siest, die Meinungen gehen ganz schön außeinander.

@Falk
kein Kommentar, bleib auf der Wolke, wo Du bist.

gruß
Euer Dampfplauderer

von Oliver (Gast)


Lesenswert?

>klar ist das ein quatsch,

Das du das nicht ernst meinst, kann ich auf den ersten Blick nicht 
erkennen.

>Wenn der ISR nich aus ist kann ich
>mich nicht darauf verlassen, daß 2us auch 2us sind.

Das kannst du sowieso nicht. Ein paar % Abweichung hast du immer, so 
genau läuft kein Quarz.

Ausserdem steht oben in deinem Code nicht us, sondern ms. Und "Real 
Time" bedeutet, zu wissen, wie groß die Abweichung von 2ms werden darf, 
und zu garantieren, daß das eingehalten wird. Das kann je nach 
Anforderung und Gesataltung der ISR-Routinen bedeuten, alle Interrupts 
vorher zu sperren, muß es aber nicht.

Oliver

von wt (Gast)


Lesenswert?

meine Rede!

wenn du die %-Abweichung vom Quarz mit betrachten muß, weil es System 
erfordert, wirst Du vermutlich mit vordefinierter Fkt. delay_us nicht 
glücklich, immerhin sind das bei 10% Abweichung vom 16MHz Quarz +-6ns. 
Die Frage ist in welchen Fällen kannst Du so eine Abweichung dulden.

Bei der Diskussion delay_ms oder _us ist es egal, welche Zeit dahinter 
steht, denn die Programmierung beider Funktionen vom Prinzip her gleich 
ist.

Unter RealTime, wie Du schon sagst, verstehe ich die Fähigkeit des 
Systems genau dannn reagieren, wie ich das als Designer vorgebe. und 
wenn ich sage, daß ein System 2us, ms oder std. lamm gelegt werden muß, 
dann muß genau diese Zeit eingehalten werden.

von Rolf Magnus (Gast)


Lesenswert?

>>Wenn der ISR nich aus ist kann ich
>>mich nicht darauf verlassen, daß 2us auch 2us sind.
>
> Das kannst du sowieso nicht. Ein paar % Abweichung hast du immer,
> so genau läuft kein Quarz.

Wo findet man denn einen Quarz mit mehreren Prozent Abweichung?

von wt (Gast)


Lesenswert?

wahrscheinllich in China, muß Du aber Dich richtig gut anstrengen, 
standart mit 30-50ppm kriegst Du an jeder Ecke:)

von Thomas W. (wagneth)


Lesenswert?

...darf man zusammenfassen :

1. Der µC-takt bestimmt den Systematischen Fehler.
Die ppm-Angabe auf dem Quarz(-oszi was auch immer) macht bei einer 
"Wartezeit" von 2ms nur einen unbedeutenden Fehler.

2. Bei sequentieller Programmierung macht delay.h Sinn und hat ihre 
Berechtigung.

3. Bei Interruptgesteuerter Prg. ist es sicherlich unschön mit den 
delay-funktionen zu warten.
Je nach ISR kann sich der Fehler stark verändern oder ist immer 
gleichmassig vorhanden.

Ein Counter im Timer zählenzu lassen wäre doch deutlich eleganter.
Bzw den Code schon gar für den Interruptbetrieb auslegen...

von wt (Gast)


Lesenswert?

schöner könnte ich auch nicht schreiben:)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Thomas W. wrote:

> 3. Bei Interruptgesteuerter Prg. ist es sicherlich unschön mit den
> delay-funktionen zu warten.

Als allgemeine Grundregel passt das.  Aber es gibt halt (wie immer :)
auch Ausnahmen von der Regel: für sehr kleine Verzögerungen lohnt
das Anwerfen eines Timers in der Regel nicht.  Wenn du also den
E-Impuls für einen HD44780 (LCD-Controller) erzeugen willst, der
minimal 500 ns breit sein soll, dann ist es schon sinnvoll, einfach
_delay_us(0.5) zu schreiben.  Ob man drumrum noch die Interrupts
blockiert oder nicht, wäre in diesem Falle ziemlich wurscht, da
die 500 ns ja eine minimale Impulsbreite sind.  Wenn halt ein
Interrupt reinfunkt, wird der Impuls breiter, stört auch nicht.

Für alles, was langsameres Timing ist (so ab vielleicht 10 ms
aufwärts), wird man über kurz oder lang bei einem Hintergrund-
Timer rauskommen, der diesen  Takt vorgibt -- selbst dann, wenn man
sonst mit Interrupts in seinem System nicht viel am Hut hat.

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.