Forum: Mikrocontroller und Digitale Elektronik arduino uno verhält sich nicht deterministisch


von Ajax (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

mein Arduino uno verhält sich ein wenig merkwürdig. In unregelmäßigen 
Abständen Toggelt sich der Pin nicht.

Hier ist der code den ich verwende:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
5
void setup() 
6
{
7
  DDRC  |= _BV(DDC0);
8
}
9
 
10
void loop()
11
{
12
 PORTC ^= _BV(PC0);
13
}

Das Oscilloscopebild hab ist im Anhang.

Ich kenne dieses Verhalten eigentlich nur im Zusammenhang mit 
Betriebsystemen...

Viele Grüße!

von Thomas (Gast)


Lesenswert?

Die integrierten Arduino Librarys haben sicherlich Interrupt-Routinen. 
So wird z.B. ein Timer des Atmegas verbraten nur damit die Funktion 
millis() die Millisekunden seit dem einschalten zurück geben kann.

Dein Arduino ist also schon deterministisch, du kennst nur nicht dem 
gesamten Programmcode :-)

Thomas

von Marc S. (marc_s86)


Lesenswert?

nur weil man arduinos benutzt heißt das nicht dass man auch die ide und 
"arduino c" nutzt.. das da oben ist normaler c code und hat nichts mit 
arduino zu tun.

von isidor (Gast)


Lesenswert?

Marc S. schrieb:
> das da oben ist normaler c code und hat nichts mit
> arduino zu tun.

Im Arduino ist üblicherweise per Ausliferungszustand ein
Bootloader draufprogrammiert. Der könnte - je nach Machart - auch
noch ein Eigenleben führen ......

von N. A. (hannilein)


Lesenswert?

Thomas schrieb:
> Die integrierten Arduino Librarys

Darf ich ein wenig Linguistik beitragen?
Der Plural von "Library" ist "Libraries".
Sorry für den Interrupt :-)

von isidor (Gast)


Lesenswert?

Marc S. schrieb:
> das da oben ist normaler c code und hat nichts mit
> arduino zu tun.

Doch, hat er. Die beiden Funktionen sind genau die, die
im Arduino als "Betriebssystem" verwendet werden ohne dass
sie vom Benutzer explizit aufgerufen werden müssen.

von isidor (Gast)


Lesenswert?

N. A. schrieb:
> Der Plural von "Library" ist "Libraries".

Und der Plural von "Handy" ist "Handies". Schreibt aber in
Deutschland keiner.

von Thomas (Gast)


Lesenswert?

Wie schon isidor bemerkt hat ist setup() und loop() nicht normales c... 
main() wäre es...

Und in der Arbeit sind das meistens nur libs. Einmal wenn mans richtig 
machen will ists falsch :-)

Thomas

von Ajax (Gast)


Lesenswert?

okay, hab mal reinen c-code verwendet und jetzt ist der Sprung 
tatsächlich raus. Außerdem toggelt der Pin schneller.

Fazit: mit Arduinos kann man zwar schnell ein Programm zusammen basteln 
aber man weiß nie was da wirklich passiert.

von Jürgen S. (jurs)


Lesenswert?

Ajax schrieb:
> Ich kenne dieses Verhalten eigentlich nur im Zusammenhang mit
> Betriebsystemen...

Bei den Arduino-Boards läuft standardmäßig Timer0 mit Interrupts, um die 
Funktionen millis() und micros() zur Verfügung zu stellen.

Wenn Du die Timer0-Interrupts nicht gebrauchen kannst, dann mußt Du 
entweder den Timer0 Interrupt deaktivieren, wenn Du im Programm die 
Funktionen setup() und loop() verwendest.

Oder Du schreibst anstelle von setup() und loop() gleich eine eigene 
main() Funktion.

Falls Dein Sketch eine eigene main() Funktion hat, verwendet die 
Arduino-IDE nicht ihre eigene main() Funktion und Du kannst anfangen, 
einen "nackten" Controller direkt und ohne die Arduino Komfortfunktionen 
zu programmieren.

von isidor (Gast)


Lesenswert?

Ajax schrieb:
> Außerdem toggelt der Pin schneller.

Klar, weil für jedes Toggeln die Funktion loop()
aufgerufen wird, was einen Overhead gegenüber dem den
direkten Betätigen des Ports (  PORTC ^= _BV(PC0); )
bedeuted.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.