Buenos dias compañeros, llevo algo de tiempo aca en el foro y recurro a ustedes de nuevo a ver si alguien me puede sacar de este bache que tengo con un asunto de mi proyecto final
Bueno procedo a explicar para que estemos en el mismo contexto. Estoy realizando un maquina que dispensa por extrusion y frie dulces (churros, asi se le conoce aca en venezuela

), bueno la cosa es que el "cerebro" de la maquina es el PIC 16F877A, que debe hacer lo siguiente: encargarse del manejo, velocidad y la posicion de un par de motores de paso por medio de sensores final de carrera, debe realizar una medicion de temperatura por medio de una PT100 para un control on/off, debe mostrar el paso a paso en una pantalla LCD y finalmente sensar unos botones que seran nuestra interfaz de usuario junto con la pantalla.
He realizado la programacion en lenguaje C (la alternativa era assembler
![redhot :5]](http://www.todopic.com.ar/foros/Smileys/default/redhot.gif)
), tengo dos versiones del codigo, una nueva y una vieja que adjuntare.
El proceso en general es el siguiente: - Configuracion inicial de PIC
- Definicion de variables
- Pantalla de bienvenida e intrucciones
- Verificar temperatura y encender o apagar resistencia de coccion
- Configurar e Iniciar interrupciones
- Mover motores y mecanismos a su posicion inicial
- Definir modo de trabajo (freido de dulces o drenaje de aceite)
Los problemas que tengo son los siguientes: - Hasta el punto 6 de la lista anterior trabaja perfecto, pero apenas se muestra la pantalla de seleccion de modo, suceden algunas de estas cosas: el microcontrolador se reinicia, se activa alguna de las interruciones (que seran por cambios de estado RB 4-7) o se queda congelado mostrando los modos de trabajo disponibles
- Cuando no se queda congelado inmediatamente se activa el modo drenaje de aceite sin presionar nada
- Al momento de realizar la medicion de temperatura se muestran nuemeros por debajo de la temperatura "real" y otras veces si se muestra bien
He estado revisando el codigo desde hace unas semanas y creo que he encontrado algunas cosas extrañas que me gustaria si alguien me puede aclarar si en realidad esto puede afectar el funcionamiento o no.
*NOTA IMPORTANTE: el PIC tiene cargado el programa en su version vieja, por razones de tiempo y disponibilidad del quemador solo puedo acceder a el nuevamente en enero

para cargar la nueva version
1- Originalmente realize la programacion para utilizar un cristal de 20Mhz pero al no conseguirlo (bendita crisis en este pais) tuve que cambialo por uno de 4Mhz, pero hay un detalle que no me fije en la programacion vieja, es el siguiente: tengo el modo HS con 4Mhz y creo que deberia ser XT para 4Mhz, segun lo indica CCS C compiler (PIC C compiler), ¿esto podria afectar el funcionamiento en algun punto? adjunto codigos:
Viejo:#include <16F877A.h>
#device ADC=10
#fuses HS //High speed Osc (> 4mhz FOR PCM/PCH) (>10mhz for PCD)
#fuses NOWDT //No Watch Dog Timer
#fuses NOPUT //No Power Up Timer
#fuses NOBROWNOUT //No brownout reset
#fuses NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used FOR I/O
#fuses NOCPD //No EE protection
#fuses NOWRT //Program memory not write protected
#fuses NODEBUG //No Debug mode FOR ICD
#fuses NOPROTECT //Code not protected from reading
#use delay(crystal=4000000)
#include <lcd.c>
#include <math.h>
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)
#use standard_io(E)
Nuevo: #include <16F877A.h>
#device ADC=10
#fuses XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#fuses NOWDT //No Watch Dog Timer
#fuses NOPUT //No Power Up Timer
#fuses NOBROWNOUT //No brownout reset
#fuses NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used FOR I/O
#fuses NOCPD //No EE protection
#fuses NOWRT //Program memory not write protected
#fuses NODEBUG //No Debug mode FOR ICD
#fuses NOPROTECT //Code not protected from reading
#use delay(crystal=4000000)
#include <lcd.c>
#include <math.h>
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)
#use standard_io(E)
2- Una posible fuente de reinicio creo que puede ser la siguiente pero me gustaria orientacion para confirmar la solucion que creo haberle dado
Basicamente se realiza la bienvenida, chequeo de temperatura y posicion inicial de motores y mecanismos, despues de eso se pregunta por el modo de trabajo siempre y cuando no se hayan realizado 5 o mas dispensados o el pin C5 este en bajo, ya que este indica el final de del recorrido de la parte de extrusion (es una especie de seguridad, de no tenerlo se podria causar un daño mecanico a la maquina), entonces si este PIN por alguna razon (ruido o algo asi tiene un alto no se ejecutaria la funcion while que da paso a los modos de trabajo, adjunto codigo viejo y nuevo (posible correccion para orientacion):
Viejo:void main()
{
output_A(0); //Configuracion de puertos
input(PIN_A0);
output_B(0);
output_C(0);
output_D(0);
output_E(0);
delay_ms(10);
lcd_init(); //inicializacion de la LCD
SETUP_ADC(ADC_CLOCK_DIV_32); //configuracion del ADC
SETUP_ADC_PORTS(AN0);
SET_ADC_CHANNEL (0);
delay_us(50);
lcd_putc("\f BIENVENIDO "); //pantallas de bienvenida
delay_ms(2000);
lcd_putc("\f MAQUINA DE \n CHURROS ");
delay_ms(2000);
lcd_putc("\fINSTRUCCIONES");
delay_ms(2000);
lcd_putc("\fPRESIONE 1 O 2\nPARA SELECCION");
delay_ms(2000);
lcd_putc("\f1-INICIAR");
delay_ms(5);
while(input(PIN_C3)==0){ //pregunta si se quiere iniciar
while(T<200){ //se enciende la resistencia hasta alcanzar los 200°C ******ACA hay una funcion de lectura de pt100 y on/off de rele
ENABLE_INTERRUPTS (INT_AD); //se habilitan las interrupciones por AD, cambio de estado rb4-rb7
ENABLE_INTERRUPTS (INT_RB);
ENABLE_INTERRUPTS (GLOBAL); //se habilitan las interrupciones globales
X=read_adc();
lcd_putc("\fPOSICIONANDO\nMECANISMOS");
posicion();
lcd_putc("\fLISTO...");
delay_ms(2000);
X=read_adc();
printf(lcd_putc
,"\f TEMPERATURA \n T:%3.1lf %cC ",T
,223); delay_ms(2000);
lcd_putc("\f SELECCION DE \n MODO "); //seleccion del modo de trabajo
delay_ms(2000);
while((dispensados<5)&&(input(PIN_C5)==0)){ //*********ACA es donde planteo que si hay ruido o algo en el PIN no se ejecutario el while e iria de nuevo a la pantalla bienvenida y configuracion
lcd_putc("\f1-FREIDO\n2-DRENAJE"); //freido o manual
delay_ms(10);
X=read_adc();
if(input(PIN_C3)==1){ //aca se ejecutara el modo freido
if(input(PIN_C4)==1){ //aca se ejecutara el modo drenaje
}
}
Nuevo: void main()
{
output_A(0); //Configuracion de puertos
input(PIN_A0);
output_B(0);
output_C(0);
output_D(0);
output_E(0);
delay_ms(10);
lcd_init(); //inicializacion de la LCD
SETUP_ADC(ADC_CLOCK_DIV_32); //configuracion del ADC
SETUP_ADC_PORTS(AN0);
SET_ADC_CHANNEL (0);
delay_us(50);
lcd_putc("\f BIENVENIDO "); //pantallas de bienvenida
delay_ms(2000);
lcd_putc("\f MAQUINA DE \n CHURROS ");
delay_ms(2000);
lcd_putc("\fINSTRUCCIONES");
delay_ms(2000);
lcd_putc("\fPRESIONE 1 O 2\nPARA SELECCION");
delay_ms(2000);
lcd_putc("\f1-INICIAR");
delay_ms(5);
while(input(PIN_C3)==0){ //pregunta si se quiere iniciar
while(T<200){ //se enciende la resistencia hasta alcanzar los 200°C ******ACA hay una funcion de lectura de pt100 y on/off de rele
ENABLE_INTERRUPTS (INT_AD); //se habilitan las interrupciones por AD, cambio de estado rb4-rb7
ENABLE_INTERRUPTS (INT_RB);
ENABLE_INTERRUPTS (GLOBAL); //se habilitan las interrupciones globales
X=read_adc();
lcd_putc("\fPOSICIONANDO\nMECANISMOS");
posicion();
lcd_putc("\fLISTO...");
delay_ms(2000);
X=read_adc();
printf(lcd_putc
,"\f TEMPERATURA \n T:%3.1lf %cC ",T
,223); delay_ms(2000);
lcd_putc("\f SELECCION DE \n MODO "); //seleccion del modo de trabajo
delay_ms(2000);
while(TRUE){ //***********************************************************AQUI he puesto un while para crear un bucle donde si por ruido o algo se pone en alto el PIN C5 pues no se ira a la pantalla de bienvenida ni configuraciones
while((dispensados<5)&&(input(PIN_C5)==0)){ //*********ACA es donde planteo que si hay ruido o algo en el PIN no se ejecutario el while e iria de nuevo a la pantalla bienvenida y configuracion
lcd_putc("\f1-FREIDO\n2-DRENAJE"); //freido o manual
delay_ms(10);
X=read_adc();
if(input(PIN_C3)==1){ //aca se ejecutara el modo freido
if(input(PIN_C4)==1){ //aca se ejecutara el modo drenaje
}
}
}
3- Los otros problemas creo que podrian ser por ruido o algo por el estilo, lo estoy haciendo en Protoboard (es mas economico y no es requisito hacerlo en placa PCB)
Tengo un montaje viejo y nuevo, ambos realizados en proteus, aqui corre muy bien el programa nuevo y va 10/10 pero en la vida real no he probado porque como comente antes, no tengo acceso al programador por el momento
He realizado el montaje con el programa viejo y el circuito viejo y pasa todo lo que les comente, tambien probe realizando el circuito nuevo pero con el programa viejo y me sigue dando problemas, adjunto fotos de los circuitos en proteus:
Viejo: esto es solo una porcion de todo el circuito
Nuevo: esto es solo una porcion de todo el circuito

He investigado acerca del ruido y trate de implementarlo como esta en el circuito nuevo, pero al tener la programacion vieja no se si sera efectivo, creo que eso es todo, agradezco toda la ayuda posible en cuanto al tema y estare gustoso de proporcionar mas informacion en caso de que alguien la requiera. Adjuntare el codigo viejo y nuevo en forma de archivo .c y el circuito con su respectivo en proteus para que lo puedan visualizar mejor
*PD: He probado colocando capacitores en la zona de la fuente de poder, en VDD y VSS del Pic, tambien quiero que sepan que estoy utilizando drivers Pololu A4988 para los motores, aun no he conectado ni encendido los motores, solo sus drivers, ya que aun estoy estancado esto que les mencione (reinicios, activacion de interrupciones, medicion erronea de temperatura y congelamiento)
Gracias por tomarse el tiempo de leer, y por sus respuestas. Espero tengan un buen dia

*Pido disculpas si el tema no va en esta seccion y por lo largo del post