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