Bei Dir fehlt das setup(), oder wird das nur nicht angezeigt? Wenn Du darin den Pin 4 nicht auf INPUT_PULLUP setzt, kann es passieren, dass der Zustand undefiniert ist und solche merkwürdigen Effekte auftreten.
Arduino-Programmierung: Bin ich oder der Erfinder der Programmiersprache zu blöd?
-
Retro-Rentner -
13. Juni 2022 um 21:33 -
Erledigt
Es gibt 137 Antworten in diesem Thema, welches 17.616 mal aufgerufen wurde. Der letzte Beitrag (
-
-
Bei Dir fehlt das setup(), oder wird das nur nicht angezeigt? Wenn Du darin den Pin 4 nicht auf INPUT_PULLUP setzt, kann es passieren, dass der Zustand undefiniert ist und solche merkwürdigen Effekte auftreten.
Passiert auch wenn man explizit INPUT einstellt. Dann floated der Eingang aber. Siehe meinen Edit, bzw. hier: Bitte melde dich an, um diesen Link zu sehen.
-
Naja, der eingang ist ja nicht auf PULLDOWN programmierbar, von daher würde ich sagen floated der fröhlich herum. Bei INPUT_PULLUP ist der ja automatisch HIGH, floated nicht, und wird aktiv LOW gezogen durch drücken. Du müsstest bei der Verdrahtung also vielleicht noch hochohmig nach GND eine Strippe ziehen, damit der Taster richtig funzt? Die Simulation ist da vermutlich nicht perfekt.
EDIT: habe das mal hier gemacht: Bitte melde dich an, um diesen Link zu sehen.
Habe ich auch gerade gemacht, klappt nun!

-
Genau das Floaten meinte ich ja.
Übrigens sind die Schaltbilder alle falsch. Bei root42 sollte der Taster mit GND verbunden wird; der Eingang wird ja durch den Pullup auf 5V gezogen. Beim Drücken des Tasters geht der Eingang dann auf LOW. Bei nicht gedrückten Taster ist er HIGH. Der externe Widerstand am Taster ist vollkommen unnötig!
So meinte ich: Bitte melde dich an, um diesen Link zu sehen.
-
Übrigens sind die Schaltbilder alle falsch. Bei root42 sollte der Taster mit GND verbunden wird; der Eingang wird ja durch den Pullup auf 5V gezogen. Beim Drücken des Tasters geht der Eingang dann auf LOW. Bei nicht gedrückten Taster ist er HIGH. Der externe Widerstand am Taster ist vollkommen unnötig!
?????
Für mich sieht das eindeutig so aus, als würde der Eingang durch den externen Pull-Up-Widerstand auf GND gezogen,
nicht auf 5V.
Ein interner Pull-Up wird doch in dem Beispiel nicht genutzt.
-
Pull Up zieht auf 5V, Pull Down würde auf GND ziehen. Gibt es aber nicht. Schau mal mein Beispiel oben an, das habe ich hier nochmal verlinkt:
Bitte melde dich an, um diesen Link zu sehen.
-
Übrigens sind die Schaltbilder alle falsch. Bei root42 sollte der Taster mit GND verbunden wird; der Eingang wird ja durch den Pullup auf 5V gezogen. Beim Drücken des Tasters geht der Eingang dann auf LOW. Bei nicht gedrückten Taster ist er HIGH. Der externe Widerstand am Taster ist vollkommen unnötig!
?????
Für mich sieht das eindeutig so aus, als würde der Eingang durch den externen Pull-Up-Widerstand auf GND gezogen,
nicht auf 5V.
Ein interner Pull-Up wird doch in dem Beispiel nicht genutzt.
Also ich habe da mal einen "externen Pulldown" Widerstand eingebaut, damit ich keinen Kurzschluss vom GPIO zu GND habe. Dachte das macht man so. Ich bin aber nur Softwareentwickler, daher kann ich mich auch täuschen. Und beim Druck auf den Taster geht der GPIO dann auf HIGH -- vielleicht lag da Kosmas Verwirrung? Denn Retro-Rentner hat es genau UMGEKEHRT zur ursprünglichen Lösung mit dem INPUT_PULLUP implementiert, nämlich geht er von LOW == aus und HIGH == an aus.
-
noTone() wird gar nicht benötigt! Verwende als dritten Parameter als Delay einfach den gleichen Wert, wie für das delay(), dann funktioniert das genau so.
Bitte melde dich an, um diesen Link zu sehen.
-
Stimmt, damit kam ich durcheinander. Der Pullup wird intern über einen 10k-Widerstand erzeugt, also kann man keinen Kurzschluss bekommen, wenn man GND verbindet.
Das mit dem Pullup ist die minimalste und damit m.M.n. eleganteste Lösung, weil man keine weiteren unnötigen Bauteile benötigt. Man muss nur darauf achten, dass der Taster dann aktiv LOW ist und nicht HIGH, was manche etwas verwirrt. Diese Lösung findet man aber auch nicht immer im Internet oder Büchern.
-
Das geht beim 328 nicht.
"Standardmäßig stellt Arduino mit der Funktion "attachInterrupt()" beim Uno nur 2 Interrupt-Pins (Pin D2 und D3) zu Verfügung. Durch entsprechende Registerprogrammierung kann aber bei jedem Ein-/Ausgangspin ein "Pin Change Interrupt" ausgelöst werden."
Quelle: Bitte melde dich an, um diesen Link zu sehen.
Mfg Jood
-
Jood, ich weiß, was anderes habe ich doch auch nicht gesagt, oder warum postest Du das? Der 328 kann das nur bei Pin 2 und 3, bei anderen Mikrocontrollern sieht das andrers aus.
Siehe auch hier, das ist die offizielle Info-Seite dazu: Bitte melde dich an, um diesen Link zu sehen.
-
ch weiß, was anderes habe ich doch auch nicht gesagt, oder warum postest Du das? Der 328 kann das nur bei Pin 2 und 3, bei anderen Mikrocontrollern sieht das andrers aus.
Ich poste das weil, die Aussage falsch ist, auch der Uno kann einen Interrupt auf jedem Pin,
lediglich direkt aus dem Arduino Dialekt ist das nicht möglich.
Code
Alles anzeigen#include <avr/interrupt.h> volatile int value = 0; void setup() { cli(); PCICR |= 0b00000011; // Enables Ports B and C Pin Change Interrupts PCMSK0 |= 0b00000001; // PCINT0 PCMSK1 |= 0b00001000; // PCINT11 sei(); Serial.begin(9600); } void loop() { Serial.println(value); } ISR(PCINT0_vect) { value++; } ISR(PCINT1_vect) { value–; }Quelle: Bitte melde dich an, um diesen Link zu sehen.
Mfg Jood
-
Was habt ihr eigentlich ständig mit Interrupts?
C
Alles anzeigenconstexpr auto TonPin = 8; constexpr auto LedPin = 9; constexpr auto TasterPin = 11; // std::chrono wäre schöner, gibts aber bei Arduino auf AVR nicht constexpr unsigned long operator "" _minuten(unsigned long long m) { return 60UL * 1000UL * m; } constexpr unsigned long operator "" _sekunden(unsigned long long s) { return 1000UL * s; } constexpr unsigned long operator "" _millisekunden(unsigned long long ms) { return ms; } constexpr auto Wartezeit = 10_minuten; //constexpr auto Wartezeit = 10_sekunden; enum class Zustand { Warten, AlarmTief, AlarmHoch, AlarmBeenden }; Zustand aktuellerZustand; unsigned long inZustandSeit; void wechsleZustand(Zustand neuerZustand); // Workaround für kaputte Arduino-Magie void wechsleZustand(Zustand neuerZustand) { aktuellerZustand = neuerZustand; inZustandSeit = millis(); } void konfiguriereAlarm(bool hoherTon) { if (hoherTon) { digitalWrite(LedPin, LOW); // LED aus tone(TonPin, 200); // hohen Ton ausgeben } else { digitalWrite(LedPin, HIGH); // LED an tone(TonPin, 100); // niedrigen Ton ausgeben } } void setup() { pinMode(LedPin, OUTPUT); digitalWrite(LedPin, LOW); pinMode(TonPin, OUTPUT); digitalWrite(TonPin, LOW); pinMode(TasterPin, INPUT_PULLUP); wechsleZustand(Zustand::Warten); } void loop () // Hauptschleife { auto aktuelleZeit = millis(); auto tasterStatus = digitalRead(TasterPin); switch (aktuellerZustand) { case Zustand::Warten: if ((inZustandSeit + Wartezeit) < aktuelleZeit) { wechsleZustand(Zustand::AlarmTief); konfiguriereAlarm(false); } break; case Zustand::AlarmTief: if (tasterStatus == LOW) { // Taster gedrückt wechsleZustand(Zustand::AlarmBeenden); } else if ((inZustandSeit + 500_millisekunden) < aktuelleZeit) { // blinken und Tonhöhe wechseln alle 0.5 Sekunden konfiguriereAlarm(true); wechsleZustand(Zustand::AlarmHoch); } break; case Zustand::AlarmHoch: if (tasterStatus == LOW) { // Taster gedrückt wechsleZustand(Zustand::AlarmBeenden); } else if ((inZustandSeit + 500_millisekunden) < aktuelleZeit) { // blinken und Tonhöhe wechseln alle 0.5 Sekunden konfiguriereAlarm(false); wechsleZustand(Zustand::AlarmTief); } break; case Zustand::AlarmBeenden: digitalWrite(LedPin, LOW); noTone(TonPin); wechsleZustand(Zustand::Warten); break; } } -
noTone() wird gar nicht benötigt! Verwende als dritten Parameter als Delay einfach den gleichen Wert, wie für das delay(), dann funktioniert das genau so.
Bitte melde dich an, um diesen Link zu sehen.
Da funktioniert gar nichts, jede Menge Fehlermeldungen.

-
Also zwei simple For-Next-Schleifen im C64-Basic, mit einem Input (oder GET?).
Bislang 70 Beiträge, um das Ding auf dem Arduino zum Laufen zu bekommen.
Auf dem C64 wäre das in höchstens 3 Beiträgen abgehakt.

-
Ich poste das weil, die Aussage falsch ist, auch der Uno kann einen Interrupt auf jedem Pin,
Danke, das ist mir neu. Das ist aus Deinem Statement so nicht hervorgegangen. Dazu muss man erst dem Link folgen. So einfach wie mit dem Pin 2 und 3 scheint das aber nicht zu sein.
Unseen: Schön, ein endlicher Automat!
Dass es auch ohne Interrupts geht, steht weiter oben. -
Ich kapier´ aktuell (unter anderm *gggg*) nicht, warum bei dem Programm
Bitte melde dich an, um diesen Link zu sehen.
Leider ein ganz schlechtes Beispiel bzw. ein gutes Beispiel, wie man sowas mit dem Arduino nicht machen sollte.

Die do-while-Schleife innhalb von loop() ist Mist. Das sollte man sich gar nicht erst angewöhnen. Das ist aber eine Eigenart der Arduino- bzw. Steuerungsprogrammierung. Die Hauptschleife sollte nach Möglichkeit immer ohne größere Verzögerungen komplett durchlaufen werden. Sonst bekommt man Probleme, wenn die Aufgaben mal etwas komplexer werden oder wenn vielleicht mal mehrere Funktionen gleichzeitig ausgeführt werden sollen.
Der Schalter sollte wegen dem bereits nicht erwähnten nicht vorhandenen Pulldown-Widerstand nach Masse schließen und nicht nach Plus.
Vergesst dieses grottenschlechte Beispiel!

-
Das sind mMn Dinge, um die man sich am Anfang noch nicht wissen und um die man sich später kümmern kann. Es ging doch darum, dem Threadstarter als Anfänger zu helfen, wie er das Programm überhaupt zum Laufen bekommt. Das Problem ist hier doch nicht so komplex, dass man auf eine schlanke Hauptschleife achten muss. Das Beispiel von Unseen ist da natürlich besser, aber das ist auch viel länger und erstmal schwerer nachzuvollziehen.
-
Das sind mMn Dinge, um die man sich am Anfang noch nicht wissen und um die man sich später kümmern kann. Es ging doch darum, dem Threadstarter als Anfänger zu helfen, wie er das Programm überhaupt zum Laufen bekommt. Das Problem ist hier doch nicht so komplex, dass man auf eine schlanke Hauptschleife achten muss. Das Beispiel von Unseen ist da natürlich besser, aber das ist auch viel länger und erstmal schwerer nachzuvollziehen.
Doch gerade als Anfänger. Sonst gewöhnt man sich das an und fängt dann beim nächsten Problem (zwei Taster und zwei Leds
) wieder komplett von vorne an. Ich frage mich, wie oft man als Anfänger wieder von vorne anfängt, bis man entnervt aufgibt. 
Es geht auch etwas einfacher als in Unseens Beispiel.
-
Als Anfänger ist man aber auch froh über jeden Erfolg. Die Lernkurve geht ja nicht von jetzt auf gleich steil nach oben. Mit dem Argument könntest Du auch sagen, die Arduino IDE ist Mist, programmier lieber gleich im AVR Studio und mach es richtig.
Es geht aber hier nicht um professionelle Softwareentwicklung, sondern um Spaß an der Sache und um das Verstehen.Wie würdest Du es denn machen?
-