Código en c

9
Código en c zonadjarn: A ver si me podeis ayudar porque no consiguo que me funcione para dos mediciones. Este es el codigo: #include <16f876.h> #device ADC=8 #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT #use delay(clock=4000000) #use standard_io(b) #use RS232(baud=4800,xmit=PIN_C6,rcv=PIN_C7) #byte port_a = 5 // Identificador asociado al registro de dirección 5 #byte port_b = 6 // Identificador asociado al registro de dirección 6 #byte port_c = 7 // Identificador asociado al registro de dirección 7 #byte port_d = 8 // Identificador asociado al registro de dirección 8 long valor,valor2,desactivaralarma; int8 tempmax=0b11001000; int8 tempmin=0b01010000; int8 lummax=0b11001000; int8 lummin=0b01010000; int alarma; char rec; void toma_adc_temperatura(void){ set_adc_channel(0); // Lectura del canal 0 delay_ms(1); //para que se estabilice valor=read_adc(0); //Se guarda en la Variable Valor en

Transcript of Código en c

Page 1: Código en c

Código en c

zonadjarn:A ver si me podeis ayudar porque no consiguo que me funcione para dos mediciones. Este es el codigo:

#include <16f876.h>#device ADC=8#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT#use delay(clock=4000000)#use standard_io(b)#use RS232(baud=4800,xmit=PIN_C6,rcv=PIN_C7)#byte port_a = 5   // Identificador asociado al registro de dirección 5#byte port_b = 6   // Identificador asociado al registro de dirección 6#byte port_c = 7  // Identificador asociado al registro de dirección 7#byte port_d = 8  // Identificador asociado al registro de dirección 8

long valor,valor2,desactivaralarma;int8 tempmax=0b11001000;int8 tempmin=0b01010000;int8 lummax=0b11001000;int8 lummin=0b01010000;int alarma;char rec;void toma_adc_temperatura(void){set_adc_channel(0); // Lectura del canal 0delay_ms(1);  //para que se estabilicevalor=read_adc(0); //Se guarda en la Variable Valor en valor convertido de Analogico en Digitaldelay_ms(1); //para que se estabilice}

void toma_adc_luminosidad(void){set_adc_channel(01; // Lectura del canal 0delay_ms(1);  //para que se estabilicevalor2=read_adc(1); //Se guarda en la Variable Valor en valor convertido de Analogico en Digitaldelay_ms(1); //para que se estabilice

Page 2: Código en c

}

void temperatura_maxima_alcanzada(void){ //Entra en la Funcion cunado se porduce una bajada de la temperatura por debajo del Límite Recomendado.if ((alarma==1) && (desactivaralarma=='n')){   printf("a");   alarma=0;   port_c=2;}}void temperatura_minima_alcanzada(void){ //Entra en la Funcion cunado se porduce una bajada de la temperatura por debajo del Límite Recomendado.if ((alarma==1)&&(desactivaralarma=='n')){   printf("b");   alarma=0;   port_c=1;}}

void luminosidad_maxima_alcanzada(void){ //Entra en la Funcion cunado se porduce una bajada de la luminosidad por debajo del Límite Recomendado.if ((alarma==1) && (desactivaralarma=='n')){   printf("j");   alarma=0;   port_c=2;}}void temperatura_minima_alcanzada(void){ //Entra en la Funcion cunado se porduce una bajada de la luminosidad por debajo del Límite Recomendado.if ((alarma==1)&&(desactivaralarma=='n')){   printf("k");   alarma=0;   port_c=1;}}

void main() {printf("c");port_c=0;alarma=1;desactivaralarma='n';

Page 3: Código en c

set_tris_a(0xff);set_tris_b(0x00);set_tris_c (0x00);setup_adc(ADC_CLOCK_INTERNAL); //configura el conversosetup_adc_ports(All_analog); //entrada 0 como analogicado {toma_adc_temperatura();output_b(valor);toma_adc_luminosidad();output_b(valor2);if (valor>tempmax){      temperatura_maxima_alcanzada();}if (valor<tempmin){      temperatura_minima_alcanzada();}if ((valor>tempmin)&&(valor<tempmax)){if (alarma==0){alarma=1;printf("c");port_c=0;}}

if (valor>tempmax){      temperatura_maxima_alcanzada();}if (valor<tempmin){      temperatura_minima_alcanzada();}if ((valor>tempmin)&&(valor<tempmax)){if (alarma==0){alarma=1;printf("c");port_c=0;}}if (valor2>lummax){      luminosidad_maxima_alcanzada();}if (valor2<tempmin){

Page 4: Código en c

      luminosidad_minima_alcanzada();}if ((valor2>lummin)&&(valor2<lummax)){if (alarma==0){alarma=1;printf("h");port_c=0;}}}while(true);}

Micro23:Citar

valor=read_adc(0); //Se guarda en la Variable Valor en valor convertido de Analogico en DigitalCitar

valor2=read_adc(1); //Se guarda en la Variable Valor en valor convertido de Analogico en Digital

Cuando utilizas esta funcion no debes pasarle el canal, ponela asi:

valor=read_adc();valor2=read_adc();

antes de llamar a esta funcion debes seleccionar el canal a leer con set_adc_channel(0) y set_adc_channel(1). Fijate que en tu codigo pusiste set_adc_channel(01

Saludos y Suerte

huichoman:Hola Zonadjarn.

Mira voy de salida a la escuela, vi tu post de manera rápida, en cuanto regrese te ayudo.La semana pasada nos dejaron una practica, utilizar el adc para leer un lm35, desplegar la temperatura en dos displays de 7 segmentos y que encendiera un led cuando llegara a cierta temperatura, te paso el código del programa, para que lo

Page 5: Código en c

cheques espero que te sea utili, en cuanto regrese te paso la simulacion. Saludos.

Código:

#include <18F4525.h>#device adc=8#FUSES NOWDT, HS, NOBROWNOUT, NOPUT, NOCPD, NODEBUG, NOWRT, NOWRTD,MCLR, NOLVP#use delay(clock=20000000)#include <stdlib.h>

void main(){   int x=0, temp=0, digito1=0,digito2=0;   float vadc=0;      byte const display[10] =  {0b00111111,  //0                              0b00000110,  //1                              0b01011011,  //2                              0b01001111,  //3                              0b01100110,  //4                              0b01101101,  //5                              0b01111101,  //6                              0b00000111,  //7                              0b01111111,  //8                              0b01100111}; //9

      setup_adc(ADC_CLOCK_DIV_32);   setup_adc_ports(AN0|VSS_VREF);   set_adc_channel(0);      output_low(PIN_B0);    while(1)  {         output_d(display[digito1]);   delay_us(100);

Page 6: Código en c

   output_c(0b00000010);   delay_us(100);   output_c(0b00000000);         vadc=read_adc();   temp=(int) ((vadc * 391) / 1000);   digito1=(temp/10);   digito2=temp%10;      output_d(display[digito2]);   delay_us(100);   output_c(0b00000001);   delay_us(100);   output_c(0b00000000);   delay_us(100);      if(temp>=30)      output_high(PIN_B0);   else      output_low(PIN_B0);    }

}

GAMBARIMASU

huichoman:Hola amigo, del codigo anterior, puedes quitar la parte del display de 7 segmentos.Te quedaría algo parecido a esto.

Lo que hace es leer el adc, despues convierte el valor del adc a temperatura en grados centigrados. Despues solo comparas con la temperatura que deseas que se dispare la alarma, en este caso activa un led conectado al B0.

Código:

#include <18F4525.h>

Page 7: Código en c

#device adc=8#FUSES NOWDT, HS, NOBROWNOUT, NOPUT, NOCPD, NODEBUG, NOWRT, NOWRTD,MCLR, NOLVP#use delay(clock=20000000)

void main(){   temp=0;   float vadc=0;        setup_adc(ADC_CLOCK_DIV_32);   setup_adc_ports(AN0|VSS_VREF);   set_adc_channel(0);      output_low(PIN_B0);    while(true)  {                 vadc=read_adc();   temp=(int) ((vadc * 391) / 1000);   delay_ms(5)    if(temp>=30)      output_high(PIN_B0);   else      output_low(PIN_B0);    }}

GAMBARIMASUUUUU  :mrgreen:

cyberpablis:Muchachos, no hace falta utilizar la definición preformateada de pines que incluye el CCS para declarar los pines a leer con el ADC.

Se puede usar, por ejemplo, la siguiente instrucción

setup_adc_ports(sAN1 | sAN2 | sAN6 | sAN7 | VSS_VDD);

Page 8: Código en c

En esta instrucción, la combinación de pines involucrados se define a voluntad.