//+++ Mini Controladora de Servomotores +++//
//+++++++++++ AKENAFAB ++++++++++++++++++++//
//++ http://www.todopic.com.ar/foros/ ++++//
//+++++++++++++++++++++++++++++++++++++++++//
//Controla hasta 5 servomotores
//Se recibe por el pin RA3 de manera serial
//--- 19200bps,8bits,sin paridad
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//El control consta de 2Bytes Servo y Posicion +++++++++++//
// nServo-Posición ++++++++++++++++++++++++++++++++++++++//
// nServo = 255=S0 ,254=S1 , 253=S2 , 252=S3 ,251=S4 ++++//
// Posicion = 0-250 +++++++++++++++++++++++++++++++ ++++//
// Ejemplo = 0xFF 0X80 = Servo0 Posicion 125=90° +++++++//
// 0x00=0.5ms - 0x80=1.5ms - 0XFA=2.5ms +++++++++++++//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++//
#include <12F629.h>
#FUSES INTRC_IO,NOWDT,PUT,NOMCLR,BROWNOUT,PROTECT,CPD
#use delay(clock=4M)
#use rs232(baud=19200,rcv=PIN_A3,BITS=8,sample_early)
#use fast_io(A)
#zero_ram
#priority timer1,int_ra
//+++++++++++++++++++++++++++++++++++++++++//
#Define Servo_1 PIN_A0
#Define Servo_2 PIN_A1
#Define Servo_3 PIN_A2
#Define Servo_4 PIN_A4
#Define Servo_5 PIN_A5
#Define n_servos 5 //Número de servomotores
//+++++++++++++++++++++++++++++++++++++++++//
int16 aux; //variable auxiliar
char indice; //lleva el indice del servo a manipular
char aux2; // Control de actualizacion de los servos
char T_Servo[n_servos]={125,125,125,125,125}; //Tiempo activo del motor
int1 flag_timer1; //desborde timer0
int1 flag_Supdate; //Actualizar servi listo
int1 flag_rx; //dato recibido
char indice_rx; // servomotor a manipular
char dato_recibido;
//+++++++++++++++++++++++++++++++++++++++++
void main(){
setup_comparator(NC_NC_NC_NC); //Comparador deshabilitado
output_A(0x00); //Latch
set_tris_A(0B001000); //MCLR=A3= RX input Int_RA3 on Change
enable_interrupts(GLOBAL); //Interrupciones Habilitadas
enable_interrupts(INT_TIMER1); //Habilitamos interrupcion desborde TMR1
SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(INT_RA3); //Habilitamos interrupcion por cambio de estado
//en pin RA3
//--------- PROGRAMA PRINCIPAL -----------------------------\\\\
while(1){
for(indice=0;indice<n_servos;indice++){ //Toma valor de n servos
aux=T_Servo[indice];
aux=65091-(aux*8);
SET_TIMER1(aux);
switch(indice){ //1 Lógico a servo correspondiente
case 0:output_high(Servo_1);break;
case 1:output_high(Servo_2);break;
case 2:output_high(Servo_3);break;
case 3:output_high(Servo_4);break;
case 4:output_high(Servo_5);break;
}//switch
while(flag_timer1==FALSE){} //Loop Mientras no desborde TMR1
flag_timer1=FALSE;
switch(indice){ //0 lógico a servo correspondiente
case 0:output_low(Servo_1);break;
case 1:output_low(Servo_2);break;
case 2:output_low(Servo_3);break;
case 3:output_low(Servo_4);break;
case 4:output_low(Servo_5);break;
}//switch
}// for
//++++++++++++ ACTUALIZACION DE LOS SERVOMOTORES +++++++//
if(flag_rx==TRUE){
if(dato_recibido>=251){ //Si es mayor a 250 es Servo,si Flag=TRUE es posicion
indice_rx=(0xFF-dato_recibido); //operacion lógica AND solo servos de 0-5
flag_Supdate=TRUE; // YA se puede actualizar el valor del servo
if(aux2==2)aux2=0; //corrigiendo posible error de recepcion
}
if(dato_recibido<=250&&flag_Supdate==TRUE){
T_Servo[indice_rx]=dato_recibido; //Actualizando valor del servo
flag_Supdate=FALSE; //Reiniciamos varibles
dato_recibido=0; //Tarea completada
}
flag_rx=FALSE;
}//if--rx
//+++++++++++++++++++Pausa de 10 ms +++++++++++++++++++//
SET_TIMER1(55536); //10ms
while(flag_timer1==FALSE){} //Loop Mientras no desborde TMR1
flag_timer1=FALSE;
}//loop end while
}//end main
//+++++++++++++++ INTERRUPCIONES +++++++++++++++++++//
#INT_TIMER1
desborde_TMR1(){ //Interrupcion por desborde de timer
flag_timer1=TRUE;
} // interrupcion TMR1
#INT_RA
recepcion(){ //Interrupcion por cambio de estado en pines
if(!input(PIN_A3)){ // Bit de inicio ???
dato_recibido
=getc(); //Recibir dato flag_rx=TRUE; //Dato recibido
}//if
} //int_ra3
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++//