Autor Tema: secuencia luces_16F84A ¡¡iinteresante para principiantes!!!  (Leído 1657 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
secuencia luces_16F84A ¡¡iinteresante para principiantes!!!
« 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()

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: secuencia luces_16F84A ¡¡iinteresante para principiantes!!!
« Respuesta #1 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
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...