budo's Web
Hier findet ihr einiges zu meinen Hobbies

Arduino Umgebung

Unter dem Stichwort "Arduino Umgebung beschreibe ich ein paar Details, worauf bei der Programmierung in der Arduino Hardware- und Software-Umgebung zu achten ist, wenn es z.B. um ein exaktes Timing geht.

Digital Output

Der Digital Output Test dient der Demonstration von Zeiten, die bei Mikrocomputer üblich sind und die bei zeitkritischen Anwendungen berücksichtigt werden müssen. Die Software ist trivial, 3 Portbefehle und 3 digitalWrite-Befehle hintereinander. Die Oszillogramme sehen aber erstmal etwas anders aus als (der Laie) erwartet. Es fehlt der 2. High-Puls der Port-Befehle, die dicken Impulse starten mit einem High und enden mit einem halben Low-Puls.

sw

Digital Outout Applikation, Auschnitt "loop"

do

do

Digital Outout Oszillogramm, komplett

Digital Outout Oszillogramm, Detail (Port-Befehle-Pulse)

Die Lesart der Diagramme ist wie folgt (siehe Diagramm): Die Port-Pulse (blau) haben eine Pulsbreite von 125ns (2 Takte) und die digitalWrite-Pulse (grün) eine Pulsbreite von etwa 3.9µs (ca. 39 Takte). D.h. jeder Puls hat seine entsprechende Verzögerungszeit. Die Pulsbreite bildet sich durch die Verzögerungszeit des nächsten Pulses. Aus diesem Grund sehen wir einen schmalen Low-Impuls, da dem Port-Befehl für Low ("1") ein Port-Befehl für High ("2") folgt und wir sehen folgend einen dicken High-Puls, da dem Port-Befehl für High ("2") der "gemütliche" digitalWrite Befehl für Low ("3") folgt, der eine entsprechend große Verzögerung hat. Der "halbe" Low-Impuls, der den Abschluss bildet (vor den schmalen Impulsen) entspricht dem digitalWrite für Low, dem im Loop wieder ein Port-Befehl für High folgt. D.h., die Impulsbreite bildet sich aus der Verzögerung des Loops ("4", orange, 12 Takte) und der kleinen Verzögerung durch den Port-Befehl ("5", blau, 2 Takte).

pz

Darstellung der einzelnen Puls-Phasen

Man sieht hier, dass jeder Befehl seine Laufzeit (Taktanzahl) hat, die man berücksichtigen muss. Der schnellste Takt den man erzeugen kann ist bei einem 16MHz Takt 4 MHz, vorausgesetzt man geht nicht über loop. (Andere Kontrollstrukturen wie IF, FOR, WHILE, ... oder der Aufruf einer Sub-Routine reduzieren natürlich auch das Ergebnis.

Delay

Die Funktion delayMicroseconds erzeugte bei einem Microstep-Simulator (Sinus per PWM) Chaos, da ein Sinus halt auch den Amplitudenwert "0" hat. Der nachfolgende Test (1 Puls mit und 1 Puls ohne Verzögerung) zeigt die Reaktion der delay() bzw. delayMicroseconds() Funktionen auf die minimalen Parameter 1 und 0.

ms

ms

delay(1)

delay(0)

ms

ms

delayMicroseconds(1)

delayMicroseconds(0)

Bei Parameter 1 stimmt die gemessene Verzögerung wie erwartet. Bei Parameter 0 dagegen reagieren die beiden Funktionen unterschiedlich. Die Funktion delay() erzeugt eine Verzögerung von 3.8µs, also quasi 0, während die Funktion delayMicroseconds eine Verzögerung von ca. 16400µs erzeugt, d.h. einen Überlauf des unsigned int Wertes bei 16383. D.h. bei delay(0) erzeugt man das Minimum und bei delayMicroseconds(0) dagegen das Maximum an Verzögerung.

Analoge Anzeige

Der Arduino hat ja keinen echten analogen Ausgang. Für manche Anwendungen wäre aber eine einfache analoge Anzeige (unabhängig von der Möglichkeit einer seriellen Ausgabe) von Vorteil. Die Lösung ist hierfür ein einfaches Zeigerinstrument und eine PWM Ausgabe. Ein analoges Multimeter (AMM) gibt es teilweise preisgünstiger als ein Einbauinstrument. Ein einfachen Spannungsteiler, mit dem die maximale Spannung (+5V) an den Messbereich des AMM angepasst und der Eingangswiderstand des AMM per Potentiometer kompensiert wird, genügt

ms

Adaption für PWM am analogen Multimeter

ms

Anzeige am AMM

Berücksichtigt werden muss dabei allerdings, dass die analoge Anzeige per Zeigerinstrument nur für langsame Vorgänge (>=200ms pro Schritt) sinnvoll ist.

Smooth-Filter (digitales Tiefpass-Filter)

Siehe Smooth-Filter für digitale Signale

Watchdog Timer

Die Watchdog Timer Funktion eines Arduinos kann unterschiedlich eingesetzt werden. Einmal, wie der Name schon sagt, als Watchdog, der überprüft ob sich das Programm "aufhängt", oder als Wecker, der ein Programm vom Sleep Mode wieder "erweckt". Die Watchdog Funktion kann dabei als Interruptroutine oder als Reset umgesetzt werden. Bei der Watchdog Funktion als Reset kann man aber Überraschungen erleben. Der Prescaler, der die Watchdog Timer Zeit definiert, wird beim Reset zurückgesetzt, so dass sofort der 2. Watchdog mit der kürzesten Zeit durchgeführt wird, da die Watchdog Funktion selber nicht zurückgesetzt wird. Das Zurücksetzen der Watchdog Funktion über wdt_disable() ist in einem Arduinoprogramm im setup() nicht möglich, da der kürzeste Watchdog schneller aktiv ist als dass das setup() durchgeführt wird. Hierzu muss man die Programmzeilen.

ms

vor dem setup() einfügen. Ein Aufruf der Funktion im setup() oder loop() ist nicht erforderlich. Die Funktion wird vor dem Beginn von setup() durchgeführt.

PWM auf ATtiny

Bei Arduino gilt generell, dass nur das was in der Arduinoumgebung implementiert ist auch mit dieser funktioniert, bzw. dass sonstige Dinge eben low level programmiert werden müssen. Für die PWM Funktion auf den kleinen ATtinys bedeutet dies, dass für ATtiny core (Bezeicnungen ohne @) und arduino-tiny (Bezeicnungen mit @) bei den ATtiny 25/45/85 die PWM Funktion für die Ports PB0/PB1/PB4 funktioniert und für die Ports PB3 und PB2 nicht, wobei PB2 hierfür sowieso nicht vorgesehen ist. Beim ATtiny13 (smeezekitty's core13) funktioniert nur Port PB0.

Arduino NANO als ISP-Programmer

Der Arduino NANO bietet sich von seiner Größe her als ISP-Programmer an, um den andauernen Verdrahtungsumbau eines Arduino UNO zu vermeiden. Der Aufbau kann mit einem Steckbrett vorgenommen werden oder als fester Aufbau mit einer kleinen Leiterplatte in einem Gehäuse. Zuerst spielt man das Programm ArduinoISP.ino von Randall Bohn auf den NANO. Der Reset Pin des NANO wird dann mit einem 10uF Kondensator gegen GND blockiert, so dass der NANO keinen Reset mehr durchführen kann. An die Pins D9 .. D7 kann man LEDs mit Vorwiderständen für "Heartbeat", "Error" und "Programming" anschließen. Die Verkabelung zwischen dem Programmer (NANO) und dem Zielprozessor kann entweder über die äußeren Pins oder über den ISP-Stecker des NANO erfolgen. Angeschlossen werden die Leitungen VCC, GND, SCK(D13), MISO(D12), MOSI(D11) und SW-RESET(D10). Erfolgt die Verkabelung über den ISP-Stecker des NANOs, so muss hier die RESET Leitung von Pin 5 unterbrochen und an den SW-RESET(D10) geführt werden. Die Bedienung entspricht der bei "Using an Arduino as an AVR ISP".

ms

NANO als ISP. Links das ISP-Kabel zum Zielprozessor, mit der unterbrochenen RESET-Leitung und der hierfür verlängerten SW-RESET-Leitung (schwarz) vom D10. Links unten der Kondensator am RESET-Signal und unten die optionalen LEDS.


Nach Oben