Forum: Mikrocontroller und Digitale Elektronik _delay_ms() in der ArduinoIDE vs. AtmelStudio7


von Steff G. (steff_123)


Lesenswert?

Hallo Leute,

ich trau mich eigentlich fast nicht zu fragen, aber ich sitz jetzt schon 
2 Stunden vor dem kleinen Code und mein Gleichstrommotor macht nicht was 
er soll.

Hardware:
- Mega2560 Board
- Motortreiber
- bürstenbehafteter Gleichstrommotor

Grundsätzlich will ich das Board in C programmieren.
Ich nutze zur PWM-Ansteuerung eines Gleichstrommotors den 
_delay_ms()-Befehl.

Verwende den internen Bootloader vom Board und habe

#define F_CPU 1000000UL gesetzt.

Verwende ich nun die ArduinoIDE um den C-Code auf das Board zu kriegen, 
wird die Wartezeit ziemlich genau eingehalten.

Verwende ich hingegen AtmelStudio, so ergibt sich eine starke 
Zeitdifferenz.

Ich habe nun schon in anderen Beiträgen gelesen, dass es was mit dem 
internen Osszilator auf sich hat.
Ich bin leider noch Neuling auf dem Gebiet und wäre dankbar, falls mir 
jemand verständlich erklären könnte, warum ich eine Abweichung erhalte 
bzw. wie ich dieses Problem lösen kann um mit AtmelStudio 
weiterzuarbeiten.

Vielen Dank im Voraus

von Stefan F. (Gast)


Lesenswert?

Kontrolliere mal die Optimierungs-Option des Compilers. Wenn sie 
deaktiviert ist (Parameter -O0) funktioniert der Delay nicht richtig. 
Versuche es mit -Os oder -O2.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stefan G. schrieb:
> Verwende den internen Bootloader vom Board und habe
> #define F_CPU 1000000UL gesetzt.
Und welche Taktfrequenz hast du tatsächlich?

> Verwende ich hingegen AtmelStudio, so ergibt sich eine starke
> Zeitdifferenz.
Kannst du das auch quantitativ angeben? Wie lange dauern 1000ms?

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@ Stefan G. (steff_123)

>Ich nutze zur PWM-Ansteuerung eines Gleichstrommotors den
>_delay_ms()-Befehl.

warum nutzt du nicht einen echten Hardware-PWM Ausgang? Dazu muss man 
nur 2-3 Register konfigurieren.

Beitrag "Re: Arduino Mega 11 PWM-Pins mit 1kHz"

>Verwende den internen Bootloader vom Board und habe

>#define F_CPU 1000000UL gesetzt.

Warum? Die meisten Arduinos laufen auf 16 MHz und außerdem wird F_CPU 
schon von der Arduino-IDE definiert.

>Verwende ich hingegen AtmelStudio, so ergibt sich eine starke
>Zeitdifferenz.

Siehe oben.

>Ich habe nun schon in anderen Beiträgen gelesen, dass es was mit dem
>internen Osszilator auf sich hat.

Nö. Der ist ja in beiden Fällen gleich. Außerdem arbeiten die Arduinos 
mit einem externen Quarz bzw. Resonator.

>bzw. wie ich dieses Problem lösen kann um mit AtmelStudio
>weiterzuarbeiten.

Einfach die richtige Frequenz angeben, im Idealfall als globales #define 
per Compiler. Siehe Anhang.

von Rudolph R. (rudolph)


Lesenswert?

Ich denke das wesentliche zum Topic an sich wurde schon geschrieben.

Aber Tipp, sieh Dir das mal an:
http://www.visualmicro.com/page/Arduino-for-Atmel-Studio-7.aspx

Das ist ein Plugin für das Atmel-Studio mit dem man Arduino Projekte im 
Atmel-Studio öffnen, bearbeiten, compilieren und flashen kann.
Das benötigt weiterhin Arduino und verwendet auch dessen Compiler, so 
kann man zum Beispiel auch ESP8266 Arduino Projekte im Atmel-Studio 
bearbeiten, oder auch STM32.
Es gibt dann eine unter File/Open/ die neue Option "Arduino Project".
Beim Speichern kommen im Verzeichnis nur ein paar Dateien dazu und man 
könnte das ganze auch immer noch mit der ArduinoIDE öffnen.

Damit ist der Bruch zwischen Arduino und den ganzen Komfort-Funktionen 
zu direkter Programmierung vielleicht nicht ganz so hart.
Direkt die Register beschreiben kann man mit Arduino nämlich auch.

von Stefan F. (Gast)


Lesenswert?

Ich denke nicht, dass eure Hinweise bezüglich Arduino zur Anfrage 
passen.

von Steff G. (steff_123)


Lesenswert?

Vielen Dank für eure Antworten.

Hab jetzt #define F_CPU 16000000UL gesetzt und die Zeit wird 
eingehalten.

Spitze

von Curby23523 N. (Gast)


Lesenswert?

Rudolph R. schrieb:
> Das ist ein Plugin für das Atmel-Studio mit dem man Arduino Projekte im
> Atmel-Studio öffnen, bearbeiten, compilieren und flashen kann.
> Das benötigt weiterhin Arduino und verwendet auch dessen Compiler, so
> kann man zum Beispiel auch ESP8266 Arduino Projekte im Atmel-Studio
> bearbeiten, oder auch STM32.

Wie furchtbar. Das ist ja von hinten durch die Brust ins Auge. Das ist 
wie Linux auf einer VM unter Windows zu benutzen.

Der TO sollte eine Hardware PWM benutzen. Arduino wird irgend einen 
Unsinn vor dir verbergen (Konfiguration des µC). Daher solltest du dir 
gleich angewöhnen in Atmel Studio auf Registerbene mit Bitmasken zu 
programmieren - gerne auf einem Arduino Board, nur ohne die Arduino IDE.

EDIT: F_CPU gesetzt und es funktioniert, ok. Versuche dich trotzdem von 
_delay_ms zu trennenn (und gleichzeitig von der Arduino IDE). Das sollte 
man nur in ganz seltenen Fällen benutzen und schon gar nicht für eine 
PWM oder Motorsteuerung.

von Steff G. (steff_123)


Lesenswert?

Wie gesagt ich hab die ArduinoIDE nur dazu verwendet, um auf die 
schnelle zu testen, ob die Hardware (so wie ich sie aufgebaut habe) 
funktioniert.

Grundsätzlich schreibe ich das ganze rein in C und das ansprechen der 
einzelnen Register.

Da ich in einem weiteren Schritt einen Encoder auslesen möchte, wollte 
ich nochmal nachfragen, da ich oft gelesen habe, dass die interne Clock 
von manchen µC intern durch 8 geteilt wird.

Nur nochmals zum Verständnis : Das Mega2560 Board läuft mit 16MHz ??

Also läuft die System-Clock grundsätzlich mit 16MHz?


Sry für die Frage

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Alle (glaube ich jedenfalls) AVR Mikrocontroller haben einen Prescaler.

Bei den meisten Modelle kann man per Fuse einstellen, ob dieser 
Prescaler die Frequenz des Oszillators durch 8 teilt, oder nicht. Alle 
Modelle mit dieser Option haben den Prescaler im Lieferzustand 
aktiviert. Das heisst: Mit 16Mhz Quarz kommst du auf 2Mhz Systemtakt.

Bei vielen kann man darüber hinaus andere Teiler-Faktoren per Software 
einstellen.

Bei Arduino Modulen mit vorinstalliertem Bootloader sollte der Prescaler 
normalerweise deaktiviert sein.

> Also läuft die System-Clock grundsätzlich mit 16MHz?
Nein

von Steff G. (steff_123)


Lesenswert?

> Mit 16Mhz Quarz kommst du auf 2Mhz Systemtakt.

Aber warum funktioniert dann mein _delay_ms() nur richtig wenn ich
#define F_CPU 16e6 verwende und nicht #define F_CPU 2e6 ?

Ich bin mir nämlich jetzt nicht sicher, wie ich zum auslesen des 
Encoders die Perscaler für die Systemclock einstellen soll, wenn ich mir 
nicht sicher bin, mit welcher Frequenz die Systemclock läuft?

Oder steh ich grad komplett am Schlauch?

von Rudolph R. (rudolph)


Lesenswert?

Nils N. schrieb:
> Wie furchtbar. Das ist ja von hinten durch die Brust ins Auge. Das ist
> wie Linux auf einer VM unter Windows zu benutzen.

Das macht Atmel-Studio einfach nur zu einem Editor für Arduino Projekte.
Zum schnellen Rumspielen ist Arduino schon okay, nur die IDE geht gar 
nicht.

Ich wurde beruflich auch schon mehrmals dazu "gezwungen" Arduino in 
Projekten einzusetzen, weil das ja so schön hipp ist.
Mit einem richtigen Editor tut das schon mal weniger weh.
Und die Kollegen schauen dann erstmal verblüfft.

Klar kann man die .ino auch in Notepad++ oder Visual Studio Code laden,
mit dem Plugin kann man den Code aber auch unter Atmel-Studio bauen und 
flashen.

von Falk B. (falk)


Lesenswert?

@ Stefan G. (steff_123)

>Da ich in einem weiteren Schritt einen Encoder auslesen möchte, wollte
>ich nochmal nachfragen, da ich oft gelesen habe, dass die interne Clock
>von manchen µC intern durch 8 geteilt wird.

Nein. Man kann so einen Teiler beim AVR per Fuses einstellen, das ist 
aber nicht allgemeingültig.

>Nur nochmals zum Verständnis : Das Mega2560 Board läuft mit 16MHz ??

Ja.

>Also läuft die System-Clock grundsätzlich mit 16MHz?

Bei deinem Mega2560, ja!

von Stefan F. (Gast)


Lesenswert?

> Aber warum funktioniert dann mein _delay_ms() nur richtig wenn ich
> #define F_CPU 16e6 verwende und nicht #define F_CPU 2e6 ?

Na weil bei deinem µC wohl jemand den Presclaer umkonfiguriert hat. Wie 
gesagt ist das bei Arduino Modulen so üblich.

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.