Go Down

Topic: switch (Read 950 times) previous topic - next topic

1udo1

Hallo,

die switch-Anweisung funktioniert nicht. Der PWM-Impuls bleibt bei ca. 0,5 ms Sekunden hängen. Stimmt die syntax der switch-Anweisung nicht?

Code: [Select]


// Servo 

#include <Servo.h>
 volatile int count=0, pos;

Servo servo; 
   

void setup()
{
     noInterrupts();   
     TCCR2A = 0;
     TCCR2B = 1 << CS10 | 1 << CS11 |  1 << CS12;  // prescale 1024
   
     TIMSK2 |= (1 << TOIE2);   
     interrupts();   
     servo.attach(11);
     
 }

ISR(TIMER2_OVF_vect)
{
    count++; // ca. alle 22ms bei prescale 1024
}

void loop()
{
 
     switch (count)
    {
    case 46: pos==90; servo.write(pos);  break;  // ca. 1 Sekunde
    case 92:  pos==120; servo.write(pos); count=0; break; // ca. 2 Sekunden
    }
}

gregorss

#1
Mar 02, 2018, 03:03 am Last Edit: Mar 02, 2018, 03:16 am by gregorss
Stimmt die syntax der switch-Anweisung nicht?
Ich habe zwar keine Antwort, die Dir unmittelbar weiterhilft, aber eine Bemerkung zum Code: Wenn Du Dir die Fehlersuche erleichtern möchtest, solltest Du unbedingt „schön" programmieren. D. h. passende und gleich große Einrückungen, einheitliche Klammersetzung usw.
Das schützt zwar nicht vor logischen Fehlern, aber es erleichtert das Lesen des Codes sehr. IMO eine der besten Waffen beim Bekämpfen von Fehlern.

Sollte Deine Anweisung syntaktisch falsch sein, schlägt das Kompilieren des Codes fehl und es wird eine entsprechende Fehlermeldung ausgegeben. Falls Du keine Fehlermeldung erhältst, ist es wahrscheinlich, dass Du es mit einem logischen Fehler zu tun hast. Glückwunsch und Beileid, die sind besonders fies.

Gruß

Gregor
„Ich glaube, ich leg' mich noch mal hin", sagte das Bit.

combie

#2
Mar 02, 2018, 06:41 am Last Edit: Mar 02, 2018, 06:56 am by combie
Erstens:
Dein Zugriff auf count ist nicht atomar. Das solltest du ändern.

Zweitens:
Du rufst servo.write(pos) ca 2200 mal nacheinander, innerhalb von 22ms, auf. Willst du das?

Drittens:
Warum du pos mit irgendwelchen Zahlen vergleichst, das Resultat dann aber verwirfst, kann ich dir nicht verraten. Ich denke, das solltest du nochmal überdenken.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

uwefed

#3
Mar 02, 2018, 07:53 am Last Edit: Mar 02, 2018, 07:53 am by uwefed
Was willst Du mit diesem Vergleich?
Code: [Select]
pos==90;
Grüße Uwe

1udo1

FUNZT!!!

Danke für Eure Antworten. Geholfen hat mir der Hinweis auf die Anweisung in der switch. Hatte das"==" übersehen, weil ich mich müde programmiert hatte. Kopf qualmte schon. So einen Schreibfehler übersieht man nach langer Grübelei.

Nochmals Danke an Uwe, der den Schreibfehler entdeckt hat.

Hier die Korrektur

Code: [Select]


switch (count)
    {
    case 146: pos=180; servo.write(pos);  break;
    case 292:  pos=0; servo.write(pos);count=0; break;
    }


Die Variable "count" muss nicht atomar definiert werden. Zumindest nicht in diesem Fall. Programm läuft wie gewünscht.

uwefed

FUNZT!!!
...
Die Variable "count" muss nicht atomar definiert werden. Zumindest nicht in diesem Fall. Programm läuft wie gewünscht.
Dann definier die Variabile wenigstens byte und nicht int.
Grüße Uwe

michael_x

Dann definier die Variabile wenigstens byte und nicht int.
ich sehe ein
case 292:
das könnte man sich bei einem byte sparen ;)

combie

Quote
Die Variable "count" muss nicht atomar definiert werden.
Wer hat dir das gesagt?
Wie kommst du darauf?

Quote
Programm läuft wie gewünscht.
Du hast da eine Handgranate eingebaut.
Die kann jederzeit hoch gehen.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

michael_x

Quote
Du hast da eine Handgranate eingebaut.
Die kann jederzeit hoch gehen.
Jetzt übertreib mal nicht ;)

Ein Interrupt passiert nur alle 22 ms.
count ändert sich also höchstens einmal während des loop-Durchlaufs.
Jeder Wert von count wird in loop erwischt.

"Passieren" würde nur was, wenn loop den Wert auf 0 setzt, während die ISR gleichzeitig den Wert eins hochzählt. Und wenn gerade ein Überlauf ins HIGH - Byte von count passiert. Dann kann es sein, dass loop den Wert nicht auf 0 zurücksetzt, sondern auf 256 oder 1. Das ist aber keine "Handgranate", sondern würde wohl kaum auffallen. Und nur äußerst selten überhaupt passieren.

Aber du hast natürlich Recht: Nur weil man beim Testen den Fehler nicht bemerkt, heisst es noch lange nicht, dass etwas richtig ist. Und komplizierte Überlegungen, wie wenig schlimm das Verhalten im Fehlerfall ist, kannsollte man sich ersparen, indem man es einfach richtig macht.

combie


Im stillen Kämmerlein, kann jeder das machen, was er für ausreichend erachtet.
Aber eine Empfehlung für den Rest der Welt darf das nicht werden.
.

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

postmaster-ino

Hi

Trotzdem darf ein Anfänger hier SEHR GERNE Seinen Code vorstellen.
Wenn wir hier nur noch hoch qualifizierten Code dulden, können wir auch gleich einpacken - Jeder von uns musste sich die Kniffe erst selber beibringen.
Bei Ihm klappt das Beispiel, Er ist (zu Recht) ein bisschen stolz auf Sich und bietet Seinen Code den Anderen an - ich finde Das äußerst löblich.
Ob der Code der Weisheit letzter Schluß ist - darum kümmern Sich dann schon Andere *wink* - und jeder zukünftige Anfänger kann sowohl den Code wie die Bedenken zu Diesem hier nachlesen.
Hier wird ja nicht das Allheilmittel schlechthin suggeriert, sondern nur ein funktionierender Code.
Verbesserungswürdig: klar.
Mit großen Schnitzern, Die auch Mal weh tun können: hier wohl auch gegeben - deshalb sind wir ja hier, um darauf hinzuweisen.

Wer nur mittels C&P programmiert, dem ist das ganze unterhalb des Code eh egal, also werdet bitte wieder etwas ruhiger.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

combie

Ich denke mal, jetzt ist es an der Zeit, dass ich mich eine Weile aus dem Forum hier zurückziehe.

//---

Ich möchte mich herzlich, bei euch, für das bedanken, was ich hier lernen durfte!

Danke!
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

ElEspanol

#12
Mar 02, 2018, 10:30 pm Last Edit: Mar 02, 2018, 10:30 pm by ElEspanol
Ich denke mal, jetzt ist es an der Zeit, dass ich mich eine Weile aus dem Forum hier zurückziehe.
? ? ?

Tommy56

#13
Mar 02, 2018, 10:42 pm Last Edit: Mar 02, 2018, 10:59 pm by Tommy56
Ich denke mal, jetzt ist es an der Zeit, dass ich mich eine Weile aus dem Forum hier zurückziehe.
Das halte ich für eine krasse Fehlentscheidung.

Du wirst doch nicht wegen eines "Gutmenschen" das Feld räumen. Diese haben der Menschheit bisher nur Schaden gebracht. "Gut gemeint" ist fast nie "gut gemacht".

Gruß Tommy

Edit: Du und Deine Kenntnisse würden mir (und wohl auch dem Forum) echt fehlen
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

uwefed

ich sehe ein
case 292:
das könnte man sich bei einem byte sparen ;)
Im Sketch am Anfang sind andere Werte und auf die hab ich nich bezogen.
Code: [Select]
switch (count)
    {
    case 46: pos==90; servo.write(pos);  break;  // ca. 1 Sekunde
    case 92:  pos==120; servo.write(pos); count=0; break; // ca. 2 Sekunden
    }

Den Post #4 hab ich übersehen.
Grüße Uwe

Go Up