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
Vergiß es ! Mit SW-UART kriegst Du keine 1MBaud hin. Wie schon bereits gesagt, ein 8 oder 16MHz Quarz und die HW-UART. Peter
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).
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.