switch

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?

// 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
    }
}

1udo1:
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

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.

Was willst Du mit diesem Vergleich?

pos==90;

Grüße Uwe

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

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.

1udo1:
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

uwefed:
Dann definier die Variabile wenigstens byte und nicht int.

ich sehe ein

case 292:

das könnte man sich bei einem byte sparen :wink:

Die Variable "count" muss nicht atomar definiert werden.

Wer hat dir das gesagt?
Wie kommst du darauf?

Programm läuft wie gewünscht.

Du hast da eine Handgranate eingebaut.
Die kann jederzeit hoch gehen.

Du hast da eine Handgranate eingebaut.
Die kann jederzeit hoch gehen.

Jetzt übertreib mal nicht :wink:

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.

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.
.

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

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!

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

? ? ?

combie:
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

michael_x:
ich sehe ein

case 292:

das könnte man sich bei einem byte sparen :wink:

Im Sketch am Anfang sind andere Werte und auf die hab ich nich bezogen.

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

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

Ich halte das für eine blöde Entscheidung. Gerade, weil ich hin und wieder mal anderer Meinung war oder bin. Unterschiedliche Meinungen sind das Salz in der Suppe.

Einen Urlaub hast Du allerdings verdient :slight_smile: Genieße ihn und schick ab und zu 'ne Karte.

Gruß

Gregor

Macht euch keine Sorgen...

Wir können den Wind nicht ändern, aber die Segel anders setzen.
Quelle: Aristoteles

Wenn der Wind des Wandels weht, bauen die einen Schutzmauern, die anderen bauen Windmühlen.
Quelle: Unbekannt

Mit den Schutzmauern, bin ich fertig...
Jetzt sind die Windmühlen dran!

Hi

Mir ist der Hintergrund dieser Entscheidung nicht geläufig - lasse Dir aber gesagt sein: Ich habe eine 'Windmühle' einige Meter oberhalb der Garage und damit wohl den einzigen Punkt ganz Deutschlands entdeckt, an Dem KEIN WIND geht (für ein 500W Windrad sollten in >3Jahren mehr als 200Wh (NICHT kWh) drin sein).

In der Hoffnung, auch zukünftig von Dir zu lesen.

MfG

den einzigen Punkt ganz Deutschlands entdeckt, an Dem KEIN WIND geht

Wurde das Ding mit einer Transportsicherung geliefert?

Hi

Danke der Nachfrage, aber das Ding dreh schon ab und zu 'wie blöd' - also so 100% kein Wind war übertrieben :confused:
Nur eben nicht über längere Zeit, und eben arg selten.
Werde (irgend wann) einen Arduino da dran setzen, Der mir die Drehzahl mitloggen soll - Da kommt ja 3-Phasen-Drehstrom raus, Dessen Frequenz ich erkennen können sollte - nur dafür, daß ich sehe, daß das Teil auch 'den Tag über dreht'.

Der Laderegler ist auch nur ein simpler Drehstrom-Brückengleichrichter - erst, wenn die generierte Spannung ausreicht, also über der Akku-Spannung ist, wird Dieser geladen.
Also auch bei moderaten Drehzahlen, wenn nur 10V 'vom Dach kommen', bekomme ich davon Nichts in den Akku - an dieser Front wollte ich auch Mal was ändern.

Offen hatte ich den Generator auch schon - Transportsicherung war weder vorgesehen, noch vorhanden.
Einzig das Spulenpaket und der Magnet-Rotor, mit, für meinen Geschmack, zu viel Abstand (3mm bestimmt) - will auch Mal überarbeitet werden - wofür hat man 'ne Drehbank ... irgendwann :wink:

Die nächste Aktion an dem Windrad wird eine Seilwinde sein, damit man das Trumm auch alleine 'umlegen' kann - momentan brauche ich dafür 3 Mann :o (was aber bei passendem Wetter, einem Grill und einem Bier durchaus kurzweilig sein kann)

MfG