Ayuda con un pic 12f675

Hola a todos. Estoy tratando de hacer un limitador de rpm, usando un pic, pero se me complico. Aca les mando el programita.

#include <12f675.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=8000000)

unsigned int command;

#define sw1 PIN_A0 //señal de bobina//
#define sw2 PIN_A2 //señal de corte al rele o 555//

main() {

long n=0;
long u=0;
long res=0;
long rpm=0;
int pote=0;
long limite=0;

setup_port_a( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );

set_adc_channel(1); // potenciometro en el pin_A1
pote=Read_ADC();
limite=pote*10;

while (1) { //conteo de rpm

n=0;
u=0;

while (input(sw1));

while (!input(sw1));

while (input(sw1)) {

u=u+1;

delay_us(6);

}


while (!input(sw1)) {

n=n+1;

delay_us(6);

}

res=n+u;

rpm=6000000/res;

if (rpm>limite)output_high(sw2);
if (rpm<limite)output_low(sw2);


}

}

Mi error en primer lugar es no haber estudiado, y con respecto al programa es que no se si cuento bien las rpm y como esta seteado la entrada analogica.
Disculpen mi ignorancia y muchas gracias.
 
Disculpa quisiera saber alguna cosas acerca de tu programa. he visto que activas tus ADCs, supongo ese es el control principal, tambien he visto un eliminador de rebotes eso que hace variar? y que tipo de motor estas controlando
 
Te recomiendo que mires los ejemplos que trae por defecto

Si no me falla la memoria hay algun ejemplo sobre esto en concreto, mira el help donde encontraras una lista.
Los ejemplos se encuentran aqui.

c:\archivos de programa\picc\examples


Asi a simple vista parece que el primwer while (rutina RPM) se queda ahi y el resto del programa no se ejecuta.

tampoco veo ningun sistema antirevotes ni flancos.
Deberia ser algo asi
timer(0)? lo que sea

while(flag=timer(0))
{
Detecto que esta pulsado while(leva)
Espero a que se estabilice (un simple retardo) delay_ms
Espero que deje de pulsarse while(!leva)
cuenta +1
}
analizo resultado y vuelta a empezar.
 
Como dice tiopepe el primer while(1) evitará que el programa salga de ahí. Deberías temporizar ese bucle.

Por otro lado tienes debajo una sentencia rpm=6000000/res;

rpm está declarado como long (máximo de 65535). Debería declararlo como int32.

También estás configurando todas las entradas analógicas y el pin_a2 lo utilizas en digital

Suerte con el programa y ánimo.
 
Hola, hace un tiempo que hago programas con microcontroladores PIC y ATMEL lo "gracioso" es que programo estos en ascembler.
Esto es lo que entiendo de problema:

1) el pic contara los rpm y si se exede de un valor predeterminado, este manda una señal de corte.

si es asi solo nesesitas una base de tiempo "temporizador" y un contador, no entiendo para que estas habilitando el ADC, (amenos que la señal de la bobina no sean pulsos).

para elinimar el pocible rebote es prefirible utilizar las interupciones por flanco que tiene el pic.(asi no nesesitarias ningun retardo para eliminar el rebote).

Tambien tienes que calibrar el oscilador interno, a menos que utilices un crisatal externo.
No se si puedes hacer eso en la forma en que estas programando pero en ascembler se hace eso y mas..

El software que utilizamos en el MPLAB de microchip, admas el fabricante proporciona en su oja de datos muy buen material para configurara las interupciones, Combersoor AD, comparadores, ...

Adeamas puedes simular espe pic 12f675 en el Proteus en tiempo real....

Espero que te haya dado otra vicion para solucionar el problema....
 
Atrás
Arriba