Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
#include<16F887.h>
#device ADC=10
#fuses HS,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=20000000)
#define use_portb_lcd TRUE
#include<LCD.C>
#include<FUNCIONES_*****.h>
//--------------------------------------------------------------------
long int ADC;
float temp,aux;
//-------------------BLOQUES DE FUNCIONES-----------------------------
//CONFIGURACIONES
//ADC LDR//
void adcldr(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);
}
//ADC SENSOR//
void adcsen(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);
}
//FUNCIONES DE EJECUCIÓN
//FUNCION MAIN//
void main(void){
}
//FUNCION CONTROL//
void CONTROL(void){
do{
sensor();
delay_ms(20);
ldr();
delay_ms(20);
}while(TRUE);
}
//FUNCION LDR//
void ldr(void){
adcldr();
LUCES();
}
void LUCES(void){
if(!input(PIN_C6)){
delay_us(20);
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);
CONTROL();
}
CONTROL();
}while(TRUE);
}else{CONTROL();}
} //>>>>>>>>>>>>>>>>>>>>>>OK
//FUNCION SENSOR//
void sensor(void){
lcd_init();
delay_ms(1000);
lcd_gotoxy(1,1);
lcd_putc("TEMP. & LIGHTING");
lcd_gotoxy(1,2);
lcd_putc(" SYSTEM <1.0v> ");
delay_ms(800);
lcd_gotoxy(1,1);
lcd_putc(" STARTING ");
lcd_gotoxy(1,2);
lcd_putc("====>+~][~+<====");
delay_ms(400);
adcsen();
lcd_gotoxy(1,1);
lcd_putc(" TEMP EXT");
delay_ms(20);
lcd_gotoxy(1,2);
printf(lcd_putc,"INICIANDO SENSOR");
delay_ms(100);
temp=read_adc();
temp=(temp*300)/614;
if(temp!=aux){
lcd_gotoxy(1,2);
printf(lcd_putc," < < < %0.0f'C > > >",temp);
delay_ms(100);
lcd_gotoxy(1,2);
printf(lcd_putc," - - %0.0f'C - - ",temp);
aux=temp;
}
CONTROL();
}
Hola ingdirson todo depende la las tareas que quieras ejecutar, segun ellas en algun caso se opuede trabajar en rutina principal, en otros casos con las interrupciones y otros sera mejor usar RTOS.
por lo general basta y sobra unsar las interrupciones y en casos mas complejos serán RTOS mas interrupciones.
para tu caso puedo recomendarte que te interiorices en el RTOS de CCS me imagino que con eso sera suficiente.
Adjunto un ejemplo del como podria plantearse algo mejor las tareas.void leer()
{ int a,b,c;
dato=getc(); //****** esta instrucción "traba" a la tarea y se queda en bucle infinito****
lcd_init();
.
.
.
#include <18f452.h>
#fuses HS,NOWDT
#use delay(clock=20000000)
#use rs232(baud=19200,xmit=PIN_c6,rcv=PIN_c7,bits=8,parity=N)
#use RTOS(timer=0, minor_cycle=10ms)
#include <lcd.c>
#task (rate=10ms,max=1ms)
void puerto_serie();
#task (rate=100ms,max=1ms)
void leer_pulsadores();
/******************************************************************************
Tareas a ejectar
******************************************************************************/
#task (rate=100ms,max=1ms,enabled=false) //la terea no inicia automatocamente
void tarea1();
#task (rate=250ms,max=1ms,enabled=false) //la terea no inicia automatocamente
void tarea2();
#task (rate=350ms,max=1ms,enabled=false) //la terea no inicia automatocamente
void tarea3();
/*****************************************************************************/
void main()
{
lcd_init();
lcd_putc("T: | 1 | 2 | 3 |\n");
lcd_putc(" |off|off|off|");
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
rtos_run();
}
/******************************************************************************
Lee el estado del puerto serie
******************************************************************************/
void puerto_serie()
{
char dato_rx;
rtos_await(kbhit());
dato_rx=getc();
switch(dato_rx)
{
case 'r':
{
rtos_disable(tarea1);
output_low(pin_b0);
lcd_gotoxy(5,2);
lcd_putc("off");
putc(dato_rx);
break;
}
case 'v':
{
rtos_disable(tarea2);
output_low(pin_b1);
lcd_gotoxy(9,2);
lcd_putc("off");
putc(dato_rx);
break;
}
case 'a':
{
rtos_disable(tarea3);
output_low(pin_b2);
lcd_gotoxy(13,2);
lcd_putc("off");
putc(dato_rx);
break;
}
case 'c':
{
rtos_disable(tarea1);
rtos_disable(tarea2);
rtos_disable(tarea3);
output_low(pin_b0);
output_low(pin_b1);
output_low(pin_b2);
lcd_gotoxy(1,2);
lcd_putc(" |off|off|off|");
putc(dato_rx);
break;
}
}
}
/******************************************************************************
Lee los pulsadores y segun el caso habilita las tareas
******************************************************************************/
void leer_pulsadores()
{
if(input(pin_b4))
{
rtos_enable(tarea1);
lcd_gotoxy(5,2);
lcd_putc("on ");
}
if(input(pin_b5))
{
rtos_enable(tarea2);
lcd_gotoxy(9,2);
lcd_putc("on ");
}
if(input(pin_b6))
{
rtos_enable(tarea3);
lcd_gotoxy(13,2);
lcd_putc("on ");
}
}
void tarea1()
{
output_toggle(PIN_b0);
}
void tarea2()
{
output_toggle(PIN_b1);
}
void tarea3()
{
output_toggle(PIN_b2);
}
Código:******************************************************************************/ #task (rate=100ms,max=1ms,enabled=false) //la terea no inicia automatocamente void tarea1(); #task (rate=250ms,max=1ms,enabled=false) //la terea no inicia automatocamente void tarea2(); #task (rate=350ms,max=1ms,enabled=false) //la terea no inicia automatocamente void tarea3();
#include <16f877.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay(clock=4M)
#DEFINE use_portd_lcd TRUE
//#DEFINE use_portb_kbd TRUE (declarado en kbd.c)
#include <lcd.c>
#include <kbd.c>
#include <stdio.h>
#BYTE PORTC=0x07
#BYTE TRISC=0XFF
#BYTE PORTD=0X08
#BYTE TRISD=0X88
int FUERA(int cont); ///DONDE TIENE QUE ESTAR ESTAR DECLARADA?
int glooball; ///ESTA VARIABLE DEBE RECONOCERLA TANTO programa-principal Y TODOS LOS PROGRAMAS A LOS QUE LLAME
void main(){///programa-principal
int con,recogerdefuera;///
lcd_init();
kbd_init();
port_b_pullups(false);
while(true){///while true
recogerdefuera=FUERA(15);
for (con=0;10>con;con++){
printf(lcd_putc,"\fse recogio de FUERA(); es %d",recogerdefuera);
delay_ms(300);
}
if (glooball<100) { glooball++; } else { glooball=0; }
}///while true
}///programa-principal
////QUIERO SABER COMO ESCRIBIR ESTA FUNCION EN OTRO PROGRAMA Y QUE progama-principal PUEDA ////HACER USO DE ELLA LA RECONOZCA
FUERA(int cont) {
int co;
for (co=0;cont>co;co++){
lcd_putc("\fEsto codigo tiene que estar fuera del"); lcd_gotoxy(1,2);
printf(lcd_putc,"programa principal llamado PRUEBA %d",glooball);
delay_ms(300);
}
co=Input_c ();
return co;
}
////QUIERO SABER COMO ESCRIBIR ESTA FUNCION EN OTRO PROGRAMA Y QUE progama-principal PUEDA ////HACER USO DE ELLA
#include <18f452.h>
#fuses XT,NOWDT,NOPROTECT,WDT128,NOBROWNOUT
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_c6,rcv=PIN_c7,bits=8, parity=N) // declaracion de uso de protocolo rs232
#include <lcd.c>
#use standard_io(B)
char dato=0;
int val=0; // las variables y funciones que se declaran de forma GLOBAL podran ser accedidas desde
void recibe(char datos); // cualquier parte del codigo, siempre que esten llamadas por debajo de la declaracion.
#INT_RDA
void RDA_isr(void)
{
dato= getc(); // interrupcion por recepcion de datos por rs232
recibe(dato);
}
void main()
{
lcd_init();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
lcd_gotoxy(2,1); // programa principal
printf(lcd_putc,"BIENVENIDO ");
delay_ms(600);
while(true)
{
if(val==1)
{
printf(" esto es lo que quieres?\r\r"); // aqui se verifica la condicion del caso "1"
val=0;
}
}
}
void recibe(datos)
{
if (datos!='1' && datos!='a')
{
printf(" Dato no valido...\r"); // funcion.
printf(lcd_putc,"\f");
printf(lcd_putc,"Dato invalido!");
}
switch(datos)
{
case '1':
lcd_gotoxy(1,1);
printf(lcd_putc,"\f");
printf(lcd_putc,"recivido: %c",datos);
output_high(PIN_B0);
printf("\rled encendido!!\r");
val=1; // Esta es la variable que se prodra llamar desde cualquier lugar del programa.
break;
case 'a':
lcd_gotoxy(1,1);
printf(lcd_putc,"\f");
printf(lcd_putc,"recivido: %c",datos);
output_low(PIN_B0);
printf("\rled apagado!!\r");
}
}
while(true) {/// whil
if(val==1)
{ printf(" esto es lo que quieres?\r\r"); val=0; } // aqui se verifica la condicion del caso "1"
} //whil
#INT_RDA
void RDA_isr(void)
{
otroprograma(); // Me serviria esto si "otroprograma()" Tratase la variable vall
}