Forum

Einloggen | Registrieren | RSS  

Zahnlos72(R)

05.03.2023,
09:54
 

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms (Elektronik)

Hallo !
Ich bin neu hier und vermutlich auch im falschen Forum, aber vielleicht kennt sich ja doch jemand hier mit Programmierung aus ?!?
Kurze Schilderung des Problems:
Ich schalte mit:

PORTB = PORTB | B00100000;
PORTB = PORTB & B11011111;

den Ausgang 13 am Arduino in einer Schleife verschachtelt in einer zweiten Schleife ein und aus ....
Deswegen mit der direkten Registeranweisung, weil es mit
digitalWrite(13, LOW);
einfach zu langsam wäre !
Brauche low und high Zeiten zwischen 400 und 800 ns .... für ca. 8ms.
Soweit so gut, das geht ja so perfekt !
Nur die Ausgabe wird ca. alle 1ms unterbrochen wobei der Ausgang dann manchmal auf low und manchmal auch auf high für ca. 8µs hängen bleibt bevor die Schleife fortgesetzt wird.
Je nach dem, auf welchem Potential er sich zu dieser Zeit gerade befindet eben !
Habe ein Bild wo man sieht, wenn es auf high hängen bleibt ....
Woran könnte das liegen ???





PS: Programmierer sollten keinesfalls Analogkäse essen !!!

xy(R)

E-Mail

05.03.2023,
10:07

@ Zahnlos72

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms

» Nur die Ausgabe wird ca. alle 1ms unterbrochen wobei der Ausgang dann
» manchmal auf low und manchmal auch auf high für ca. 8µs hängen bleibt bevor
» die Schleife fortgesetzt wird.

» Woran könnte das liegen ???

Da läuft wohl ein Timer-Interrupt.

Zahnlos72(R)

05.03.2023,
10:13

@ xy

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms

» Da läuft wohl ein Timer-Interrupt.

Woher sollte das kommen ?

xy(R)

E-Mail

05.03.2023,
10:16

@ Zahnlos72

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms

» » Da läuft wohl ein Timer-Interrupt.
»
» Woher sollte das kommen ?

*Du* hast doch das komplette Programm. Du wirst eben etwas verwenden, das den Interrupt benötigt.

Zahnlos72(R)

05.03.2023,
10:22

@ xy

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms

» *Du* hast doch das komplette Programm. Du wirst eben etwas verwenden, das
» den Interrupt benötigt.


Bisher steht aber in der Loop nichts anderes als diese Schleifen !
Was könnte den Interrupt sonst auslösen ?

Thomas Kuster(R)

05.03.2023,
11:06

@ Zahnlos72

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms

Hallo Zahnlos72
Das System des Arduinos stellt für die Timing-Aufgaben in C einen 1ms-Timer zur Verfügung. Dieser wird mit einem internen Zähler des Atmel-Controllers realisiert und unterbricht somit den Programmlauf jede ms für ein paar Takte. Wenn man für die Erzeugung des pwm-Signals ebenfalls die Timer-Struktur des Prozessors nutzt, wird die Erzeugung nicht mehr von einem anderen timer-Interrupt unterbrochen. Google mal nach der pwm-Erzeugung für Arduino, da wird man sicher fündig.
Mit vielen freundlichen Grüssen Thomas

Zahnlos72(R)

05.03.2023,
11:14
(editiert von Zahnlos72
am 05.03.2023 um 11:19)


@ Thomas Kuster

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms

» Hallo Zahnlos72
» Das System des Arduinos stellt für die Timing-Aufgaben in C einen 1ms-Timer
» zur Verfügung. Dieser wird mit einem internen Zähler des Atmel-Controllers
» realisiert und unterbricht somit den Programmlauf jede ms für ein paar
» Takte. Wenn man für die Erzeugung des pwm-Signals ebenfalls die
» Timer-Struktur des Prozessors nutzt, wird die Erzeugung nicht mehr von
» einem anderen timer-Interrupt unterbrochen. Google mal nach der
» pwm-Erzeugung für Arduino, da wird man sicher fündig.
» Mit vielen freundlichen Grüssen Thomas

Hallo Thomas !

Kann man den Timer auch deaktivieren ?
Bzw. ... würde es nützen einen PWM Ausgang zu benutzen ???
lG

Thomas Kuster(R)

05.03.2023,
11:37
(editiert von Thomas Kuster
am 05.03.2023 um 11:37)


@ Zahnlos72

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms

Ja, beides ist möglich :
mit cli (clear interrupt) werden die timer-Interrupts ausgeschaltet
man kann aber auch zwei 8-Bit timer oder einen 16-Bit timer für die Erzeugung von pwm nutzen.
Mit vielen freundlichen Grüssen Thomas

Zahnlos72(R)

05.03.2023,
11:50
(editiert von Zahnlos72
am 05.03.2023 um 11:59)


@ Thomas Kuster

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms

» Ja, beides ist möglich :
» mit cli (clear interrupt) werden die timer-Interrupts ausgeschaltet
» man kann aber auch zwei 8-Bit timer oder einen 16-Bit timer für die
» Erzeugung von pwm nutzen.
» Mit vielen freundlichen Grüssen Thomas

Okay.... ausschalten wäre mir in diesem Falle lieber, weil ich auf nichts sonst reagieren möchte...
Das cli käme wo hin ???


aber ist auch delay(); nicht mehr zugänglich, oder ???

void ISR_anhalten () {
uint8_t sreg = SREG;
cli();
//irgendwas machen
SREG = sreg;
}

...so ?

oder gleich am Anfang der void Loop() ???

oder besser nur den Timer ausschalten per

TCCR2B &= ~(1 << CS22);

???


lG

Thomas Kuster(R)

05.03.2023,
11:55
(editiert von Thomas Kuster
am 05.03.2023 um 11:58)


@ Zahnlos72

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms

» » Ja, beides ist möglich :
» » mit cli (clear interrupt) werden die timer-Interrupts ausgeschaltet
» » man kann aber auch zwei 8-Bit timer oder einen 16-Bit timer für die
» » Erzeugung von pwm nutzen.
» » Mit vielen freundlichen Grüssen Thomas
»
» Okay.... ausschalten wäre mir in diesem Falle lieber, weil ich auf nichts
» sonst reagieren möchte...
» Das cli käme wo hin ???
»
» void ISR_anhalten () {
» uint8_t sreg = SREG;
» cli();
» //irgendwas machen
»
» SREG = sreg;
» }
»
Ja, in die Initialisierung vor dem loop müsste es passen.
» ...so ?
»
» oder gleich am Anfang der void Loop() ???
»
»
»
»
» lG

Zahnlos72(R)

05.03.2023,
12:00
(editiert von Zahnlos72
am 05.03.2023 um 12:02)


@ Thomas Kuster

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms

» Ja, in die Initialisierung vor dem loop müsste es passen.

aber dann ist auch delay(); nicht mehr zugänglich, oder ???

oder besser nur den Timer ausschalten per

TCCR2B &= ~(1 << CS22);
oder ist der Befehl nur für den Mega168 ???



lG

Mikee

05.03.2023,
12:39

@ Zahnlos72

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms

Hallo,

meine Zeiten als Programmierer sind schon lange vorbei, aber
so ein bisschen was ist noch hängen geblieben.

Wenn Du jegliche Unterbrechung Deiner Impulsfolge ausschließen willst,
wofür brauchst Du dann noch einen Arduino? Dann kannst Du die
Impulsfolge auch analog erzeugen. Dann kommen die Impulse einer wie der andere.

Willst Du Deine Impulsfolge später softwaretechnisch in irgend etwas einbauen,
vielleicht auch noch auf Tastendruck / Mausclick / Sensorsignal reagieren,
wirst du einen Interrupt brauchen. Und damit ist Dein System nicht mehr echtzeitfähig!
Es sei denn Dein Arduino idlet so vor sich hin, bis eine bestimmte Anzahl
an Timerimpulsen vorbei ist, um dann zeitnah eine Operation auszuführen.
D.h. Dein Timer muss deutlich schneller laufen als die Impulsfolge, die Du
erzeugen willst.
Einen Jitter wirst Du damit aber immer noch haben.

Mikee

Zahnlos72(R)

05.03.2023,
13:20

@ Mikee

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms

» Wenn Du jegliche Unterbrechung Deiner Impulsfolge ausschließen willst,
» wofür brauchst Du dann noch einen Arduino? Dann kannst Du die
» Impulsfolge auch analog erzeugen. Dann kommen die Impulse einer wie der
» andere.
»

Danke, aber ich will schon, dass die erzeugten Impulse ohne Unterbrechung am Ausgang erscheinen, weil sie sonst für das davon Angesteuerte keinen Sinn ergeben ! ( logisch oder ? )

Man kann ja dann den Interrupt wieder aktivieren ( wenn von Nöten ) !

lG

Zahnlos72(R)

05.03.2023,
15:25

@ Zahnlos72

unterbrochene Ausgabe eines Ausgangs am Arduino ca. alle 1ms

» Ja, in die Initialisierung vor dem loop müsste es passen.
Nein....
...es muss am Anfang ( also in der Loop gemacht werden ) und wenn man den Timer wieder braucht kann man ihn ja wieder aktivieren !

hat geklappt !

Vielen Dank Thomas !!!

lG