Hola. ¿Qué tal? No encontré algo así en el foro y por ello abrí el tema.
El problema que tengo es que estoy programando un PIC16F887 a 20MHz con CCS y necesito que una rutina se ejecute sin importar que otra rutina se ejecute en el PIC.
O sea, como si estuviera ejecutándose en un segundo plano.
Lo que tengo es lo siguiente, el PIC controla un LCD el cual despliega un menú que falta terminar pero el punto principal es que me muestra la temperatura en tiempo real utilizando un LM35.
Luego tengo otra rutina que de acuerdo a un LDR me enciende 1 ó 2 relevadores según esté más oscuro para las luces del auto.
Pero pues o me muestra cosas en el LCD o me controla los relevadores, y quiero que todo funcione al mismo tiempo.
Aparentemente claro, entendiendo que el PIC realiza un proceso a la vez a alta velocidad.
Ahí el código con las configuraciones de los ADC separada para que no se confunda el LCD ni el código de el LDR
Espero me puedan ayudar. Gracias.
El problema que tengo es que estoy programando un PIC16F887 a 20MHz con CCS y necesito que una rutina se ejecute sin importar que otra rutina se ejecute en el PIC.
O sea, como si estuviera ejecutándose en un segundo plano.
Lo que tengo es lo siguiente, el PIC controla un LCD el cual despliega un menú que falta terminar pero el punto principal es que me muestra la temperatura en tiempo real utilizando un LM35.
Luego tengo otra rutina que de acuerdo a un LDR me enciende 1 ó 2 relevadores según esté más oscuro para las luces del auto.
Pero pues o me muestra cosas en el LCD o me controla los relevadores, y quiero que todo funcione al mismo tiempo.
Aparentemente claro, entendiendo que el PIC realiza un proceso a la vez a alta velocidad.
Código:
#include<16F887.h>
#device ADC=10
#fuses HS,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=20000000)
#define use_portb_lcd TRUE
#include<LCD.C>
#define M PIN_D7 // 1 MENU
#define T PIN_D6 // 2 TEMPERATURA
//--------------------------------------------------------------------
int x;
long int ADC;
float temp,aux;
//--------------------------------------------------------------------
void config(void){
set_tris_d(0xF0);
set_tris_a(0x0F);
setup_adc(ADC_CLOCK_INTERNAL|VSS_VDD);
setup_adc_ports(sAN0);
set_adc_channel(0);
setup_comparator(NC_NC_NC_NC);
}
void config2(void){
set_tris_d(0xF0);
set_tris_a(0x0F);
setup_adc(ADC_CLOCK_INTERNAL|VSS_VDD);
setup_adc_ports(sAN1);
set_adc_channel(1);
setup_comparator(NC_NC_NC_NC);
}
void main(void){
config();
lcd_init();
delay_ms(1000);
lcd_gotoxy(1,1);
lcd_putc(" BIENVENIDO");
delay_ms(1000);
for (x=0;x<=2;++x){
lcd_gotoxy(1,2);
lcd_putc("CARGANDO SISTEMA");
delay_ms(400);
lcd_gotoxy(1,2);
lcd_putc("----------------");
delay_ms(400);
}goto MENU;
//-------------------------- --RELEVADORES-- ----------------------------//
INICIO:
config2();
if(!input(PIN_C6)){
delay_us(20);
LUCES:
do{
ADC=read_adc();
delay_ms(800);
if(ADC<=600){
output_d(0b0000001);
}else{
output_d(0x00);
}
if(ADC<=300){
output_d(0b00000011);
}else{
output_d(0x01);
}
if(ADC>600){
output_d(0x00);
}
if(input(PIN_C6)){
output_d(0x00);
goto INICIO;
}else{
goto LUCES;
}
}while(TRUE);
}else{goto INICIO;}
//-----------------------------LCD MENU-------------------------------//
MENU:
do{
lcd_gotoxy(1,1);
lcd_putc(" MENU ");
lcd_gotoxy(1,2);
lcd_putc(" TEMP C/C ");
if (input(T)){
goto TEMPERATURA;
}
}while(TRUE);
TEMPERATURA:
lcd_gotoxy(1,1);
lcd_putc(" TEMP EXT");
delay_ms(300);
lcd_gotoxy(1,2);
printf(lcd_putc,"INICIANDO SENSOR");
do{
if (input(M)){
goto MENU;
}
delay_ms(1000);
temp=read_adc();
temp=(temp*300)/614;
if(temp!=aux){
lcd_gotoxy(1,2);
printf(lcd_putc," < < < %0.0f'C > > >",temp);
delay_ms(400);
lcd_gotoxy(1,2);
printf(lcd_putc," - - %0.0f'C - - ",temp);
aux=temp;
}
if (input(M)){
goto MENU;
}
}while(TRUE);
}
Espero me puedan ayudar. Gracias.
Última edición por un moderador: