//selfdefine UART
#define uart_rx RB4
#define uart_tx RA2
#define uart_rx_tris TRISB4
#define uart_tx_tris TRISA2
#define servo1 0x41
// Additional UART
//============================================================
void uart_init(void)
{
//tris
uart_tx_tris=0;
uart_rx_tris=1;
//initial value
uart_tx=1;
//delay
timer=0;
delay(5000);
}
void uart_send(unsigned char data)
{
unsigned char i;
uart_tx=0; //start bit
timer=0;
while(timer<(timer_freq/baudrate));
for(i=1;i>0;i=i<<1) //data transmission
{
if((data&i)==0)uart_tx=0;
else uart_tx=1;
timer=0;
while(timer<(timer_freq/baudrate));
}
uart_tx=1; //stop bit
timer=0;
while(timer<(timer_freq/baudrate));
}
unsigned char uart_receive(void)
{
unsigned char i,data=0;
while(uart_rx==1); //wait start bit
timer=0;
while(timer<(timer_freq/baudrate));
timer=0; //wait half bit to read at the center
while(timer<(timer_freq/baudrate/2));
for(i=1;i>0;i=i<<1) //receiving data
{
if(uart_rx==1)data=data|i;
timer=0;
while(timer<(timer_freq/baudrate));
}
return data;
}
//servo control
//======================================================================
void send_cmd(unsigned char num, unsigned int data, unsigned char ramp) //send 4 bytes of command to control servo's position and speed
{
unsigned char higher_byte=0, lower_byte=0;
//position value from 0-1463 are greater than a byte
//so needs two bytes to send
higher_byte=(data>>6)&0x003f; //higher byte = 0b00xxxxxx
lower_byte=data&0x003f; //lower byte = 0b00xxxxxx
uart_send(num); //First byte is the servo channel 0x41-0x60
uart_send(higher_byte); //second byte is the higher byte of position 0b00xxxxxx
uart_send(lower_byte); //third byte is the lower byte of position 0b00xxxxxx
uart_send(ramp); //fourth byte is the speed value from 0-63
}
.
.
.
TRISA = 0b00000111;
TRISB = 0b00011111;
.
.
.
.
void skps_cntrl(void)
while(1)
{
if(skps(p_square)==0)
{
if (servo1_val==1410)servo1_val-=2;
else servo1_val=1408;
}
}
Users browsing this forum: No registered users and 15 guests