Buenas,
Estoy haciendo unas pruebas de iniciacion usando el pic 16F876A y un servo(HS422) trucado en continuo.
Para esto he modificado y adaptado un ejemplo de RedPic.
Mi programa hace que el servo este parado o girando en un sentido dependiendo de una señal que entra por un pin y ala vez enciende un led.
El problema viene en que solo me funciona si tanto el Pic como el servo estan conectados a la misma bateria a 5v (el servo puede variar desde 4,8v hasta 6v)
Si le pongo una bateria exclusiva para el servo a 6V y el pic con la otra de 5V entonces, siempre esta girando el servo, el led si se enciende dependiendo de del input del pin, pero no me para el servo.
Las baterias son iguales en marca y modelo, unas pilas de 9V reguladas por un L7806c y un L7805c, para sacar 6v y 5v respectivamente.
Aqui dejo el codigo por si veis algo:
// Alimentación y pulsos a 5V
// Cuadro de Tiempos :
// Periodo 20 ms (Frecuencia 50 Hz)
// Ancho de pulso adaptado para Modelo HS 422
// Ancho Pulso minimo 0.9 ms
// Ancho pulso medio 1.5 ms
// Ancho pulso maximo 2.1 ms
// TMR0 a 1:16 -> 1 RTCC cada 4.096 ms
// -> 1 Tick cada 0.096 / 256 = 0.016 ms
// -> 20 ms = (4 x RTCC completas) + (1 * RTCC - 30 ticks)
// Ancho Pulso minimo 0.9 ms -> 56 ticks de TMR0
// Ancho pulso medio 1.5 ms -> 93 ticks de TMR0
// Ancho pulso maximo 2.1 ms -> 131 ticks de TMR0
#include <16f876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)
#define PIN_SERVO1 PIN_B0 //servos derecho
#define PIN_LED PIN_B1 //salida para el led
#define PIN_CAMBIO PIN_B2 //entrada para el cambio de giro del servo
////////////////////////////////////////////-> variables
const int AJUSTE_FINO_DE_RTCC = 30;
const int ATRAS = 56;
const int PARAR = 93;
const int ADELANTE = 131;
int1 flagRTCC = 0;
int contRTCC = 0;
int1 flagSERVO1 = 0;
int tSERVO1 = PARAR;
///////////////////////////////////////////
#int_RTCC
void RTCC_isr(){
++contRTCC;
if(contRTCC==4){
set_TIMER0(AJUSTE_FINO_DE_RTCC); //lo ajustamos a 30 para que empieze
//a contar apartir de ahi en el sigueinte RTCC
}
if(contRTCC==5){//20ms
flagRTCC=1;
contRTCC=0x00;
}
}
void main() {
int ValTIMER0;
setup_counters(RTCC_INTERNAL,RTCC_DIV_16); //preescaler/divisor del timer a 1:16
set_TIMER0(0);//ponemos el timer a cero a contar
enable_interrupts(global); //activa todas las interrupciones
enable_interrupts(INT_RTCC); //activa el desbordamiento del timer0(RTCC)
do {
// DISPARO DEL PULSO PWM
if(flagRTCC==1){
flagRTCC=0;
output_high(PIN_SERVO1);
flagSERVO1=1;
}
// CONTROL DE ANCHO DEL PULSO PWM
if(flagSERVO1==1){
valTIMER0 = get_TIMER0();
if(valTIMER0>tSERVO1){
flagSERVO1=0;
output_low(PIN_SERVO1);
}
}
//CONTROL DE CAMBIO DE SENTIDO DEL SERVO
if(!INPUT(PIN_CAMBIO)){
tSERVO1=ADELANTE;
output_high(PIN_LED);
}else{
output_low(PIN_LED);
tSERVO1=ATRAS;
}
} while (TRUE);
}
Agradeceria cualquier respuesta, muchas gracias