Forum: Mikrocontroller und Digitale Elektronik Arduino Zeit Problem


von Moor (Gast)


Lesenswert?

Ich habe ein Problem mit Zeit und dem Arduino.

Ich möchte jedes mal wenn Eingang  2 (Intterrupt) einen Impuls bekommt, 
einen Summer ansteuern.

Das mache ich so:

digitalWrite(SUMMER, HIGH);
delay(1); //1mS wait;
digitalWrite (SUMMER,LOW);

Das funktioniert.

Wenn ich den delay weglass, dann hört man es fast nicht.

Problem:
Wenn man viele Impulse bekommt, werden Pulse vergessen.Zb. bei 1500HZ 
werden nur ~900 Pulse angezeigt. Und das Display aktualsiert auch sehr 
schlecht.

Ich glaube es ist zuviel Aufand würd den Arduino, kann man mit anderen 
Bauteilen eine Schaltung bauen welche auf eine Flanke vom Arduino den 
Summer 1mS ansteuert?

Wenn ja, hat jemand einen Schaltplan?

von Peter II (Gast)


Lesenswert?

Moor schrieb:
> Ich glaube es ist zuviel Aufand würd den Arduino

einfach einen Timer (PWM) sinvoll nutzen, dann kostest das auch keine 
Zeit im Arduino.

von Moor (Gast)


Lesenswert?

Mit PWM kann man doch nur z.b. töne am Summer machen?

zb. analogWrite(SUMMER,200) ?

von Jan B. (do9jhb)


Lesenswert?

Hi,

Es gibt Summer die den Ton selbst erzeugen, da kannst/musst du nur einen 
Pin mit digitalWrite() high setzen.
Wenn du einen Summer hast der ein externes Frequenzsignal will, dann 
wäre es am einfachsten mit der tone() Funktion ( 
https://www.arduino.cc/en/reference/tone) von Arduino.

Hoffe das hilft dir.

von Peter D. (peda)


Lesenswert?

Moor schrieb:
> Zb. bei 1500HZ
> werden nur ~900 Pulse angezeigt.

Ein MC kann keine negativen Zeiten erzeugen.
1ms Delay braucht 1ms, 1500Hz sind aber nur 0,67ms Zeit je Periode.

: Bearbeitet durch User
von JensM (Gast)


Lesenswert?

Wie ich verstanden habe werden die Impulse auch gezählt.

Ob bei jedem Impuls der Summer ertönt ist sicher nicht wichtig.

Ich würde in der Interrupt Funktion eine globale Variable hochzählen 
(votaile nicht vergessen) und in der Loop Funktion diese auf Änderung 
prüfen. Bei Änderung wird der Summer betätigt und die Anzeige 
aktualisiert.

Allgemein gilt, dass die Interruptfunktion möglichst kurz gehalten 
warden muss.

Gruß JensM

von Nop (Gast)


Lesenswert?

Moor schrieb:

> Das mache ich so:
>
> digitalWrite(SUMMER, HIGH);
> delay(1); //1mS wait;
> digitalWrite (SUMMER,LOW);

Du hast doch wohl nicht etwa das delay in der Interruptroutine?!

von Nop (Gast)


Lesenswert?

Peter D. schrieb:

> Ein MC kann keine negativen Zeiten erzeugen.

Dafür braucht man halt  schon einen schnellen Mehrkernprozessor, 
eventuell auch noch mit Unterstützung der Grafikkarte.

von Marty McFly (Gast)


Lesenswert?

Nop schrieb:
> Peter D. schrieb:
>
>> Ein MC kann keine negativen Zeiten erzeugen.
>
> Dafür braucht man halt  schon einen schnellen Mehrkernprozessor,
> eventuell auch noch mit Unterstützung der Grafikkarte.

Ach, und damit kann man dann "negative Zeiten" erzeugen? ;-)

von Andreas I. (andy5macht)


Lesenswert?

Marty McFly schrieb:
> Nop schrieb:
>> Peter D. schrieb:
>>
>>> Ein MC kann keine negativen Zeiten erzeugen.
>>
>> Dafür braucht man halt  schon einen schnellen Mehrkernprozessor,
>> eventuell auch noch mit Unterstützung der Grafikkarte.
>
> Ach, und damit kann man dann "negative Zeiten" erzeugen? ;-)

nicht direkt, aber wenn man damit den Fluxkompensator steuert ;)

: Bearbeitet durch User
von Nop (Gast)


Lesenswert?

Marty McFly schrieb:

> Ach, und damit kann man dann "negative Zeiten" erzeugen? ;-)

Ja klar, sofern man einen Linuxkernel mit Echtzeiterweiterungen 
installiert 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.