Autor Tema: Utilizacion del ADC del pic en CCS  (Leído 39525 veces)

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

Desconectado zonadjarn

  • PIC10
  • *
  • Mensajes: 45
Re: Utilizacion del ADC del pic en CCS
« Respuesta #15 en: 04 de Marzo de 2008, 08:41:25 »
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 valor convertido de Analogico en Digital
delay_ms(1); //para que se estabilice
}

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

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';
set_tris_a(0xff);
set_tris_b(0x00);
set_tris_c (0x00);
setup_adc(ADC_CLOCK_INTERNAL); //configura el converso
setup_adc_ports(All_analog); //entrada 0 como analogica
do {
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){
      luminosidad_minima_alcanzada();
}
if ((valor2>lummin)&&(valor2<lummax)){
if (alarma==0){
alarma=1;
printf("h");
port_c=0;
}
}
}while(true);
}


En los Albores de la Electronica, "THE GOD IS PIO LAZARO"

Desconectado Micro23

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 226
Re: Utilizacion del ADC del pic en CCS
« Respuesta #16 en: 04 de Marzo de 2008, 11:06:01 »
Citar
valor=read_adc(0); //Se guarda en la Variable Valor en valor convertido de Analogico en Digital
Citar
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
El pesimista se queja del viento
El optimista espera que cambie
El realista ajusta las velas

Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Re: Utilizacion del ADC del pic en CCS
« Respuesta #17 en: 04 de Marzo de 2008, 11:46:14 »
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 cheques espero que te sea utili, en cuanto regrese te paso la simulacion. Saludos.

Código: [Seleccionar]

#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);
   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


Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Re: Utilizacion del ADC del pic en CCS
« Respuesta #18 en: 04 de Marzo de 2008, 16:21:47 »
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: [Seleccionar]
#include <18F4525.h>
#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:

Desconectado cyberpablis

  • PIC10
  • *
  • Mensajes: 1
Re: Utilizacion del ADC del pic en CCS
« Respuesta #19 en: 24 de Agosto de 2012, 11:20:20 »
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);

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

Un abrazo.


 

anything