ich schätze der Fehler liegt beim Sleep schreib mal statt 200-20 einfach 180
und auserdem schreibt man Sleep am Anfang groß
Druckbare Version
ich schätze der Fehler liegt beim Sleep schreib mal statt 200-20 einfach 180
und auserdem schreibt man Sleep am Anfang groß
Hallo
Dass dieser Code so übersetzbar ist kann ich schlichtweg nicht glauben. So könnte es vielleicht funktionieren:
Da ich aber kein M32 besitze kann ich es nicht testen...Code:#include "RP6ControlLib.h"
int main(void)
{
uint8_t i;
initRP6Control();
DDRA |= 4; // ADC2 (PA2) auf Ausgang schalten
while(1)
{
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 4;
sleep(8);
PORTA &= ~4;
sleep(200-10);
}
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 4;
sleep(20);
PORTA &= ~4;
sleep(200-20);
}
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 4;
sleep(14);
PORTA &= ~4;
sleep(200-10);
}
}
return(0);
}
Die Portbezeichnungen entsprechen den Zweierpotenzen. Pin0 ist 2^0 oder 1, Pin1 ist 2^1 oder 2, weiter gehts dann über 4, 8, 16, 32 und 64 bis 2^7 oder 128 für den achten Pin.
Dass der ADC2 beim Mega32 der Pin PA2 (Port A Pin2) ist, findet man im Datenblatt des Mega32 oder im Schaltplan des M32.
Gruß
mic
[Edit]
200-20 funktioniert natürlich. In der RP6-Library ist sleep() mit kleinem S definiert:
(Aus RP6ControlLib.c)Code:/**
* Delay with the help of the 10kHz timer.
* sleep(10) delays for *about* 1ms! Not exaclty, as we do not use assembly routines
* anywhere in this library!
*
* This is a blocking routine, which means that the processor
* will loop in this routine and (except for interrupts) the
* normal program flow is stopped!
* Thus you should use the Stopwatch functions wherever you can!
*
* Example:
* sleep(1); // delay 1 * 100us = 100us = 0.1ms
* sleep(10); // delay 10 * 100us = 1000us = 1ms
* sleep(100); // delay 100 * 100us = 10000us = 10ms
* // The maximum delay is:
* sleep(255); // delay 255 * 100us = 25500us = 25.5ms
*/
void sleep(uint8_t time)
{
delay_timer = 0;
while (delay_timer <= time+1);
}
erstmals danke für die genauen portbezeichnungen. denke wird mir helfen bei weitern versuchen einen code selber zu schreiben.
leider funktioniert es noch nicht. das servo macht keine bewegung, zudem ist das horn nicht blockierend. habe den code von radbruch 1:1 übernommen.
also muss man kein code auf die base vom rp6 laden damit m32 läuft?
habe kein selftest ausführen können da ich nicht über ein lcd display verfüge. soweit ich weiss braucht man kein lcd auf dem m32 um servos anzusteuern? habe ein paar codes von den rp6control_examples ausprobiert und die laufen so wie sie sollen.
gruss RAW
thx
du must Sleep und nicht sleep schreiben
Ich vermute, die ADC2-Pins am M32 entsprechen nicht der Belegung am Servostecker. VDD sollte in der Mitte der Stiftleiste sein:
[Edit]
Nach der Doku des M32 Seite 27 ist die Stiftleiste nicht für Servos ausgelegt. Abhilfe schafft ein "Umbau" des Servosteckers:
Bild hier
sleep() mit kleinem S ist schon richtig. Interessanterweise wird die Funktion in der RP6RobotBaseLib.c so definiert:
Code:void sleep(uint8_t time)
{
for (delay_timer = 0; delay_timer < time;);
}
habe das rote kabel in vdd, das schwarze in gnd und das weisse kabel in adc2.
habe sonst das servo bei io1-6 und adc0/adc1/int1 zum bewegen gebracht. nur nicht auf dem m32.
gibt es eine andere möglichkeit das servo zu bewegen d.h mit int2 auf dem m32.
danke
ok habe es jetzt hinbekommen. hatte ein fehler im programmers notepad.
danke an euch.
mfg
RAW
hallo
M32: möchte zwei servos anschliessen. der eine an adc2 der andere adc3.
habe die codes einzeln getestet mit einem servo (acoms as-12) und funktioniert. sobald ich den zweiten servo anschliesse (futaba fp-s148) funktioniert es nicht mer. wenn der (futaba fp-s148) ein kleinen widerstand auf dem horn hat läuft es. frage mich wiso das so ist und was man da machen könnte?
Meine codes lauten:
ADC2: acoms
Code:#include "RP6ControlLib.h"
int main(void)
{
uint8_t i;
initRP6Control();
DDRA |= 4; // ADC2 auf Ausgang schalten
while(true)
{
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 4;
sleep(20);
PORTA &= ~4;
sleep(200);
}
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 4;
sleep(9);
PORTA &= ~4;
sleep(200);
}
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 4;
sleep(0);
PORTA &= ~4;
sleep(200);
}
}
return(0);
}
ADC3: futaba
ziel ist es den acoms an adc2 und den futaba an adc3 in einem code laufen zu lassen. kann mir da jemand helfen?Code:#include "RP6ControlLib.h"
int main(void)
{
uint8_t i;
initRP6Control();
DDRA |= 8; // ADC3 auf Ausgang schalten
while(true)
{
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 8;
sleep(20);
PORTA &= ~8;
sleep(180);
}
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 8;
sleep(9);
PORTA &= ~8;
sleep(180);
}
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 8;
sleep(0);
PORTA &= ~8;
sleep(180);
}
}
return(0);
}
So vielleicht?
(ungetestet)Code:#include "RP6ControlLib.h"
int main(void)
{
uint8_t i;
initRP6Control();
DDRA |= 8 + 4; // ADC2 und ADC3 auf Ausgang schalten
PORTA &= ~(8+4); // beide Pins auf Low
while(true)
{
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 4; // Impuls servo 1 an
sleep(20);
PORTA &= ~4; // Impuls servo 1 aus
PORTA |= 8; // Impuls servo 2 an
sleep(20);
PORTA &= ~8; // Impuls servo 2 aus
sleep(200-20-20); // 20ms minus Impuls1 minus Impuls2 ist Impulspause
}
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 4;
sleep(9);
PORTA &= ~4;
PORTA |= 8;
sleep(9);
PORTA &= ~8;
sleep(200-9-9);
}
/* sleep(0) erzeugt einen extrem kurzen Impuls!
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 4;
sleep(0);
PORTA &= ~4;
PORTA |= 8;
sleep(0);
PORTA &= ~8;
sleep(200-0-0);
}
*/
}
return(0);
}
der code ist super. danke. nur läuft der eine servo nur kurz und danach bricht das programm ab. wenn ich nur ein servo anschliesse läuft das programm durch, dies geschieht aber nur mit dem acoms ic as-12. das servo (futaba) ist soweit ich das beurteilen kann das problem. habe verschidene servos ausprobiert und nur der acoms läuft. auf der base gehen mehrere servos. thx
kann das sein das man die servos wo ich an dem m32 angeschlossen habe mit zusätzlichen 5v ausstatten muss. habe wie schon geschrieben unterbrüche im ablauf des codes.
gruss RAW
Ein Abbruch spricht stark dafür. Es ist schon besser, wenn die Servos über eine eigene Spannungsversorgung laufen
also muss man plus von einem 5v akku an vdd (servo) und minus an gnd der (platine) anschliessen?
thx
Die Suchfunktion ist dein Freund und Helfer :)
Es gibt wirklich dutzende Threads zu dem Thema mit vielen vielen Vorschlägen dazu.
Suche einfach aufs RP6 Forum beschränken und nach "Servo" suchen.
MfG,
SlyD
Gnd an Platine und Akku
he danke an euch. werde es mal testen.
hat bestens geklappt. ohne zusätzliche volt geht das bei mir nicht.
hm... hab mal ne frage... ich hab mir nun auch einen servo zugelegt, den ich auch bald mit dem rp6ansteuern möchte.
doch bei den 3 kabeln ist das eine schwarz dann rot und dann orange...
hab keinerlei datenblätter etc für die pinbelegung gefunden :( könnt ihr mir da vielleicht weiterhelfen?
Schwarz ist GND (Minus)
Rot ist VDD (Plus)
Orange ist das Signal
http://www.rn-wissen.de/index.php/Servo
cool besten dank ^^
Hallo Morpheus,
im RN-Wissen http://www.rn-wissen.de/index.php/Servo findest du die Anschlussbelegungen von den gebräuchlichsten Servos.
Gruß
Thomas
jaa... da hatte ich auch schon geguckt... nur ich hab mich gewundert weil meine kontakte waren ja schwarz rot und orange und die waren da nich bei... ;)
Hallo
möchte insgesammt 4 servos an meinen m32 anschliessen. zwei an adc2 und zwei an adc3. habe gedacht dass ich weitere anschlüsse damit sparen kann. nur wen ich mein programm ablaufen lasse, bewegen sich nur drei der vier servos. kann mir jemand sagen wieso dies so ist. ist es möglich das die adc ports überbelegt sind und somit nur drei zum ansteuern bringen.
gruss RAW
habe die servos zusätzlich mit 1x 5V unterstützt. habe sonst immer servos an die möglichen ports angeschlossen ohne sie doppelt zu belegen, hat auch immer gut funktioniert. also am code kann es nicht liegen. zum code selber; es bewegen sich immer nur zwei servos gleichzeitig. hoffe auf unterstützung.
gruss RAW
Hallo,
wenn du 4 Servos separat ansteuern willst brauchst du auch 4 Steuerleitungen, Du sprichst mit ADC2/3 aber nur von 2 Leitungen?
Da wäre vielleicht erst mal die Verschaltung zu klären. Steuerst du mit einem Port tatsächlich 2 Servos oder wie muss man sich das vorstellen?
"es bewegen sich immer nur zwei servos gleichzeitig" ... das wäre dann die logische Folge...
"Am Code kann es nicht liegen" ... was nicht sein kann, das nicht sein darf?
Wenn Du die 4 Servos unabhängig steuern willst - woran sollen die Servos denn erkennen welches jeweils gemeint ist? Man kann schlecht 2 PWM Signale multiplexen und Servos haben keine Möglichkeit sowas zu demultiplexen. Und was hast Du mit der Software angestellt, das 2 Servowerte über eine Steuerleitung ausgegeben werden? Wie muss man sich das PWM Signal dann vorstellen? Aus meiner Sicht müsste sich aus den beiden PWM Werten dann eine Art Mischsignal ergeben... dessen Flanken quasi kaum vorhersagbar sind und sich ggf. sogar ausgleichen/überlagern. Ist dir überhaupt klar, wie Servos angesteuert werden? Was Du versuchst klingt wie 2 LEDs an einem Port zu schalten und Du wunderst dich, warum nur beide entweder an oder aus sind...
Alles sehr suspekt...
LG
"Steuerst du mit einem Port tatsächlich 2 Servos oder wie muss man sich das vorstellen".....
korrekt habe es zuerst mit zwei servos auf einem port(adc2) ausprobiert. dabei sind keine grösseren probleme aufgetreten. danach habe ich das gleiche mit adc3 gemacht in der hoffnung das es funktioniert.
also der grundgedanke ist ganz einfach:
4 sevos insgesammt, dabei bewegen sich 2 immer parallel. (adc2)
die anderen zwei zu einer anderen zeit auch parallel. (adc3)
wollte mir den kabelsalat sparen, solange zwei servos immer die gleichen bewegung ausführen.
naja, somit hat sich das auch erledigt :(
danke für deine antwort.
lg RAW
soweit ich weiß muss man die adc-Ports extra mit Hilfe eines registers frei
schalten das man sie als normale ports nutzen kann.
Servos benötigen continuierliche PWM Impulse, das zeitversetzte Ansteuern wird so eher nicht gehen. Man kann sicherlich 2 Servos an einem Ausgang steuern so wie du es vor hast, die Software muss dann aber die Impulse für ADC2 und ADC3 generieren. Ist zwar eine sehr ungewöhnliche Geschichte was du vor hast aber ok...
Versuch doch mal erst je ein Servo pro adc zu steuern und häng die beiden anderen später rein. Es kann sein das die Eingänge der Servos nicht zusammen gelegt werden können/dürfen oder Du sie mit Optkopplern/Transistorstufen/Gattern trennen musst. Die Ansteuerung von adc2/3 sollte aber deine Servosoftware schon können, sonst muss man da erst mal suchen.
@matrinius11
Ich setze eigentlich voraus, das er per Software prinzipiell mit ADC3 das gleiche anstellt wie mit ADC2 und mit dem scheints ja zu gehen.
Aber es ist richtig, es müssen das Datenrichtungsregister und die Pullups geschaltet werden. Sonst gibt das nix.
LG Rolf
na gut, schau mal was ich da machen kann. zu lange werde ich es nicht mehr versuchen. ich glaube das einfachste währe wenn ich die restlichen pots benutze.
Danke
lg RAW
Hallo RAW,
erstens brauchst du keine ADCs, du kannst ganz normale I/Os nehmen. Dann musst du die nicht verschwenden.
Zweitens die M32 genug freie Ports, damit du etliche Servos anschließen kannst.
Es gibt dazu hier ja sogar schon eine fertige Library, die bis zu 8 ansteuern kann.
Das funktioniert sehr gut.
Mach dir also erst gar keinen Aufwand irgendwie 2 Servos an eine Leitung zu klemmen, sondern nimm einfach vier ;)