Wie sind serv1 und serv2 definiert? Sie müssen volatile sein.
> TCNT2 = 255-(0.001+p*0.000025)
Wie kommst du auf diese Rechnung? Du weißt schon, daß TCNT2 nur
Ganzzahlen kennt?
Beispiel für p=100:
255-(0.001 + 0.0025) = 255 - 0.0035 = 254.9965
Davon wird der Nachkomma-Teil abgeschnitten und TCNT2 wird auf 254
gestellt. Dieser Wert kommt übrigens für jeden beliebigen Wert von p
raus.
> for(i=0;i==10;i++) //diese Schliefe soll 20ms dauern
Die Schleife funktioniert so nicht. Du setzt erst i auf 0, dann läuft
die Schleife solange, wie i == 10 ist. Anders ausgedrückt: Die Schleife
läuft gar nicht.
Hallo,
serv1+2 sind volatile und haben am Anfang den Wert 0.
Für P werden vorraussichtlich Werte im Bereich von 0 - 40 angegeben.
Schleife habe ich jetzt so geändert:
for(i=0;i<10;i++) //diese Schliefe soll 20ms dauern
{
while(serv2 != 1)
{}
TCNT2 = 0;
serv2 = 0;
}
Geht aber leider immer noch nicht.
Ohne jetzt das komplette Timing analysiert
zu haben
main()
....
do
{
send_string(a);
servo(30);
waitms(1000);
}
Du gibst dem Servo nur alle heilige Zeiten mal einen
Puls. Das Servo moechte aber staendig einen Puls
haben. Je nach Servoelektronik kann es sein, dass
Dein Servo diesen Puls ganz einfach als Fehlpuls
auffasst und ignoriert.
Servos wollen alle 20 ms einen Puls der Laenge 1 bis
2 ms. Staendig!
Das ist mir jetzt nur so auf die Schnelle aufgefallen.
Hast Du schon mal am PortPin nachgesehen, ob da auch
Pulse rauskommen?
Hallo,
also geht es nicht, dem Servo nur Impulse zu schicken, wenn man grad
Lust hat. Dann muss ich das natürlich überarbeiten.
Würde es z.B. gehen, den Timer anzustossen und der läuft einfach vor
sich hin, produziert die Impulse und wenn ich ne andere Position will,
Impulsbreite ändern?
Wird durch die Interrupts, in denen die Impulse entstehen, nicht der
ganze Programmablauf behindert?
Gruß
Martin
mal einen ganz einfachen servocode.
kanal ist der portpin wo er angeschlossen ist.
0-180 grad ist ist der wert 0-1850 bei meinen servo von conrad für 5
euro. muss man ermitteln, kann immer ein bisschen schwanken.
930~90grad, 470~45grad. kommt sehr gut hin.
delay-routine habe ich mal gefunden, supergenau.
servo läuft mit avr16-8mhz.
#include <inttypes.h>
#include <avr/pgmspace.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#define delay_us_(us) _delayFourCycles_( ( ( 1*(F_CPU/4000) )*us)/2005
)
void _delayFourCycles_(uint16_t z)
{
uint16_t i;
for (i=0; i<z; i++)
asm volatile("nop");
}
void delay_ms_(uint16_t z)
{
uint16_t i;
for (i=0; i<z; i++)
delay_us_(999);
}
void servo_srf04(uint8_t kanal, uint16_t servo_vorgabe)
{
uint16_t servo_wert, servo_wert1, servo_wert2;
for (servo_wert=0; servo_wert<servo_vorgabe; servo_wert+=10)
{
servo_wert1=servo_wert+350;
servo_wert2=20000-servo_wert1;
PORTB|=(1<<kanal);
delay_us_(servo_wert1);
PORTB&=~(1<<kanal);
delay_us_(servo_wert2);
}
}
int main(void)
{
uint8_t vorn=6;
uint8_t hinten=7;
DDRB|=(1<<PB6);
PORTB&=~(1<<PB6);
DDRB|=(1<<PB7);
PORTB&=~(1<<PB7);
servo_srf04(vorn,930);
delay_ms_(1000);
servo_srf04(vorn,470);
delay_ms_(1000);
servo_srf04(vorn,1850);
delay_ms_(1000);
servo_srf04(vorn,1400);
delay_ms_(1000);
servo_srf04(hinten,930);
delay_ms_(1000);
servo_srf04(hinten,470);
delay_ms_(1000);
servo_srf04(hinten,1850);
delay_ms_(1000);
servo_srf04(hinten,1420);
delay_ms_(1000);
}