Jag använder mplab 8.6 och picc18 9.65
kretsen är en PIC18f26k22
Såhär ser koden ut:
Kod: Markera allt
#define _XTAL_FREQ 64000000
#include <htc.h>
__CONFIG(1,FOSC_INTIO67);
//Servopositioner
#define RIGHT_FOOT 1
#define RIGHT_KNEE 2
#define RIGHT_HIP 3
#define LEFT_FOOT 6
#define LEFT_KNEE 5
#define LEFT_HIP 4
#define HEAD 7
//Pinnar
#define SERVO1 LATB0
#define SERVO2 LATB1
#define SERVO3 LATB3
#define SERVO4 LATB4
#define SERVO5 LATC4
#define SERVO6 LATC5
#define SERVO7 LATC6
#define SERVO8 LATC7
#define LED LATA0
volatile short servos[8]={0,0,0,0,0,0,0,0}; //servonas värde [-127,127]
volatile short servos_offset[8]={0,0,0,0,0,0,0,0};[offset så varje servo står exakt rakt vid servos[x]=0]
volatile char servo_cntr=1;//Räknare som håller koll på vilket servo som får sin signal just nu.
void delay_ms(unsigned int ms)//Man får ju inte ha stora konstanter in i __delay_ms().....
{
while(ms--)
__delay_ms(1);
}
void interrupt isr(void)
{
unsigned int tmp;
if(TMR0IF)
{
if(servo_cntr==1)
{
SERVO1=1;
tmp=0xF86F-(servos[0]+servos_offset[0]+127)*32;
TMR0H=(tmp>>8)&0xFF;
TMR0L=tmp&0xFF;
servo_cntr++;
}
else if(servo_cntr==2)
{
SERVO1=0;
SERVO2=1;
tmp=0xF86F-(servos[1]+servos_offset[1]+127)*32;
TMR0H=(tmp>>8)&0xFF;
TMR0L=tmp&0xFF;
servo_cntr++;
}
else if(servo_cntr==3)
{
SERVO2=0;
SERVO3=1;
tmp=0xF86F-(servos[2]+servos_offset[2]+127)*32;
TMR0H=(tmp>>8)&0xFF;
TMR0L=tmp&0xFF;
servo_cntr++;
}
else if(servo_cntr==4)
{
SERVO3=0;
SERVO4=1;
tmp=0xF86F-(servos[3]+servos_offset[3]+127)*32;
TMR0H=(tmp>>8)&0xFF;
TMR0L=tmp&0xFF;
servo_cntr++;
}
else if(servo_cntr==5)
{
SERVO4=0;
SERVO5=1;
tmp=0xF86F-(servos[4]+servos_offset[4]+127)*32;
TMR0H=(tmp>>8)&0xFF;
TMR0L=tmp&0xFF;
servo_cntr++;
}
else if(servo_cntr==6)
{
SERVO5=0;
SERVO6=1;
tmp=0xF86F-(servos[5]+servos_offset[5]+127)*32;
TMR0H=(tmp>>8)&0xFF;
TMR0L=tmp&0xFF;
servo_cntr++;
}
else if(servo_cntr==7)
{
SERVO6=0;
SERVO7=1;
tmp=0xF86F-(servos[6]+servos_offset[6]+127)*32;
TMR0H=(tmp>>8)&0xFF;
TMR0L=tmp&0xFF;
servo_cntr++;
}
else if(servo_cntr==8)
{
SERVO7=0;
SERVO8=1;
tmp=0xF86F-(servos[7]+servos_offset[7]+127)*32;
TMR0H=(tmp>>8)&0xFF;
TMR0L=tmp&0xFF;
servo_cntr++;
}
else if(servo_cntr>=9)
{
SERVO8=0;
TMR0H=0x63;
TMR0L=0xBF;
servo_cntr=1;
}
TMR0IF=0;
}
}
int main()
{
char i;
ANSELA=0b0010000;
ANSELB=0;
ANSELC=0;
PORTA=0;
PORTB=0;
PORTC=0;
TRISA=0b00100000;
TRISB=0b00100000;
TRISC=0;
LATA=0;
LATB=0;
LATC=0;
OSCCON=0b01110000;
PLLEN=1;
IPEN=0;
//Servo driver timer
T0CON=0b10000001;//1:4
TMR0H=0;
TMR0L=0;
//
// T1CON=0b00110001;
// TMR1H=0xB1;
// TMR1L=0xDF;
INTCON=0b11100000;
//TMR1IE=1;
// //Usart
// RCSTA2=0b10000000;
// TXSTA2=0b00100000;
// SPBRG2=103;
while(1)
{
servos[7]=50;
delay_ms(1000);
servos[7]=-50;
delay_ms(1000);
}
}
Sedan ska den med 1sek intervall ändra huvud-servots position.
Interrupten genererar en servo puls i taget till servo1,2,3 osv till servo 8, sedan väntar den ca 12ms till (vilket ger minimum 20ms dödtid mellan pulserna för varje servo)
Om jag ändrar om raden
servos[8]={0,0,0,0,0,0,0,0};
till
servos[8]={0,0,0,0,0,0,0,100};
Så ändras huvudets position
lika så
servos[8]={0,0,0,0,0,0,0,-100};
Men det går bara inte att ändra från main.
Jag har testat att ta bort optimerning och kört servos[] som både volotile och inte vilotile.
Inget verkar funka.
Jag skulle gissa på att det är någon egenhet i kompilatorn som någon här förhoppningsvis känner till.
Och det blir svårt att debuga, klantarna till designers har ju kopplat pickit2-RX till PIC-RX och pickit2-TX till PIC-TX.
Klantigt värre.
Testade att skapa funktionen:
Kod: Markera allt
void set_head(short value)
{
servos[7]=value;
}
Och då funkar allt som det ska.
