ARDUINO BASICS #16 - INTERRUPTS für Timer und Taster verwenden

preview_player
Показать описание
An Tag 16 der Arduino-Basics Reihe erkläre ich, wie man mit Hilfe von Interrupts Zeitgesteuerte Events triggern oder einen Pin auf Statusänderungen überwachen kann, ohne Zeit, bzw. den Pin im Sketch abfragen zu müssen.

ACHTUNG!!!

Für alle die nicht die LEDs aus dem Adventskalender verwenden, Ihr müsst noch Vorwiderstände an den LEDs anschließen (wie im Schaltplan aus der Videobeschreibung zu sehen ist).
Die LEDs im Video besitzen einen integrierten Vorwiderstand!

----------------

Arduino-Basics ist eine Video-Serie, in der ich auf Neulinge im Bereich Arduino ausgerichtet die Grundlagen der Programmierung erklären möchte. Vielleicht ist aber auch das ein oder andere interessante für die erfahreneren Maker unter Euch dabei. Schaut doch einfach mal rein.

Da die meisten Tutorials sich eher auf den technischen Aspekt der Arduino-Projekte beziehen, habe ich als Software-Entwickler meinen Fokus in dieser Reihe eher auf die Software und Programmierung gelegt.

----------------

Das Sketch und den Schaltplan zum Video findet Ihr unter folgendem Link:

----------------

Folgende Komponenten benötigt Ihr zum nachbauen der Schaltung im Video:

--
Ihr möchtet meine Arbeit unterstützen?

Stöbert einfach mal durch meine Amazon Empfehlungen:

Oder schaut in meinem Fan-Shop vorbei:

Wenn Ihr etwas von Ebay oder Amazon bestellt, nutzt dafür gerne meine Affiliate-Links:

Oder spendet einen frei wählbaren Betrag unter:
oder

--
Kommt gerne auch auf unserem Discord vorbei:

--
Mein Video-Zubehör:

--
* Bei allen Amazon Links handelt es sich um Affiliate-Links. Heißt für jeden Kauf über die Links erhalte ich eine kleine Provision. Ihr bezahlt natürlich weiterhin den selben Preis wie sonst auch.
Vielen Dank für eure Unterstützung!
Рекомендации по теме
Комментарии
Автор

Sehr interessantes Video für mich. Interrupt kann ich in einem meiner nächsten Projekte gebrauchen.
Habs in meinen Büchern schon durchgelesen, nicht so recht kapiert, aber auch nichz vertieft, da ich es noch nicht benötige.

Es wird von Tag zu Tag interessanter.

moonwakler
Автор

👍
Ich nehme als Beispiel immer gerne den Regenmesser von einer Wetterstation. Da der Sketch mit der Abfrage der anderen Sensoren beschäftigt ist, muss er aber zu jedem Zeitpunkt fähig sein, dass auslösen der Regenwippe zu detektieren. Ich weiß ja nie ob es gerade regnet, oder wann die Wippe voll ist und eine Regenmengenmessung beendet ist. Das _muss_ immer funktionieren. Kommt der Luftdruck mal paar Sekunden später, ist dies nicht weiter schlimm.
So genau weiß ich das mit dem RAM auch nicht mehr. Ich meine das hätte etwas mit dem Speichermanagement von größeren Variablen zu tun. Die werden IMO dann segmentiert abgelegt und im Flash dann teilweise überschrieben. Das passiert im RAM nicht. Das Bootlogo für mein OLED liegt bspw. im RAM, genau so wie der 256Bit RSA key. Beides lief nicht, erst nach auslagern ins RAM.

sensai
Автор

"volatile" erzwingt, dass der Wert immer im RAM liegt und nicht in einem CPU Register. Das könnte durch einen Interrupt einen anderen Wert bekommen, wenn man den Wert in der Loop (außerhalb der Interrupt Routine) liest.

Deswegen müssen alle Werte die durch Interrupts beschrieben werden mit volatile gekennzeichnet werden.

Es kommt sogar noch schlimmer: Wenn der Wert größer als ein Byte ist (z.B. int), dann kann die Interrupt Routine diesen Wert nur byteweise speichern (der Arduino ist ein 8-Bit Prozessor, der kann max 1 Byte pro Maschinenbefehl lesen und schreiben). Beim Lesen aus der Loop kann man dann fehlerhafte Werte bekommen, weil beim auslesen eventuell ein Byte durch den Interrupt noch nicht geschrieben wurde.

Daher muss man in so einem Fall mit "ATOMIC_BLOCK" arbeiten. Innerhalb des so markierten Code-Bereichs kommen dann keine Interrupts durch und der Integer Wert kann vollständig und damit immer korrekt gelesen werden.

Da der ATOMIC_BLOCK Interrupts ausschaltet, muss der Code in diesem Block so kurz wie möglich sein.

Klimafutzi
Автор

Sehr gutes Video.
Ich muss ebenfalls einen Interrupt in meinem Projekt benutzen, nur soll ich bei mir die Zählrichtung toggeln. Ein Zähler wird mit der jeweiligen Zählrichtung alle 150ms um 2 hoch- oder runtergezählt. Beispielsweise soll die Zählrichtung (+2) zu (-2) geändert werden sobald ein Taster gedrückt wurde und andersherum. Haben sie vielleicht eine Idee wie man das in dem Interrupt hinkriegt.

farukalioglu
Автор

Mir ist klar das ich da keine großen Ausgaben über Serielle Schnittstelle machen sollte. Wie sieht es aber mit einer kleiner Schliefe aus die den Status von 5 oder 6 Druckknöpfen über einen 4051 Demultiplexer einliest. Ist das OK vom Zeitaufwand?

saschazapf
Автор

Wie macht man es, sodass die Lampe eine bestimmte Zeit lang leuchtet?

sipe
Автор

Eigentlich würde man das englisch aussprechen, da sich diese und die meisten Programmiersprachen (ich kenne zumindest keine deutsche Programmiersprache) vom Englischen herleiten lassen. Dann würde es "wolle_teil" ausgesprochen werden.
Zu "volatile" muss man eigentlich nur wissen, dass der Compiler die wegoptimieren würde, wenn das nicht dabei steht. Da es sich hier um einen "flüchtigen Wert" handelt.
Das kann eine Variable sein, die nur gelesen wird oder aber auch von innen und außen geändert werden kann. Der Compiler liest das und denkt sich "Was soll der Mist? Da ist für mich kein klarer Wert zu erkennen, also schmeiß ich das raus."

foldi
Автор

Mein Hinweis zu "volatile": Der Compiler hat beim Übersetzen unseres Programms die Möglichkeit, zu optimieren. Dabei legt er gerne Variablen in Register, statt ins RAM, denn auf Register kann der Prozessor viel schneller zugreifen. Oder der Compiler kürzt anderweitig ab, weil er der Meinung ist, die Variable könne sich eh nicht ändern. Bei Interrupts wäre das ein Problem, da auch die Interrupt Service Routine auf die selben Variablen zugreifen wird. Daher sage ich mit volatile: "Bei dieser Variable bitte nicht optimieren!"

EmbSys