TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: daltonico82 en 23 de Enero de 2011, 19:35:21

Título: secuencia luces_16F84A ¡¡iinteresante para principiantes!!!
Publicado por: daltonico82 en 23 de Enero de 2011, 19:35:21
Hola mundo PIC; a continuación os dejo un código que implementa una secuencia sobre el puerto B y 2 pines puerto A. Se programan varios estados del puerto con distintos flashes todo ello implementando en una función que será llamada desde el programa principal, siendo sencillo de renonbrar y ampliar. Sólo tiene un fallo: que el el programa comience a desarrollarse depende que A1 llegue negativo (interruptor cerrado y conectado en un extremo a A1 y al otro GND); EL PROBLEMA y aquí mi pregunta: ¿cómo hacer que el programa se detenga instantaneamente cuando abra el interruptor?.Ahora mismo acaba toda la secuencia.

PD: A0 está configurado como entrada y cuando recibe negativo las salidas A2 y A3 se inhiben y no actúan en la secuencia antes de parar.

Saludos
Código: [Seleccionar]
#include <16F84a.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPUT,NOPROTECT
#use fast_io(B)
#use fast_io(A)
#byte PORTB = 0x06
#byte PORTA = 0x05
#bit RA3=PORTA.3
#bit RA2=PORTA.2
#bit inhibi=PORTA.0

int1 A3;
int1 A2;
int8 i;
int8 flash;
int8 TB;

void puerto(int8 TB, int1 A3, int1 A2)//funcion_flashes
{
switch (flash)
{

case 1://1flash
{
         PORTB=TB;
         if (inhibi==1){
         RA3=A3;
         RA2=A2;}
         else{
         RA3=0;
         RA2=0;}
         delay_ms(200);
         PORTB=0X00;
         RA3=0;
         RA2=0;
         delay_ms(300);
         i=0;
         break;
};

case 2://2flash
{
for(i=0;i<2;i+=1){
PORTB=TB;
         if (inhibi==1){
         RA3=A3;
         RA2=A2;}
         else{
         RA3=0;
         RA2=0;}
         delay_ms(200);
         PORTB=0X00;
         RA3=0;
         RA2=0;
         delay_ms(300);
};
         i=0;
         break;
};
 case 3://3flash
 {
 for(i=0;i<3;i+=1){
PORTB=TB;
         if (inhibi==1){
         RA3=A3;
         RA2=A2;}
         else{
         RA3=0;
         RA2=0;}
         delay_ms(200);
         PORTB=0X00;
         RA3=0;
         RA2=0;
         delay_ms(300);
};
         i=0;
         break;
 };


 case 4://5flash
 {
 for(i=0;i<5;i+=1){
PORTB=TB;
         if (inhibi==1){
         RA3=A3;
         RA2=A2;}
         else{
         RA3=0;
         RA2=0;}
         delay_ms(200);
         PORTB=0X00;
         RA3=0;
         RA2=0;
         delay_ms(300);
};
         i=0;
         break;
 };
}
}

void main (){
int u;
u=0;
i=0;
TB=0;
flash=0;
disable_interrupts(GLOBAL);
set_tris_b(0x00);
set_tris_a(0x03);
portb=0x00;
porta=0X00;

while(true)
{
do{
delay_ms(1);
}while(input(pin_a1)!=0);
delay_ms(20);

if(input(pin_a1)==0)
{
flash=1;
puerto(255,1,1);
flash=2;
puerto(153,0,1);
flash=2;
puerto(86,1,0);
flash=3;
puerto(255,1,1);

flash=1;
puerto(153,1,1);
flash=1;
puerto(86,1,1);
flash=2;
puerto(153,1,0);
flash=2;
puerto(86,0,1);
flash=3;
puerto(153,1,0);
flash=3;
puerto(86,1,1);

flash=4;// 5 flashes
puerto(255,1,1);

for(u=0;u<2;u+=1){

flash=1;//corrido
puerto(16,0,0);
flash=1;
puerto(32,0,0);
flash=1;
puerto(64,0,0);
flash=1;
puerto(128,0,0);
flash=1;
puerto(8,0,0);
flash=1;
puerto(4,0,0);
flash=1;
puerto(2,0,0);
flash=1;
puerto(1,0,0);
flash=1;
puerto(0,1,0);
flash=1;
puerto(0,0,1);
 };
u=0;

flash=1;
puerto(0,0,1);
flash=1;
puerto(0,1,0);
flash=1;
puerto(1,0,0);
flash=1;
puerto(2,0,0);
flash=1;
puerto(4,0,0);
flash=1;
puerto(8,0,0);
flash=1;
puerto(128,0,0);
flash=1;
puerto(64,0,0);
flash=1;
puerto(32,0,0);
flash=1;
puerto(16,0,0);

flash=3;
puerto(255,1,1);
}
//}while(input(pin_a1)==0);
}//WHILE1
}//MAIN()
Título: Re: secuencia luces_16F84A ¡¡iinteresante para principiantes!!!
Publicado por: ppyote en 23 de Enero de 2011, 19:59:42
¿cómo hacer que el programa se detenga instantaneamente cuando abra el interruptor?

lo mas facil seria que habilitaras en pin B0 como entrada y su interrupcion por cambio de flanco.... cuando cambie el pin de flanco,una pulsacion, que se dispare la interrupcion automaticamente...
eso es lo mas facil