Autor Tema: ayuda urgente  (Leído 2599 veces)

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

Desconectado isa12345

  • PIC10
  • *
  • Mensajes: 19
ayuda urgente
« en: 29 de Julio de 2011, 16:06:36 »
estoy tratando de hacer un programa en el cual dependiendo el valor de un pin, ya sea uno o cero; se vaya a una función, dentro de cada función va hacer diferentes actividades, pero quiero q siempre este alerta en que si cambia el valor de ese pin se vaya a la otra funcion. estoy manejando el ccs. algun consejo o ayuda mi codigo es el siguiente


#include <18F4550.h>
#fuses INTHS,NOPBADEN, NOWDT
#use delay(internal=8Mhz)
#include <lcdd.c>

#BYTE TRISA=0xF92
#BYTE PORTA=0xF80
#BYTE TRISB=0xF93
#BYTE PORTB=0xF81
#BYTE TRISC=0xF94
#BYTE PORTC=0xF82

void  manual();
void  autom();
void  enrrollar();
void  desenrrollar();
void  nada();
void  cero();
void  veinticinco();
void  cincuenta();
void  setentaycinco();
void  cien();


int1  man;
int1  aut;
int16 x=0;
int16 q;
int1   a;
int1   b;
int1  c;
int1  d;
int16 counter;
int   valor;

void  main ()

{
if (input(PIN_B6)==1){
valor=1;}
if (input(PIN_B6)==0){
valor=0;
}
   do{
   manual();
   }while(valor==0);
   do{
   autom();
   }while(valor==1);
 
}


void autom()
{  lcd_init();
   printf(lcd_putc," \f Modo Automático");
   delay_ms(100);
   TRISA=0xFF;
   setup_adc_ports(AN0_TO_AN1);//declaracion para activar el modulo ADC
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_timer_0(RTCC_DIV_1|RTCC_EXT_L_TO_H);
   lcd_init();
   
      do{output_high(PIN_A5);
      output_low(PIN_E1);
     
           //LECTURA DE VALOR ADC GENERADA POR UNA FOTORESISTENCIA POR EL PIN A0

      SET_ADC_CHANNEL(0);
      delay_us(20);
      q = read_adc();
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\ %Lu",q);
     lcd_gotoxy(1,2);
      printf(lcd_putc,"%Lu ",x );
      delay_ms(10);
    if(q>200)
         cero();
      else if((q>150)&&(q<199))
         veinticinco();
      else if((q>100)&&(q<150))
         cincuenta();
      else if((q>50)&&(q<100))
         setentaycinco();
      else if((q>0)&&(q<50))
         cien();
      set_timer0(0);
     
      if((a==1)||(b==1))
      {
         do{
            counter=get_timer0();
            lcd_gotoxy(8,2);
            printf(lcd_putc,"\ %Lu ",counter);
            delay_us(20);
           }while(counter!=1);
         if(a==1)
            x=x+1;
         else if(b==1)
            x=x-1;
      }
      else
         lcd_gotoxy(8,2);
         printf(lcd_putc,"   ");       
         
   
      }while(valor!=1);


}
void cero(){
   lcd_gotoxy(8,1);
   printf(lcd_putc,"0 ");
   delay_ms(100);
   if(x>0)
      enrrollar();
   if(x==0)
      nada ();
}
void veinticinco(){
   lcd_gotoxy(8,1);
   printf(lcd_putc,"25");
   if(x>25)
      enrrollar();
   if(x==25)
      nada ();
   if(x<25)
      desenrrollar();
}
void cincuenta(){
   lcd_gotoxy(8,1);
   printf(lcd_putc,"50");
  IF(x>50)
     enrrollar();
  if(x==50)
     nada ();
  if(x<50)
     desenrrollar();
}
void setentaycinco(){
   lcd_gotoxy(8,1);
   printf(lcd_putc,"75");
   IF(x>75)
      enrrollar();
   if(x==75)
      nada ();
   if (x<75)
      desenrrollar();
}
void cien (){
   lcd_gotoxy(8,1);
   printf(lcd_putc,"100");
   IF (x>100)
      enrrollar();
   if(x==100)
      nada ();
   if (x<100)
      desenrrollar();
}

Void enrrollar ()
{ //FUNCION PARA ENROLLAR LA PERSIANA
  //corriente();
  lcd_gotoxy(12,1);
  printf(lcd_putc,"EN");
  output_low(PIN_C6);
  delay_ms(100);
  output_high(PIN_C7);
  a=0;
  b=1;
 
}
Void desenrrollar ()
{  //FUNCION PARA DESENROLLAR LA PERSIANA
     // corriente();
     lcd_gotoxy(12,1);
     printf(lcd_putc,"DE");
     output_low(PIN_C7);
     delay_ms(100);
     output_high(PIN_C6);
     b=0;
     a=1;
 }
Void  nada()
{
   lcd_gotoxy(12,1);
   printf(lcd_putc,"NA");
   output_low(PIN_C5);
   output_low(PIN_C6);
   a=0;
   b=0;
}

void manual()
{
      output_low(PIN_A5);
      output_high(PIN_E1);
   
      lcd_init();
      printf(lcd_putc," \f Modo Man");
       delay_ms(100);     
       man=1;
       aut=0;
   Set_Tris_B(0b11111111); // puerto B como entradas
   TRISB=0xFF;            //
   Set_Tris_C(0b00000000); //Puerto C como salidas
   TRISC=0x00;             //
   PORTC=0x00;             // Se manda a limpiar el puerto C
   PORTB=0xFF;             // Se manda a limpiar el puerto B

     lcd_gotoxy(1,2);
      printf(lcd_putc,"%Lu ",x );
      delay_ms(100);
     
     

      if (input(PIN_B5)==1)
      {
         c=0;
         d=1;
      if(d==1 && x>0)
      {enrrollar();
      set_timer0(0);
      if(b==1)
      {do{
            counter=get_timer0();
            lcd_gotoxy(8,2);
            printf(lcd_putc,"\ %Lu ",counter);
            delay_us(20);
           }while(counter!=1);}
       if(b==1)
            x=x-1;
     
      }
     
         
         }

if (input(PIN_B4)==1){
         c=1;
         d=0;
     
 if(c==1 && x<100)
         {desenrrollar();
      set_timer0(0);
      if(a==1)
      {do{
            counter=get_timer0();
            lcd_gotoxy(8,2);
            printf(lcd_putc,"\ %Lu ",counter);
            delay_us(20);
           }while(counter!=1);}
       if(a==1)
            x=x+1;
        }
 }

 if (input(PIN_B3)==1 && x>0){
  do{       
enrrollar();
  set_timer0(0);
      if(b==1)
      {do{
            counter=get_timer0();
            lcd_gotoxy(8,2);
            printf(lcd_putc,"\ %Lu ",counter);
            delay_us(20);
           }while(counter!=1);}
       if(b==1)
            x=x-1;
     
 
  }while(x!=0);}
 
if (input(PIN_B2)==1 && x<100){
         do{
     desenrrollar();
      set_timer0(0);
      if(a==1)
      {do{
            counter=get_timer0();
            lcd_gotoxy(8,2);
            printf(lcd_putc,"\ %Lu ",counter);
            delay_us(20);
           }while(counter!=1);}
       if(a==1)
            x=x+1;
     }while(x<100);
}
}







mis funciones son manual y autom y el pin q utilizo es el b6

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ayuda urgente
« Respuesta #1 en: 29 de Julio de 2011, 16:43:32 »
Por favor, lee lar normas del foro. Con ese titulo muy pocos van a prestar atención a tu problema, que indique cual es el inconveniente.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda urgente
« Respuesta #2 en: 30 de Julio de 2011, 03:45:28 »
Disculpa pero no manejo mucho C, pero lo unico que te puedo decir es que aproveches las interrupciones de los Timers y del cambio de puerto B o interrupciones externas, dependiendo la cantidad de pulsadores que tenes...


Bit del registro INTCON:

RBIE: RB Port Change Interrupt Enable bit

Con esto te aseguras que cuando cambio el estado de un pin, entras directamente a la interrupcion, ahi podes tenes que ver que pin cambio y hacer el programa correspondiente. En el caso que necesites muchos botones.


Ahora en el 18F4550 mirando el datasheet observo tambine 3 pines de interrupciones externas configurables segun el flanco que desees. podrias usarlo..

Como dije yo de C nada.. nulo.. aunque veo estas partes:

Código: [Seleccionar]
      {do{
            counter=get_timer0();
            lcd_gotoxy(8,2);
            printf(lcd_putc,"\ %Lu ",counter);
            delay_us(20);
           }while(counter!=1);}

y si te pones a verlo por mas q presiones cualquier cosa no sale del do...while hasta que se cumple la condicion.. ejecutando eso.. sin poder entrar a las demas condiciones.

Imagino q ese proyecto asi como lo veo es para mantener una habitacion con una luz especifica durante el dia.. manejando una persiana.. y cuando anochece ?,, se vuelve re loco ? (vi que tiene modo manual) pero si te olvidas se pasa enrollando la persiana (cortina) ,

Son preguntas q me imagino, no es por ser metido ni nada,, y a la noche ? si prendes una luz ?, haces cambios en la cortina a cada ratito, conviene hacerlo cada 5 minutos por ejemplo ? son ideas xD, podrias hacer que si aumenta de golpe, caso de una luz artificial dejarla fija por mas tiempo,, y en caso de una bajada grande y no gradual hacerlo de inmediato.. xD

Bueno dejo de tirar ideas xD