TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: isa12345 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
-
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!
-
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:
{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