Programa de ccs para pic 16f887

Hola, ¿qué tal a todos? Espero se encuentren muy a gusto.
Aquí con una consulta para quien se pueda tomar el tiempo de leer algunas líneas y poderme dar algún consejo en este programa que tiene como fin no más que, según la señal de entrada (cuando se tiene 0) en un pin nos activa dos pines con un tiempo diferido.
Lo que me sucede es que al realizar la simulación en proteus y presionar el botón que me hace la simulación del "0" en la entrada, mandando a tierra no realiza la acción.
Muchas gracias por su tiempo y ojala puedan hacerme cualquier observacion. :D

Código:
#include <16f887.h>             //libreria del pic 16f887

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay (clock=8000000)      //Directiva indica la frecuencia del procesador
//#use fast_io(b)                 //Instrucciones de i/o para el puerto b 
//#use fast_io(c)                 //Instrucciones de i/o para el puerto c 
#bit monB0=0x06.0
#bit rele1A0=0x05.0
#bit rele2A1=0x05.1
#int_EXT

void EXT_isr(void)               // interrupcion
{
   if(!monB0)
   {
    rele1A0=1;
    delay_ms(1000);
    rele2A1=1;  
   
   }            //Condicion de entrada de monedero en B0
}
   
   void main(void)              //Funcion principal main
   
{
   port_b_pullups(TRUE);        //activar resistencias pull-up del puerto B 
   set_tris_B(0b00000001);      //establecer B0 como entrada
   set_tris_A(0b00000000);      //establecer A0 y A1 como salidas
   
   rele1A0=0;                    //inicializar variales
   rele2A1=0;
   
   enable_interrupts(GLOBAL);    //interrupcion
   enable_interrupts(INT_EXT);
   output_A(0);
   
   while(true);                  //bucle inf.
    
   
   
      
}
 
Última edición por un moderador:
te sugiero que revices como tienes tu monedero si en NC o NO, si lo tienes en NO, tienes que configurar la interrupcion asi:
ext_int_edge( H_TO_L );
si lo tienes en NC, es ext_int_edge( L_TO_H );

y la subrutina ponla asi:

Código:
void EXT_isr(void) // interrupcion
{
output_high(PIN_A0);
delay_ms(1000);
output_high(PIN_A1);

}
 
Última edición:
un delay de 1 segundo es una barbariad


Ahhh ¿Por qué es una barbaridad?



te sugiero que revices como tienes tu monedero si en NC o NO, si lo tienes en NO, tienes que configurar la interrupcion asi:
ext_int_edge( H_TO_L );
si lo tienes en NC, es ext_int_edge( L_TO_H );

y la subrutina ponla asi:

Código:
void EXT_isr(void) // interrupcion
{
output_high(PIN_A0);
delay_ms(1000);
output_high(PIN_A1);

}


Gracias papirrin. mas o menos entiendo, la verdad soy autodidacta, mi pregunta es que sucede con la condición del if y el monB0 (como interactua o como se verifica que se presiono o no). El monB0 lo estoy simulando con la resistencia pull-up y puse un botón que al pulsarlo ya lo manda a tierra y cambia el estado. Por lo que entiendo en tu respuesta mi monB0 estaría en NO y cuando se pulsa el botón en NC entonces usaría ext_int_edge( H_TO_L );

Bueno, le realicé las modificaciones y lo simulé, creo que eso me respondió la pregunta del if y el monB0 supongo que en cuanto el estado cambia se da la interrupción y esto logra que no se use el if y aya que meter más a monB0.

Este es el código.
Código:
#include <16f887.h>             //libreria del pic 16f887

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay (clock=8000000)      //Directiva indica la frecuencia del procesador
//#use fast_io(b)                 //Instrucciones de i/o para el puerto b 
//#use fast_io(c)                 //Instrucciones de i/o para el puerto c 
#bit monB0=0x06.0
#bit rele1A0=0x05.0
#bit rele2A1=0x05.1
#int_EXT

void EXT_isr(void)               // interrupcion
{
   output_high(PIN_A0);
   delay_ms(1000);
   output_high(PIN_A1);
   /* if(!monB0)
    {
    rele1A0=1;
    delay_ms(1000);
    rele2A1=1;  
   
    }*/            //Condicion de entrada de monedero en B0
}
   
   void main(void)              //Funcion principal main
   
{
   port_b_pullups(TRUE);        //activar resistencias pull-up del puerto B 
   set_tris_B(0b00000001);      //establecer B0 como entrada
   set_tris_A(0b00000000);      //establecer A0 y A1 como salidas
   
   rele1A0=0;                    //inicializar variales
   rele2A1=0;
   
   enable_interrupts(GLOBAL);    //interrupcion
   enable_interrupts(INT_EXT);
   ext_int_edge( H_TO_L ); 
   output_A(0);
   
   while(true);                  //bucle inf.
    
   
   
      
}
Muchas gracias. Esto está genial. :D Muy divertido.
 
Última edición por un moderador:
ahhh porque es una barbaridad...?
yo tambien le pregunto a trilobyte porque es una barbaridad, estoy intentando suponer que piensa que es un antirrebote pero no creo que ese sea el fin de ese pause, y no estaria de mas aclararas para que es esa pausa, pues no es muy conveniente usarlas dentro de rutinas de interrupcion aunque tampoco esta mal hacerlo.

Por lo que entiendo en tu respuesta mi monB0 estaria en NO y cuando se pulsa el botón en NC entonces usaría ext_int_edge( H_TO_L );

si usas un pullup en monedero estaria en NO, y en cuanto pase de alto a bajo inmediatamente pasa a la interrupcion con el ext_int_edge( H_TO_L ).

Bueno le realize las modificaciones y lo simule creo que eso me respondió la pregunta del if y el monB0 supongo que en cuanto el estado cambia se da la interrupcion y esto logra que no se use el if y alla que meter mas a monB0

si, el usar el If es como una especie de pleonasmo digital puesto que si entro es porque estuvo en bajo XD
 
Última edición:
Una cosa mas, a ver quien puede guiarme por un buen camino quisiera que la activacion de los reles fuera intercalada, osea una vez que se active monB0, se active un rele, la siguente vez el otro rele... y asi sucesivamente, con el propósito de poder después manejar esta intercalación con 4 entradas que varíen la proporción ejemplo: 1:1, 2:1, 3:1, 4:1 etc... esta es la idea que tengo si alguien podria colaborar con algo se los agradecería mucho ... PAZ Y AMOR PARA TODOS ...
 
Sobre el Delay...
Digamos que el PIC está congelado durante ese tiempo haciendo nada... por experiencia usar delays extensos se convierte en una mala práctica... poco a poco cuando tus programas sean más complejos, verás que eso es un problema.

Por cierto, usar delays largos en una interrupción es peor... te aparece algún mensaje respecto a eso luego de compilar??. Se puede pero se supone que una interrupción se debe de ejecutar lo más rápido posible...

Saludos.
 
yo tambien le pregunto a trilobyte porque es una barbaridad, estoy intentando suponer que piensa que es un antirrebote pero no creo que ese sea el fin de ese pause, y no estaria de mas aclararas para que es esa pausa, pues no es muy conveniente usarlas dentro de rutinas de interrupcion aunque tampoco esta mal hacerlo.



si usas un pullup en monedero estaria en NO, y en cuanto pase de alto a bajo inmediatamente pasa a la interrupcion con el ext_int_edge( H_TO_L ).



sil, el usar el If es como una especie de pleonasmo digital puesto que si entro es porque estuvo en bajo XD



ahh si lo he tenido que aprender sobre la marcha muchas gracias... y ps el pause lo usaba solo para ver que prendiera un led y luego otro con los reles pero bueno ya te escribi el proposito final que es el que pueda intercalar la activacion de los reles cada q se active monB0 y dependiendo de la configuracion de unas entradas que nos den la proporcion como ves esto??
 
el proposito final que es el que pueda intercalar la activacion de los reles cada q se active monB0 y dependiendo de la configuracion de unas entradas que nos den la proporcion como ves esto??

pues por lo que entendi necesitas poner el esquema completo de lo que quieres hacer para no estar adivinando y no necesitarias hacer ningun pause.
 
despues de horas en carretera estoy de vuelta

si efectivamente veo un DELAY y digo aaaay dios mio

pero bueno como dijeron colegas los delays muy largos como 1 segundo son una muy mala practica pues atoras la maquina

tal vez en algo facil no sea muy notorio el problema pero cuando haces varios calculos y pausas las interrupciones se pueden ver afectadas e incluso el funcionamiento del micro se ve afectado generando bugs desconocidos recuerden que es el CCS con bugs a mas no poder.

lo ideal es usar un delay muy pequeño que igual es nocivo pero a menor escala o un timer que cuando se cumpla un ciclo de reloj este haciedo otras cosas
 
Atrás
Arriba