Hola a todos los foreros!
Soy bastante nuevo en este mundo de la electrónica, y la verdad es que me apasiona, porque la combino con otra de mis grandes pasiones... la Magia!
Pues sí, como veis, la electrónica y la magia se llevan bastante bien en los tiempos que corren, y por ello me he embarcado en un proyecto que me está quemando las neuronas... ya que, como os acabo de comentar, soy bastante nuevo en el mundo de la programación en C.
Al lío:
He hecho un programita en CCS con el objetivo de hacer que un servo se mueva indefinidamente de 0º a 90º y a 180º, y vuelta a empezar... Para ello lo que he hecho ha sido modificar un programa del gran REDPic (gracias por tus artículos!!!), añadiendo un switch que lo que hace es cambiar automáticamente, cada 50 pulsos, la duración de los pulsos generados que llegan al servo.
Sin embargo, aunque esta mañana me funcionaba a la perfección, hace un rato que el servo sólo se movía en dos direcciones (como si omitiera uno de los casos del switch). No sé si se ha quemado el servo, porque ahora resulta que ni hace el amago de moverse

Aquí os dejo el programa:
#include <16f628A.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,PUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use standard_io(A)
#define PIN_SERVO1 PIN_A2
const int AJUSTE_FINO_DE_RTCC = 30; //cada pulso tiene una duración de
const int ticks_PULSO_MINIMO = 44; //4/4000000 = 1 us * 16 (preescaler) = 16 us
const int ticks_PULSO_MEDIO = 112;
const int ticks_PULSO_MAXIMO = 169;
///////////////TIEMPOS DE LOS PULSOS/////////////
//const int ticks_PULSO_MINIMO = 44; Son 0.7 ms
//const int ticks_PULSO_MEDIO = 112; Son 1.8 ms
//const int ticks_PULSO_MAXIMO = 169; Son 2.7 ms
/////////////////////////////////////////////////
int1 flagRTCC = 0;
int contRTCC = 0;
int1 flagSERVO1 = 0;
int tSERVO1 = ticks_PULSO_MEDIO;
#int_RTCC
RTCC_isr(){
++contRTCC;
if(contRTCC==4){
set_TIMER0(AJUSTE_FINO_DE_RTCC);
}
if(contRTCC==5){
flagRTCC=1;
contRTCC=0x00;
}
}
void main() {
int valTIMER0;
int pulsos=0;
setup_counters(RTCC_INTERNAL,RTCC_DIV_16);
enable_interrupts(global);
set_TIMER0(0);
enable_interrupts(INT_RTCC);
while (1)
{
do {
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);
pulsos++;
}
}
}while (pulsos<50); //El parámetro pulsos controla el tiempo
//que mantiene el servo la posición.
pulsos=0;
switch(tSERVO1){
case ticks_PULSO_MINIMO:
tSERVO1 = ticks_PULSO_MEDIO;
break;
case ticks_PULSO_MEDIO:
tSERVO1 = ticks_PULSO_MAXIMO;
break;
case ticks_PULSO_MAXIMO:
tSERVO1 = ticks_PULSO_MINIMO;
break;
}
}
}
Os pediría un poco de ayuda, a ver si me podéis decir en qué está fallando el programa.
Muchas gracias de antemano.
Un mágico saludo!