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
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
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
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
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
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
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
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
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
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
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
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
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
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?
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
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
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).
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
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
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
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
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
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
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
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
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