ADC para PIC16F*, driver y ejemplo.
Página 1 de 1.
ADC para PIC16F*, driver y ejemplo.
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 del ejemplo:
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- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Temas similares
» LCD 44780 4-bits para PIC16F, driver y ejemplo.
» SDCC: Driver para LCD. PIC16F*
» SDCC: Driver para ADC PIC16f87x.
» Libreria LCD 4Bit , para Pic16f
» SDCC: Driver para Usart PIC16*
» SDCC: Driver para LCD. PIC16F*
» SDCC: Driver para ADC PIC16f87x.
» Libreria LCD 4Bit , para Pic16f
» SDCC: Driver para Usart PIC16*
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.