ATMEGA328 programmieren mit Arduino One

Einen wunderschönen Sonntag euch allen!

Ich möchte einen elektronischen Geocache bauen und möchte dafür einen Micocontroller programmieren.
Dieser soll u.a. einen Servo bedienen, was allerdings nicht funktioniert.

Direkt angeschlossen am Arduino One funktioniert alles wie gewünscht mittels <Servo.h>
Auf dem Microcontroller jedoch zuckt der Servo nur langsam vor sich hin, wenn überhaupt.

Zuerst benutzte ich einen ATMEGA2313, dann wurde mir aber geraten den gleichen Microcontroller zu verwenden, der auch auf dem Arduinobord ist. Gesagt getan, aber immer noch das selbe Problem.
Darüber hinaus ist mir aufgefallen, dass 1000ms im Sketch ca 1500ms in Echtzeit bedeuten. Ist eventuell darin der Fehler begründet?
Und wenn ja, wo muss ich was tun? Bin relativ neu in der Arduinowelt.

schon mal Danke für jegliche Hilfe!

Hast du einen neuen Microcontorller benutzt?
Wenn ja dann musst die sogenannten Fuses setzt da der Microcontroller im neuzustand auf 8mhz internen takt gesetzt ist und ein Teiler durch 8 aktiviert ist was einen Systemtakt von 1Mhz bedeutet.
Hast du einen Schaltplan bzw Sketch dann kann man besser helfen.
Nutzt du einen externen Quarz auf dem der neue Atmega sitzt oder den internen?
Wie groß ist dein Projekt (mal ne kleine Vorstellung)
Evtl reicht dir attiny84 mit dem kanst du auch Servos nutzten und hast mit 8kB Flash auch nicht das Problem der 2kB wie beim 2313.
Hier gibt es die Core Files und dein kleinen Tut für die attiny x5er/x4er Serien.

Gruß
DerDani

Lynax:
Direkt angeschlossen am Arduino One funktioniert alles wie gewünscht mittels <Servo.h>

Was ist ein Arduino One?
Meinst Du einen Arduino UNO?

Lynax:
Auf dem Microcontroller jedoch zuckt der Servo nur langsam vor sich hin, wenn überhaupt.

Meinst Du damit eine eigene Schaltung, die Du für einen Atmega-Controller selbst entworfen hast?
Was für eine Schaltung?
Abblockkondensatoren an der Stromversorgung vorhanden?
Stromversorgung zur Versorgung eines Servos ausreichend dimensioniert?

Lynax:
Und wenn ja, wo muss ich was tun?

Hm, so konkret wie Du fragst, würde ich mal sagen: Vermeide das falsche zu tun und mache das Richtige!

hi,

wenn Du einen 328er alleine programmieren und betreiben willst, hast Du einige möglichkeiten.

die einfachste ist, einen 328er mit bootloader zu kaufen (3,50 in DE), diesen in den UNO zu stecken (auf den einschnitt auf der schmalseite achten, genau so muß er rein), dort zu programmieren, wieder rauszuziehen und dann mit einem quarz und zwei kondesatoren zu betreiben. plus an plus neben dem quarz und an reset, gnd an gnd neben plus und die sache läuft. die restliche beschaltung wie in der beschreibung brauchst Du nicht, weil Du ihn im UNO programmierst.

http://www.erik-bartmann.de//download/BuildYourOwnArduino.pdf https://guloshop.de/shop/Mikrocontroller:::3.html

willst Du mehr machen als das, mußt Du genauer sagen, was Dein ziel ist.

gruß stefan

Hallo,

er meint bestimmt den Uno. Bald kommt jedoch der Zero. ;) http://www.heise.de/hardware-hacks/meldung/Entwicklerboard-Arduino-Zero-Uno-war-gestern-2190980.html Mit richtig viel Speicher, der verballert werden kann. Mein Spezialgebiet. :D

Okay, dann hole ich mal weiter aus und vorneweg, jap ich meine natürlich das Arduino UNO!

Wie bereits berichtet möchte ich in meinen Geocache einen Microcontroller integrieren, um u.a. einen (oder besser 2 - aber ich will erst mal einen zum Laufen bekommen) Servo anzusteuern.

Dieser soll über ein Tastenfeld bedienbar sein, bzw. sich bewegen, wenn der richtige Code eingegeben wurde.
Mit dem Tastenfeld habe ich an sich auch kein Problem, wohl aber mit der Steuerung der Servos:

Wenn ich den Servo an mein Arduino anschließe, dann funkioniert alles wie gehabt. Als Testsketch benutze ich etwas einfach gehaltenes:

#include <Servo.h>  

 

Servo servoblau;

 

void setup() 

{ 

servoblau.attach(8);

} 

 

void loop() 

{ 

servoblau.write(0);

delay(3000);

servoblau.write(90);

delay(3000);

servoblau.write(180);

delay(3000);

servoblau.write(20);

delay(3000);

}

Wenn ich den Code jedoch auf einen Micocotroller lade [Arduino as ISP] (zB auf einen ATMEGA328 oder auch auf den ATMEGA2313), dann passiert quasi gar nichts. Bestenfalls “zuckt” der Servo nur leicht, führt aber keine (gerichteten) Bewegungen aus.
Zur Schaltung: So einfach wie mögich:
Der Servo wird mit 5V versorgt und der dritte Pin kommt an den zugehörigen des Controllers.

Könnte es daran liegen, dass immer ein externer Quarz benutzt werden muss, der den Takt angibt?
Und eventuell durch die “falsche” Taktung auch die Servo Library Probleme bekommt und dadurch nicht funktioniert?

Naja, Takt braucht der Kleine schon, ohne geht nix. Wie sieht denn die Schaltung genau aus? Und wenn Du zwei Spannungsquellen verwendest Masse verbinden nicht vergessen.

Der Servo hat 3 Anschlüsse

Zwischen positiven und negativem Pol liegt eine Spannungsdifferenz von 5V,direkt vom Arduino angezapft, später werde ich die Schaltung per 9V-Batterie betreiben und mittels Spannungsregler auf 5V regulieren. Der 3te Pin ist am Controller angeschlossen.

Dann besorg ich mir mal einen Quarz!

Nicht nur den Quarz, sondern auch noch 2 Kondensatoren (auf den Quarz abgestimmt, so 33pF schätze ich mal).
Und nen 10er Pack 9-Volt Batterien würde ich auch gleich holen, die sind schneller leer als Du denkst! Anders gesagt: die sind keine gute Stromquelle für so ein Vorhaben, und ich schätze mal Du hast einen 7805 im Auge … noch schlechter!

das mit dem Stromverbrauch werden wir testen. Angedacht ist ohnehin, dass jeder Cacher, der unser Rätsel lösen will, ohnehin seine eigene (oder zwei oder zehn) 9V Batterie(n) mitnimmt.

Aber was meinst du damit, dass der 7805, genau den, den ich im Auge hab, "noch schlechter" ist?

Niedrige Kapazität gepaart mit einem Längsregler .... der verheizt die wenige Energie im Wortsinn sinnlos in die Gegend. Nicht wirklich effektiv. Nimm ne andere Batterie und nen Schaltregler, die gibts für kleines Geld pinkompatibel zum 7805 wenns nicht zu viel Strom sein soll.

Also für mich hört es sich so an, wie wenn Du einfach keinen Bootloader auf dem ATMega hast, oder den falschen, der ein Quarz verlangt. Es gibt auch Bootloader die den ATMega ohne Quarz mit dem internen Oszillator betreiben, und für so kleine Anwendungen reicht das meistens aus. Der schwingt dann je nach Bootloader nur mit 8MHz, aber für ein, zwei Servos sollte das ausreichen.

Grüße,

Sven

Lynax: Könnte es daran liegen, dass immer ein externer Quarz benutzt werden muss, der den Takt angibt?

Das ist nicht unbedingt notwendig. Aber ein Sketch muss für die Taktfrequenz kompiliert worden sein, mit dem der Controller auch tatsächlich läuft. Andernfalls stimmen die Timings nicht.

Lynax: Und eventuell durch die "falsche" Taktung auch die Servo Library Probleme bekommt und dadurch nicht funktioniert?

Richtig.

Wenn Du beispielsweise ein Programm für einen Arduino UNO (16 MHz Takt) kompilierst und dann auf einem nackten Atmega328 mit 8 MHz internem Takt laufen läßt, werden alle Zeiten doppelt so lang. Aus einen Refresh-Impuls von 1500µs für den Servo wird ein Refresh-Impuls von 3000µs, und damit läuft der Servo nicht. Die meisten Servos haben einen Funktionsbereich von ca. 1000 bis 2000µs Impulsdauer.

Wenn ein Sketch mit der Boardeinstellung "Arduino UNO" funktioniert und Du denselben Sketch auf einem "nackten Atmega328 mit 8 MHz internem Takt" laufen lassen möchtest, dann mußt Du wie folgt vorgehen:

  1. Deine "boards.txt" Datei muß einen Eintrag für einen Atmega328 mit internem 8 MHz Takt haben
  2. Du wählst diesen Eintrag als Board aus
  3. Zur Vorbereitung des Controllers einmalig die Funktion "Bootloader installieren" aufrufen
  4. Dann den Sketch hochladen

Für die Schritte 3. und 4. wird ein ISP oder "Arduino as ISP" benötigt.

Als Eintrag in der "boards.txt" für einen nackten Atmega328 mit 8 MHz internem Takt kannst Du dies verwenden:

atmega328bb8.name=ATmega328 (Breadboard, 1K Bootloader @ 8 MHz Internal)

atmega328bb8.upload.protocol=stk500
atmega328bb8.upload.maximum_size=31744
atmega328bb8.upload.speed=19200

atmega328bb8.bootloader.low_fuses=0xE2
atmega328bb8.bootloader.high_fuses=0xDC
atmega328bb8.bootloader.extended_fuses=0x05
atmega328bb8.bootloader.path=
atmega328bb8.bootloader.file=ATmegaBOOT_168_atmega328_8MHz.hex
atmega328bb8.bootloader.unlock_bits=0x3F
atmega328bb8.bootloader.lock_bits=0x0F

atmega328bb8.build.mcu=atmega328p
atmega328bb8.build.f_cpu=8000000L
atmega328bb8.build.core=arduino
atmega328bb8.build.variant=standard

Dazu die "boards.txt" mit einem Texteditor bearbeiten. Und sicherheitshalber eine Kopie der Originaldatei behalten.