/*
Mini curso "Programación en XC8"
programa: ejemplo módulo conversor adc
pic: 18f4550
Ejemplo XC8 - LCD + Conversor AD + PWM. Uso de la nueva función itoa.
HARDWARE: Entrenadora Multiboard Pictrainer 2.0 Felixls
Microcontrolador: pic18f4550
cristal: 20mhz
CONEXIONES: Módulo LCD conectado en PUERTO D.
El módulo LCD utilizado en este programa no es el standard de felixls.
Quité el cd4094 y se utiliza el pin de RW
bus de datos en el nible alto conector IDC7 (rb 4 a 7)
DATA7 PUERTO D.7
DATA6 PUERTO D.6
DATA5 PUERTO D.5
DATA4 PUERTO D.4
bus de control en el nible bajo conector IDC4 (rb 0 a 3)
E_PIN PUERTO D.3
RS_PIN PUERTO D.2
RW_PIN PUERTO D.1
Módulo Analógico conectado en conector IDC 2 (conector idc e0-e3) a P0
POT1=E0
POT2=E1
Módulo IO digital conectado en conector IDC2
led pwm1 conector IDC2 (c0-c3) EN RC2
led pwm2 conector idc (C0-C3) EN RC1
Moviendo los potenciómetros del módulo analógico se controla la intensidad
de 2 leds por pwm y se visualizan en el LCD los valores de 0 a 1023.
*/
#define _XTAL_FREQ 20000000 // Linea necesaria para los cálculos de la función
// de delay. CUIDADO. no es para la configuración
// de la frecuencia de trabajo del cpu del pic.
// eso se determina en otro lado. :)
/*Includes globales*/
#include <xc.h>
#include <pic18.h>
#include <delays.h> /* Para utilizar demoras en nuestro código debemos incluir la librería delays.h.*/
#include <plib/adc.h> // libreria para conversor ADC
#include <plib/timers.h>
#include <plib/pwm.h>
#include <stdlib.h> // librería para poder usar itoa ?
/*Includes locales*/
#include "configuracion_de_fuses.c"
#include "xlcd_portd.h" // librería modificada para puerto D. Con dolor de cabeza solucionado. :)
/*declaración de variables globales*/
/*declaración de funciones*/
void myMsDelay(int ms);
void DelayFor18TCY(void);
void DelayPORXLCD(void);
void DelayXLCD(void);
///////////////////////////////////////////////////////////////////////////////
// Programa Principal //
///////////////////////////////////////////////////////////////////////////////
void main(void)
{
unsigned int Canal5, Canal6;
char cadena_de_texto[5];
TRISB=0b00000000; // Puerto B como salidas
LATB=0b00000000; //todas las salidas abajo
TRISC=0b00000000; // Puerto c como salidas
LATC=0b00000000; //todas las salidas abajo
Delay10KTCYx(255); //Retardo para esperar que pase cualquier transitorio
OpenXLCD(FOUR_BIT&LINES_5X7); //inicializamos LCD con varias lineas y caracteres 5x7
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);
Delay10KTCYx(255); //Retardo
WriteCmdXLCD(LINE_0); // Nos posicionamos en la posición 0
putrsXLCD("MULTIBOARD");
WriteCmdXLCD(NEXT_LINE+3);
myMsDelay(500);
putrsXLCD("PICTRAINER"); //escribe en lcd cadena de texto guardada en rom
myMsDelay(500);
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
putrsXLCD(" XC8 ");
myMsDelay(500);
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
WriteCmdXLCD(0x01); // Borra pantalla y vuelve al origen.-
while(BusyXLCD()){}
WriteCmdXLCD(0x80); // LINE_0
while(BusyXLCD()){}
putrsXLCD("CONV5 = "); //escribe en lcd cadena de texto guardada en rom
while(BusyXLCD()){}
WriteCmdXLCD(NEXT_LINE); //NEXT_LINE Nos posicionamos en la posición 8
while(BusyXLCD()){}
putrsXLCD("CONV6 = "); //escribe en lcd cadena de texto guardada en rom
while(1)
{ // rutina de conversión ADC
OpenADC(ADC_FOSC_RC & ADC_2_TAD & ADC_RIGHT_JUST, ADC_REF_VDD_VSS & ADC_INT_OFF, ADC_7ANA);
SetChanADC(ADC_CH5); // Selecciono canal a convertir.-
Delay10TCYx(1); // Retardo para que se cargue el capacitor sample&hold (Solo cuando se selecciona ADC_0_TAD).-
ConvertADC(); // Comienza conversión.-
while(BusyADC()){} // Hasta que se finalice conversión.-
Canal5= ReadADC(); // Realizo lectura.-
SetChanADC(ADC_CH6); // Selecciono canal a convertir.-
Delay10TCYx(1); // Retardo para que se cargue el capacitor sample&hold (Solo cuando se selecciona ADC_0_TAD).-
ConvertADC(); // Comienza conversión.-
while(BusyADC()){} // Hasta que se finalice conversión.-
Canal6= ReadADC(); // Realizo lectura.-
// escribimos valores leidos en el LCD
while(BusyXLCD()){}
WriteCmdXLCD(0x87); // Nos posicionamos en la posición 8 de la linea 1
while(BusyXLCD()){}
putrsXLCD(" "); //escribe en lcd cadena de texto guardada en rom
while(BusyXLCD()){}
WriteCmdXLCD(0x87); // Nos posicionamos en la posición 0
itoa( cadena_de_texto
, Canal5
, 10 ); // Convertimos entero a cadena de texto.- // Tener en cuenta que en XC8 la función itoa recibe tres
// parámetros (char * buf, int val, int base)
while(BusyXLCD()){}
putsXLCD(cadena_de_texto); // escribe en lcd variable canal 5 guardada en ram
itoa( cadena_de_texto
, Canal6
, 10 ); // Convertimos entero a cadena de texto.- while(BusyXLCD()){}
WriteCmdXLCD(0xC7); // Nos posicionamos en la posición 8
while(BusyXLCD()){}
putrsXLCD(" ");//escribe en lcd cadena de texto guardada en rom
while(BusyXLCD()){}
WriteCmdXLCD(0xC7); // Nos posicionamos en la posición 0
putsXLCD(cadena_de_texto); // escribe en lcd variable canal 6 guardada en ram
while(BusyXLCD()){}
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);
// rutina cambio de intencidad de leds por PWM
OpenTimer2( TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_8 );
OpenPWM1(0xff);
SetDCPWM1 (Canal6);
OpenPWM2(0xff);
SetDCPWM2 (Canal5);
Delay10KTCYx(50); //Retardo para evitar parpadeo en lcd.
} //final del while
} //final de main
/*desarrollo de Funciones*/
void myMsDelay(int ms)
{
while(ms--)
{
__delay_ms(1);
}
}
void DelayFor18TCY(void)
{
Delay1KTCYx(1); //provides a 20 Tcy delay
}
void DelayPORXLCD(void)
{
Delay1KTCYx(180);
}
void DelayXLCD(void)
{
Delay1KTCYx(60);
}