Microcontroladores PIC en Linux.
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

ADC para PIC16F*, driver y ejemplo.

Ir abajo

ADC para PIC16F*, driver y ejemplo. Empty ADC para PIC16F*, driver y ejemplo.

Mensaje por arcachofo Jue 4 Dic 2008 - 10:59

Este ejemplo muestra el uso del driver ADC que adjunto, lee tres canales ADC y los muestra por LCD, así que el driver LCD también se usa, pero esta vez para mostrar un número, no os sorprendais si el número os sale en hexadecimal, esta funcion del LCD todavía está por arreglar...

las funciones son:

adc_init( FOSC_32, A5_R0, INT_OFF); iniciar módulo ADC, donde:

FOSC_32:
Frecuencia de adc, en este caso 1/32 de la del oscilador del pic

A5_R0:
Definir entradas analógicas y Vref, en este caso todas las 5 del pic16f876a como analógicas y ninguna como Vref, Vref serán Vdd y GND (ver las posibles combinaciones en el driver y datasheet del pic a usar, o mirar aquí.

INT_OFF:
Interrupciones ADC deshabilitadas, la otra posiblidad es INT_ON.


adc_read(1); Leer canal ADC.

adc_close(); cerrar módulo ADC.



Driver ADC para descargar: adc_sdcc_sgr.h


Código del driver:
Código:

/*****************************************************************************
******************************************************************************
****                                                                      ****
****                    --- DRIVER ADC para PIC16F ---                  ****
**** ****
******************************************************************************
******************************************************************************

                            FUNCIONES DISPONIBLES:
------------------------------------------------------------------------------

adc_init( FOSC_32, A5_R0, INT_OFF); iniciar módulo ADC, donde:

FOSC_32:
Frecuencia de adc, en este caso 1/32 de la del oscilador del pic

A5_R0:
Definir entradas analógicas y Vref, en este caso todas las 5 del pic16f876a como analógicas y ninguna como Vref, Vref serán Vdd y GND (ver las posibles combinaciones en el driver y datasheet del pic a usar.

INT_OFF:
Interrupciones ADC deshabilitadas, la otra posiblidad es INT_ON.


adc_read(1); Leer canal ADC.

adc_close(); cerrar módulo ADC.


******************************************************************************
*****************************************************************************/

/* flag de interrupciones on/off */
#define INT_OFF   0x00
#define INT_ON   0x01

/* frequencia de oscillador */
#define FOSC_2   0x00
#define FOSC_4   0x04
#define FOSC_8   0x01
#define FOSC_16   0x05
#define FOSC_32   0x02
#define FOSC_64   0x06
#define FOSC_RC   0x07

/* configuracion de entradas y Vref(PCFG en ADCON1) */
#define A8_R0   0x00
#define A7_R1   0x01
#define A5_R0   0x02
#define A4_R1   0x03
#define A3_R0   0x04
#define A2_R1   0x05
#define A0_R0   0x06
#define A6_R2   0x08
#define A6_R0   0x09
#define A5_R1   0x0a
#define A4_R2   0x0b
#define A3_R2   0x0c
#define A2_R2   0x0d
#define A1_R0   0x0e
#define A1_R2   0x0f

void adc_init(unsigned char fosc, unsigned char pcfg, unsigned char config)
{
    ADCON0 = 0;
   ADCON0 = (fosc & 0x03) << 6;         // establecer frecuencia
   ADCON1 = (pcfg & 0x0F) | 0x080;         // establecer entradas
   if (fosc & 0x04)
      ADCS2 = 1;
   if (config & INT_ON)             // establecer interrupciones
   {
      ADIF = 0;
      ADIE = 1;
      PEIE = 1;
   }
   ADON = 1;               // habilitar módulo ADC
}

void adc_close(void)               // deshabilitar módulo ADC
{
   ADON = 0;
   ADIE = 0;
}

unsigned int adc_read(unsigned char canal)
{
   unsigned int valor;
   ADCON0 &= 0xC7;            // borrar anteriores selecciones
   ADCON0 |= (canal & 0x07) << 3;      // establecer canal seleccionado
   GO = 1;               // iniciar conversión
   while (GO);            // esperar que termine
   valor = ADRESH << 8 | ADRESL;      // leer valor
   return valor;            
}


Código del ejemplo:
Código:

/* ----------------------------------------------------------------------- */
/* Template source file generated by piklab */
#include

/* ----------------------------------------------------------------------- */
/* Bits de configuración: adapte los parámetros a su necesidad */

typedef unsigned int word;

word at 0x2007 CONFIG = _HS_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF & _CP_OFF;


//------------------------- DEFINICIONES LCD -----------------------------
//------------------------------------------------------------------------

#define RS RC1
#define RW RC2
#define EN RC3
#define DATOT TRISC
#define DATOP PORTC

#define FREQ 8000      // 8 Mhz

#include "lcd_sdcc_sgr.h"

//-------------------------------- ADC -----------------------------------
//------------------------------------------------------------------------

#define nivel_izq adc_read(1); n_izq = valor;
#define nivel_tra adc_read(2); n_tra = valor;
#define nivel_der adc_read(3); n_der = valor;

#include "adc_sdcc_sgr.h"

//----------------------- CONFIGURAR VARIABLES ---------------------------
//------------------------------------------------------------------------

int n_der;             //nivel luz derecha
int n_tra;             //nivel luz atras
int n_izq;             //nivel luz izquierda

void main()
{   
   lcd_init();

   espera_ms(100);

   adc_init( FOSC_32, A5_R0, INT_OFF);

   while( 1 )
   {
      lcd_clear();
      n_izq = adc_read(1);            //leer niveles de luz
      lcd_num( n_izq );
      lcd_comand(cursor_der);
      n_tra = adc_read(2);
      lcd_num( n_tra );
      lcd_comand(cursor_der);
      n_der = adc_read(3);
      lcd_num( n_der );
      espera_ms( 500 );
   }
}

arcachofo
arcachofo
Participante Activo
Participante Activo

Mensajes : 91
Fecha de inscripción : 26/11/2008

Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.