Forum: Mikrocontroller und Digitale Elektronik ATmega8 und Dynamixel AX-12+


von Oskar M. (oskarus)


Lesenswert?

Hallo Zusammen

Ich habe mir ein Robotis Dynamixel AX-12+ Servo bestellt.

Seit paar Tagen bin ich am recherchieren, ob man AX-12+ mit ATmega8 
betreiben kann und ich habe bisher keine richtige Antwort auf meine 
Frage gefunden.

Gemäss meinen bisherigen Informationen muss man über 1Mbps mit AX-12+ 
kommunizieren und ich denke (oder nehme an), dass man 1Mbps mit ATmega8 
nicht hinkriegt.

Ich möchte hier die Frage starten, ob jemand von Euch mit AX-12+ und mit 
ATmega Chips (Bsp. ATmega8-16PU oder ATmega328P-20PU) Chips erfahrungen 
hat. Und ob es möglich ist, dass man ein eigenes Controller 
zusammenbauen kann.

Für Eure Hilfe bedanke ich mich jetzt schon.

Grüsse
Oskar

von Peter D. (peda)


Lesenswert?

Oskar Mobardov schrieb:
> ich denke (oder nehme an), dass man 1Mbps mit ATmega8
> nicht hinkriegt.

Annehmen ist keine gute Idee, Datenblatt lesen ist besser.

Für 1Mbps muß Du nen 8MHz oder 16MHz Quarz anschließen.


Peter

von Daniel H. (danielch)


Lesenswert?

Hallo Oskar,

auf dieser Seite: 
http://www.trossenrobotics.com/dynamixel-ax-12-robot-actuator.aspx
steht bei unten bei den AX-12 Actuator Specs folgendes:
Com Speed  7343bps ~ 1Mbps
Ich nehme an das sind der Bereich zwischen minimaler und maximaler 
Datenrate, du musst also keineswegs Datenraten von 1 Mbps bereitstellen.
Ist wohl auch sinnlos, da ein Servo die Befehle gar nicht schnell genug 
ausführen kann, bei 1 Mbps.

lg daniel

von Peter D. (peda)


Lesenswert?

Daniel H. schrieb:
> auf dieser Seite:
> http://www.trossenrobotics.com/dynamixel-ax-12-robot-actuator.aspx
> steht bei unten bei den AX-12 Actuator Specs folgendes:
> Com Speed  7343bps ~ 1Mbps

Initial ist leider 1MBaud, d.h. man braucht erstmal unbedingt 1MBaud, um 
es runter setzen zu können.

Da hat man also nicht nachgedacht.
Initial sollte eine Standardrate, z.B. 9600Baud sein, Hochsetzen ist 
dann kein Problem.


Peter

von Daniel H. (danielch)


Lesenswert?

Ok, dass steht tatsächlich im Manual. Sinnvoll ist es meiner Meinung 
aber nicht. Sollte aber kein Problem für den Threadstarter darstellen, 
da man 1 MBaud mit einem ATmega erreicht.

lg daniel

von Oskar M. (oskarus)


Lesenswert?

Hallo Zusammen

Vielen Dank für Eure "sehr" schnelle Antworten und Kommentare.

1MBps wird schon vorausgesetzt. Mindestens als Initial.

Wenn ich im Internet recherchiere, dann lese ich, dass ich nur mit 
ATmega8 1MBps nicht erreiche. Könnt ihr mir das bitte kurz bestätigen?

Hier ist das Manuel-Dokument vom AX-12+
http://robosavvy.com/site/docs/Bioloid/AX-12(english).pdf

Und im Dokument steht: "To operate the Dynamixel actuators, the main 
controller must support TTL level half duplex UART."

Ist so etwas mit ATmega8-16PU oder ATmega328P-20PU möglich oder muss ich 
unbedingt ein Atmega 128 haben? Robotis bietet einen Controller CM-5 und 
bei diesem Controller wird ATmega128 verwendet.

@Peter Dannegger: Für 1Mbps muß Du nen 8MHz oder 16MHz Quarz 
anschließen.
Peter, verstehe ich Dich richtig. Ich kann dann mit ATmega8 und 16MHz 
Quarz das Teil zum Laufen bringen?

@Daniel H.: Sollte aber kein Problem für den Threadstarter darstellen,
da man 1 MBaud mit einem ATmega erreicht.
Wie erreiche ich 1Mbps mit ATmega8? Auch mit Quarz oder geht es auch 
ohne? :-)

Ich nehme an, es gibt keine fertige Anleitung, wie man mittels ATmega8 
ein AX-12 Servo zum Laufen bringt?

Viele Grüsse
Oskar

von Daniel H. (danielch)


Lesenswert?

Oskar Mobardov schrieb:

> Wenn ich im Internet recherchiere, dann lese ich, dass ich nur mit
> ATmega8 1MBps nicht erreiche. Könnt ihr mir das bitte kurz bestätigen?

ATMega8 Datasheet Seite 159:
siehe Tabelle; falls Atmel recht hat, erreichst du mit einem ATMega8 
1Mbps


> Und im Dokument steht: "To operate the Dynamixel actuators, the main
> controller must support TTL level half duplex UART."

Hier http://www.w-r-e.de/robotik/data/downl.htm unter 
Applikationen>SoftUART findest du Beispielcode in C für einen ATMega128.
Der Code müsste sich an den mega8 anpassen lassen, da nur ein 
8bit-Counter und ein Interrupt-Pin benötigt werden, welche beim mega8 
vorhanden sind.


> Ist so etwas mit ATmega8-16PU oder ATmega328P-20PU möglich oder muss ich
> unbedingt ein Atmega 128 haben? Robotis bietet einen Controller CM-5 und
> bei diesem Controller wird ATmega128 verwendet.

Siehe Beispielcode von oben. Sollte sich wie gesagt auf einen mega8 
umschreiben lassen.


> @Daniel H.: Sollte aber kein Problem für den Threadstarter darstellen,
> da man 1 MBaud mit einem ATmega erreicht.
> Wie erreiche ich 1Mbps mit ATmega8? Auch mit Quarz oder geht es auch
> ohne? :-)
Soweit ich weiss, kann es ohne gehen. Das ist dann allerdings eher 
Zufall, deshalb wird ein Quarz nicht schaden. Kosten tun die auch nicht 
die Welt und mit Quarz bist du auf der sicheren Seite.


> Ich nehme an, es gibt keine fertige Anleitung, wie man mittels ATmega8
> ein AX-12 Servo zum Laufen bringt?
Google befragen. Vielleicht findet sich was, versuchs mal mit "AX-12 
Servo arduino", falls du Arduino verwenden willst, oder dir die dort 
verwendeten Libs mal ansehen willst.

lg daniel

von Oskar M. (oskarus)


Lesenswert?

Hallo Daniel

Vielen Dank für Deine Antworten.

Ich werde mich bestimmt eine Weile mit dem Code beschäftigen.

Wenn ich Neuigkeiten habe, werde ich mich nochmals melden.

Du hast mir mehrere Stunden geschenkt! Vielen Dank!

Viele Grüsse
Oskar

von Oskar M. (oskarus)


Lesenswert?

Hallo Zusammen

Ich versuche seit mehreren Stunden, den Code anzupassen (portieren 
ATmega128 ==> ATmega8), den Du mir empfohlen hast.

Im Code gibt es eine Stelle:
// External Interrupt 0 initialization (for RX)
EICRA &= 0xFC;
EIMSK |= 0x01;
EIFR  |= 0x01;

die ich für ATmega8 übersetzen muss...

Unter ATmega128 Datenblatt steht für
EICRA: External Interrupt Control Register A – EICRA
EIMSK: External Interrupt Mask Register –EIMSK
EIFR: External Interrupt Flag Register – EIFR

Ich habe im ATmega8 Datenblatt-Dokument nach den entsprechenden Stellen 
gesucht aber es gibt keine 1:1 Treffen.

Daher meine Frage, ob die folgende Übersetzung korrekt ist:
EICRA ersetzen durch UCSRA
EIMSK ersetzen durch TIMSK
EIFR ersetzen druch TIFR

Vielleicht bin ich auch komplett falsch.

Für eine Hilfe wäre ich Euch sehr dankbar.

Viele Grüsse
Oskar

von Daniel H. (danielch)


Lesenswert?

Oskar Mobardov schrieb:

> Im Code gibt es eine Stelle:
> // External Interrupt 0 initialization (for RX)
> EICRA &= 0xFC;
> EIMSK |= 0x01;
> EIFR  |= 0x01;
>
> die ich für ATmega8 übersetzen muss...
>
> Ich habe im ATmega8 Datenblatt-Dokument nach den entsprechenden Stellen
> gesucht aber es gibt keine 1:1 Treffen.
>
> Daher meine Frage, ob die folgende Übersetzung korrekt ist:
> EICRA ersetzen durch UCSRA
> EIMSK ersetzen durch TIMSK
> EIFR ersetzen druch TIFR
>
> Vielleicht bin ich auch komplett falsch.

Ich denke du bist falsch, das TI... steht für Timer. EI.. external 
Interrupt und GI.. für General Interrupt.
Ich denke folgende Entsprechungen sollten stimmen:
EICRA -> MCUCR
EIMSK -> GICR
EIFR  -> GIFR

Datenblatt ATmega8 Seite 66 gibt genauer Auskunft über die Funktion der 
Register. Lies diesen Abschnitt, wenn dann noch fragen offenbleiben, 
frag ruhig.

lg daniel

von Oskar M. (oskarus)


Lesenswert?

Hallo Daniel

Danke für Deine Antwort...

Die Änderungen habe ich gemäss Deine Antwort durchgeführt...

Im original Source Code steht
OCR0  = DATA_BIT_LENGTH;       // set timer reload value (1 bit)

Gemäss Dokumentation (sowie ich es beurteilen kann und verstanden habe) 
möchte ich OCR0 (ATmega128) durch OCR1A (ATmega8) ersetzen?

Etwas verwirrt mich die Beschreibung:
ATmega128 OCR0: The Timer/Counter (TCNT0) and Output Compare Register 
(OCR0) are 8-bit registers.

ATmega8 OCR1A: The Timer/Counter (TCNT1), Output Compare Registers 
(OCR1A/B), and Input Capture Register (ICR1) are all 16-bit registers.

Verursacht das keine Probleme wenn ich 8-bit Register durch einen 16-bit 
Register ersetze?

Die nächste Frage ist, ob ich "#asm("cli")" Statement durch cli(); 
ersetzen darf.

Gruss und Danke für Deine Hilfe
Oskar

von Daniel H. (danielch)


Lesenswert?

Oskar Mobardov schrieb:

> Im original Source Code steht
> OCR0  = DATA_BIT_LENGTH;       // set timer reload value (1 bit)
>
> Gemäss Dokumentation (sowie ich es beurteilen kann und verstanden habe)
> möchte ich OCR0 (ATmega128) durch OCR1A (ATmega8) ersetzen?
Ich denke OCR0 ist beim Mega128: 8bit Counter/Timer0
Beim mega8: 8bit Counter/Timer2
Das heisst, OCR0 (m128) musst du durch OCR2 (m8) ersetzen.
Im mega8 Datenblatt Seite 104 (enstspricht im mega128 Datenblatt Seite 
93),
dort kannst du nachlesen, welche Register du wie umbenennen musst.

> Etwas verwirrt mich die Beschreibung:
> ATmega128 OCR0: The Timer/Counter (TCNT0) and Output Compare Register
> (OCR0) are 8-bit registers.
>
> ATmega8 OCR1A: The Timer/Counter (TCNT1), Output Compare Registers
> (OCR1A/B), and Input Capture Register (ICR1) are all 16-bit registers.
Wenn du OCR2 bei mega8 nimmst, sollte es passen.

> Verursacht das keine Probleme wenn ich 8-bit Register durch einen 16-bit
> Register ersetze?
Lieber dem Counter/Timer mit der gleichen Funktionalität nehmen, dann 
musst du eigentlich nur die Timernummern ändern.

> Die nächste Frage ist, ob ich "#asm("cli")" Statement durch cli();
> ersetzen darf.
Kannst du, wenn du den Header für Interrupts mit #include 
<avr/interupt.h>
inkludierst.

lg daniel

von Peter D. (peda)


Lesenswert?

Vergiß es !

Mit SW-UART kriegst Du keine 1MBaud hin.

Wie schon bereits gesagt, ein 8 oder 16MHz Quarz und die HW-UART.


Peter

von Oskar M. (oskarus)


Lesenswert?

Hallo Peter

Hmmm... Meinst Du, das ich im Moment versuche (Code auf ATmega8) 
portieren bringt mich nicht weiter?

Die nächste Frage ist... Hast Du ein Vorschlag wie ich so ein Quartz 
anschliessen kann?

Oder hat Jemand von Euch ein Beispiel, wie man so etwas mit ein ATmega8 
realisieren kann?

Gruss
Oskar

von Oskar M. (oskarus)


Lesenswert?

Hallo Daniel

Darf ich die Zeile folgende Zeile wie folgt für mein ATmega8 übersetzen?

ATmega128
// External Interrupt 0 service routine (used to initiate UART3 receive)
interrupt [EXT_INT0] void external_INT0(void)
{
...
}

ATmega8
// External Interrupt 0 service routine (used to initiate UART3 receive)
interrupt [INT0] void ext_int0_isr(void)
{
...
}

Die zweite Frage lautet...

Durch was muss ich TIM0_COMP ersetzen?
// Timer 0 compare interrupt service routine (sends & receives the UART3 
bits)
interrupt [TIM0_COMP] void TIMER0_compare(void)
{
  ..
}

Hier habe ich bereits mit TIMER2_COMP versucht aber leider ohne erfolg. 
Die Meldung lautet dann "../uart3.c:61: error: 'TIMER2_COMP' undeclared 
here (not in a function)"

Gruss und vielen Dank für Deine Unterstützung...
Oskar

PS: Denkst Du auch, dass ich meine Arbeit für nichts ist und ich das 
ganze mit Quartz lösen soll?

von Peter D. (peda)


Lesenswert?

Oskar Mobardov schrieb:
> Hmmm... Meinst Du, das ich im Moment versuche (Code auf ATmega8)
> portieren bringt mich nicht weiter?

Was willst Du denn in nur 16 Zyklen Bitzeit an Software schaffen?


> Die nächste Frage ist... Hast Du ein Vorschlag wie ich so ein Quartz
> anschliessen kann?

Datenblatt: Figure 11. Crystal Oscillator Connections


> Oder hat Jemand von Euch ein Beispiel, wie man so etwas mit ein ATmega8
> realisieren kann?

Datenblatt: Table 63. Examples of UBRR Settings for Commonly Used 
Oscillator Frequencies (Continued)


Peter

von Daniel H. (danielch)


Lesenswert?

Oskar Mobardov schrieb:
> Hallo Daniel
>
> Darf ich die Zeile folgende Zeile wie folgt für mein ATmega8 übersetzen?
>
> ATmega128
> // External Interrupt 0 service routine (used to initiate UART3 receive)
> interrupt [EXT_INT0] void external_INT0(void)
> {
> ...
> }
>
> ATmega8
> // External Interrupt 0 service routine (used to initiate UART3 receive)
> interrupt [INT0] void ext_int0_isr(void)
> {
> ...
> }

Kommt drauf an ob du mit avr-gcc arbeitest oder mit Windowssoftware..
für avr-gcc müsste es so sein:
ISR(INT0_vect)
{
...
}

> Die zweite Frage lautet...
>
> Durch was muss ich TIM0_COMP ersetzen?
> // Timer 0 compare interrupt service routine (sends & receives the UART3
> bits)
> interrupt [TIM0_COMP] void TIMER0_compare(void)
> {
>   ..
> }
 interrupt [TIM2_COMP] void TIMER2_compare(void)
{
 ..
}

> Hier habe ich bereits mit TIMER2_COMP versucht aber leider ohne erfolg.
> Die Meldung lautet dann "../uart3.c:61: error: 'TIMER2_COMP' undeclared
> here (not in a function)"
siehe oben

>
> PS: Denkst Du auch, dass ich meine Arbeit für nichts ist und ich das
> ganze mit Quartz lösen soll?
Ohne Quarz dürftest du sowieso nichts lauffähiges hinkriegen->Quarz ist 
ein Muss!

Hier noch ein Link: 
http://evolverobotics.blogspot.com/2009/01/conecting-ax-12-to-arduino.html
Mithilfe der dort gezeigten Schaltungen kannst du die HW UART des mega8 
verwenden und dann sind 1Mbps kein Problem.

Es wäre allerdings hilfreich, wenn alles was du schon hast, also 
Schaltpläne, Quellcode posten würdest, das würde (mir) die Hilfe sehr 
erleichtern.

lg daniel

von Oskar M. (oskarus)


Angehängte Dateien:

Lesenswert?

Hallo Daniel

Danke für Deine Antworten!

Als Entwicklungsumgebung verwende ich AVR Studio 4.18

In dieser Version habe ich noch die folgenden Zeilen angepasst:
Die PORTD und DDRD Zeilen habe ich versucht zu portieren (ich hoffe 
diesmal richtig).
1
//RX
2
// ATmega8        // ATmega128
3
PORTD |= ((1) << PIN0);  // PORTD.0 = 1; // pull-up
4
DDRD  &=~((0) << PIN0);  // DDRD.0  = 0; // input
5
6
//TX
7
PORTD |= ((1) << PIN4);  // PORTD.4 = 1; // logic 1 (high level = STOP TX)
8
DDRD  |= (1<<PIN4);    // DDRD.4  = 1; // output

Im Moment spuckt meine Entwicklungsumgebung nur noch 4 Fehler und 4 
warnings!

avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT uart3.o -MF 
dep/uart3.o.d  -c  ../uart3.c

Build failed with 4 errors and 4 warnings...

Leider hat es mit "interrupt [TIM2_COMP] void TIMER2_compare(void)" 
nicht geklappt. :-(

Original Source Code für ATmega128 findet man auf der Seite: 
http://www.w-r-e.de/robotik/data/downl.htm
Direkt Link: http://www.w-r-e.de/robotik/data/software/softuart.zip

Ich habe die aktuellen Source-Code Files (Portierungsversuche auf 
ATmega8) als Anhang hinzugefügt.

Parallel zu dem ganze recherchiere ich, ob ein Beispiel gibt, wie ich 
mit mein myAVR MKII so ein Quarz anschliessen kann.

Sobald ich den Code zum Laufen gebracht habe, werde ich mich auf die 
Quarz Problematik widmen.

Gruss und Danke Euch, für Eure Unterstützungen.
Oskar

von Oskar M. (oskarus)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen

Ich habe jetzt auch noch eine Zeichnung erstellt, wie ich das Quarz-Teil 
an ATmega8 anschliessen möchte.

Auf der Seite 
http://mschrod.de/Elektronik/AVR/Atmega8/Experementierboard_acht/Quarz/Quarz.htm 
habe ich ein Beispiel gefunden und nachgezeichnet.

Die Zeichnung ist nicht sehr schön! Wenn Ihr OK gibt, werde ich das Teil 
so zusammenbauen.

Der Author der Seite hat ein Quarz mit 3.6864Mhz verwendet. Genügt das 
für mein Vorhaben (mein Ziel ist weiterhin 1MBps)?

Viele Grüsse und Danke für Eure Unterstützung
Oskar

von Peter D. (peda)


Lesenswert?

Oskar Mobardov schrieb:
> Der Author der Seite hat ein Quarz mit 3.6864Mhz verwendet. Genügt das
> für mein Vorhaben (mein Ziel ist weiterhin 1MBps)?

Ich glaub, Du brauchst erstmal ne Brille.


Peter

von Oskar M. (oskarus)


Lesenswert?

Hallo Peter

Warum meinst Du, ich brauche eine Brille?

Ist etwas falsch oder macht das ganze immer noch kein Sinn?

Hast Du mir vielleicht eine Empfehlung, wie ich das ganze realisieren 
soll?

Ich möchte einfach die AX-12 Servos zum laufen bringen.

Gruss
Oskar

von Peter D. (peda)


Lesenswert?

Ich hab doch schon zweimal gesagt, welche Frequenzen nur gehen und auch 
auf die Tabelle verwiesen. Hab davon schon Fusseln am Mund.
Wenn Du aber mir und dem Datenblatt nicht glaubst, Dein Bier.


Peter

von Oskar M. (oskarus)


Lesenswert?

Hallo Peter

Entschuldige mich bitte...

Ich habe nochmals die ganze Geschichte gelesen... Sorry!
Du hast damals geschrieben, dass ich 8MHz oder 16MHz Quarz anschliessen 
soll.

Ich weiss, dass ich nicht annehmen darf... Darum habe ich im DataSheet- 
Dokument nachgeschaut.

Seite 27 - Table 4 - Crystal Oscillator Operating Modes

Hier steht, Frequency Range(MHz) 3-8MHz. Bedeutet das, dass ich kein 
16MHz anschliessen darf und 8MHz für mein ATmega8 maximum ist?

In der Table 62. Examples of UBRR Settings for Commonly Used Oscillator 
Frequencies (Continued) steht unter fosc = 8.0000 MHz und U2X = 1

UBRR = 0 und Error 0.0%

Bedeutet das ganze für mich...
8MHz Quarz anschliessen und dann erreiche ich 1MBps?

Gruss und Danke für Deine Hilfe
Oskar

von Peter D. (peda)


Lesenswert?

Oskar Mobardov schrieb:
> Seite 27 - Table 4 - Crystal Oscillator Operating Modes

Letzter Eintrag ">1MHz" ist der richtige für 16MHz.
Nimm besser 16MHz, dann ist die Software unkritischer.


Peter

von Oskar M. (oskarus)


Lesenswert?

Hallo Peter

Vielen Dank für Deine Antwort.

Wenn ich 16MHz Quarz verwende, dann bleiben der Wert für den Kondensator 
weiterhin bei 22pF. (Table 4. Crystal Oscillator Operating Modes)

In der Tabelle ist ein Rang zwischen 12-22 angegeben. Gilt hier der 
Regel, je höher desto besser (in diesem Fall 22pF) oder muss man hier 
auf etwas achten?

Wenn ich in meiner Zeichnung nur die Quarz-Zahl auf 16MHz und alles 
andere stehen lasse, sollte ich 1MBps erreichen. Ist das korrekt? Oder 
vermisst Ihr noch etwas?

Viele Grüsse
Oskar

von Oskar M. (oskarus)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen

Ich habe eine neue Zeichnung erstellt.

Wie Peter mir bereits mitgeteilt hat, habe ich ein 16MHz Quarz 
gezeichnet.

Zusätzlich habe ich Daniel seine Empfehlung in die Zeichnung übernommen.

Kann ich jetzt mit diesen Komponenten zusammen die AX-12 Servos zum 
Laufen bringen?

Die wichtigste Voraussetzung ist weiterhin 1Mbps. Diesen Wert sollte ich 
mit einem 16MHz Quarz erreichen können. Oder?

Gruss und Danke für Eure Hilfe
Oskar

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.