Hallo
Das 'p' steht für Pause:
Code:
volatile uint16_t p=0;
void pause(uint16_t p_dauer)
{
p=p_dauer;
while(p);
}
Eine kleine Pause kann man immer mal brauchen. Die Einheit ist wohl 20ms, dann sollte pause(50) eine Sekunde (blockierend) verzögern. 'p' ist aber auch ein Servoimpulszyklus, vielleicht kann man das später mal verwenden...
Der Vollständigkeit halber hier noch mein "Arbeitscode" (=ungeputzt und nicht kommentiert):
Code:
//#include "../inc/walkerlib.h"
//#include "../inc/walkerlib.c"
#include <avr/io.h>
#include <avr/interrupt.h>
#define servo_init {DDRB|=0b11011; DDRC|=0b11; DDRD|=0b11000;}
#define servo0_on PORTC |= (1<<PC1)
#define servo0_off PORTC &= ~(1<<PC1)
#define servo1_on PORTC |= (1<<PC0)
#define servo1_off PORTC &= ~(1<<PC0)
#define servo2_on PORTD |= (1<<PD4)
#define servo2_off PORTD &= ~(1<<PD4)
#define servo3_on PORTD |= (1<<PD5)
#define servo3_off PORTD &= ~(1<<PD5)
#define servo4_on PORTB |= (1<<PB1)
#define servo4_off PORTB &= ~(1<<PB1)
#define servo5_on PORTB |= (1<<PB2)
#define servo5_off PORTB &= ~(1<<PB2)
#define servo6_on PORTB |= (1<<PB4)
#define servo6_off PORTB &= ~(1<<PB4)
#define servo7_on PORTB |= (1<<PB5)
#define servo7_off PORTB &= ~(1<<PB5)
#define servo_stop {servo0_off; servo1_off; servo2_off; servo3_off; \
servo4_off; servo5_off; servo6_off; servo7_off;}
uint8_t vla, vli, vra, vri, hla, hli, hra, hri;
volatile uint16_t p=0;
void pause(uint16_t p_dauer)
{
p=p_dauer;
while(p);
}
int main(void)
{
TIMSK |= (1<<OCIE2);
TCCR2 = (1<<WGM21) | (1<<CS20);
OCR2 = 80;
servo_init;
servo_stop;
sei();
vla=125; vli=125;
vra=125; vri=125;
hla=125; hli=125;
hra=125; hri=125;
pause(50);
while(1)
{
vla=hla=vra=hra=120; // heben/senken
pause(10);
vli=vri=110; // gehen
hli=hri=140;
pause(15);
vla=hla=vra=hra=135; // heben/senken
pause(10);
vli=vri=140; // gehen
hli=hri=110;
pause(15);
}
return(0);
}
ISR(TIMER2_COMP_vect)
{
static uint16_t count=0;
static uint16_t count2=1000;
static uint8_t impuls=0, servo=0;
static uint8_t impuls2=0, servo2=0;
if(!impuls)
{
if(servo == 0) { impuls=hra; servo0_on; }
if(servo == 1) { impuls=hri; servo0_off; servo1_on; }
if(servo == 2) { impuls=vra; servo1_off; servo2_on; }
if(servo == 3) { impuls=vri; servo2_off; servo3_on; }
if(servo == 4) servo3_off;
if(servo < 5) servo++;
} else impuls--;
if(!impuls2)
{
if(servo2 == 4) { impuls2=hla; servo4_on; }
if(servo2 == 5) { impuls2=hli; servo4_off; servo5_on; }
if(servo2 == 6) { impuls2=vla; servo5_off; servo6_on; }
if(servo2 == 7) { impuls2=vli; servo6_off; servo7_on; }
if(servo2 == 8) servo7_off;
if(servo2 < 9) servo2++;
} else impuls2--;
if(count < 2000) count++; else { count=impuls=servo=0; if(p) p--; }
if(count2 < 2000) count2++; else { count2=impuls2=0; servo2=4; }
}
Die "walkerlib" soll mal irgendwann (falls ich das Projekt fertigstellen werde;) die Motorfunktionen MotorSpeed() und MotorDir() der orginalen asuro-Library ersetzen...
Gruß
mic
[Edit]
btw: uint8_t p reicht ja völlig, das sind 5 Sekunden...
Lesezeichen