Friday, March 1, 2013
uso del pwm usart y adc C18
// USO DEL PWM CON ADC Y USART
#include
#include
#include
#include
#include
#include
#include
//Fuses para trabajar con 8Mhz/////////
#pragma config FOSC = INTOSCIO_EC //usamos 8Mhz internos
#pragma config PLLDIV = 5 //PLL DIV 20Mhz/5=4Mhz
#pragma config CPUDIV = OSC1_PLL2 //CPUDIV1 96Mhz/2=48Mhz
#pragma config USBDIV = 1 //tRABAJAMOS CON USB CLOCK divido en 1
#pragma config VREGEN = OFF //Trabajamos sin regulador interno 3.3v para usb
#pragma config FCMEN = OFF, IESO = OFF
#pragma config PWRT = ON, BOR = OFF,BORV = 0
#pragma config WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON, LPT1OSC = OFF,PBADEN = OFF,CCP2MX = ON
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF
#pragma config CPB = ON, CPD = ON
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF
#pragma config WRTB = OFF,WRTC = OFF,WRTD = OFF
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF
#pragma config EBTRB = OFF
/////Declaracion de variables ///////
/*------------------------------------------*/
unsigned int adc;
unsigned char cont;
unsigned int percent;
unsigned char flag=0;
/*------------------------------------------*/
//Prototipos de funciones ///////
/*------------------------------------------*/
void ISRTimer0(void); //Funcion de Interrupcion
void config(void); //Funcion de Configuraciones de puertos, Timer,pwm,usart,adc
/*------------------------------------------*/
//Inicio de la interrupcion por timer 0//////
// //////
//0x08 es la posicion de alta prioridad//////
//0x18 es posicion de baja prioridad //////
#pragma code Interrupcion = 0X0008
void VectorInterrupcion(void){
_asm goto ISRTimer0 _endasm
}
#pragma code
//Funcion de Interrupcion/////////////
#pragma interrupt ISRTimer0
void ISRTimer0(void){
cont++;
if(INTCONbits.TMR0IF==1 && cont==2){
flag=1;
INTCONbits.TMR0IF=0;
cont=0;
}
WriteTimer0(61629);
}
//Fin de la interrupcion //////////
/*------------------------------------------*/
//Incio de la funcion de configuracion///////
void config(void){
TRISA=0x01;
TRISC=0X80;
//Configuramos UART
OpenUSART( USART_TX_INT_OFF & //Disable Interrupts
USART_RX_INT_OFF & //----------------
USART_ASYNCH_MODE & //Modo asincronico
USART_EIGHT_BIT & //8 bit
USART_CONT_RX & //resepcion continua
USART_BRGH_HIGH ,
25); //FOSC / (16 * (spbrg + 1))
//spbrg=((FOSC/BAUD)/16)-1
//25=((8Mhz/19200)/16)-1
//Configuramos TIMER0
OpenTimer0(TIMER_INT_ON & //Interrupciones por timer0 activado
T0_16BIT & //16-bit
T0_SOURCE_INT& //Contar los ciclos internos 48Mhz/4
T0_EDGE_FALL & //~~_
T0_PS_1_256); //Preescalar =256
//Interrupcion timpo=(1/(FOSC/4))*preescalar*(65536-timer0)
// .500s=tiempo maximo
// timer0=+65536-{tiempo/[(1/(FOSC/4))*preescalar]}
WriteTimer0(61629); //Cargamos el timer0=0
//Configuramos ADC
OpenADC(ADC_FOSC_RC & //Clock Interno
ADC_RIGHT_JUST & //10bit
ADC_20_TAD , //20TAD
ADC_CH0 & //CANAL0
ADC_INT_OFF & //INTERRUPCIONES OFF
ADC_REF_VDD_VSS , //+5,GND
ADC_1ANA); //canal 0 analogo, resto digital
//Configuramos PWM
OpenTimer2(TIMER_INT_OFF &//Interrupcion timer2 OFF
T2_PS_1_16 &//preescalar = 16
T2_POST_1_1); //POst escalar=1
//
OpenPWM1(124);
//PWM period = [(period ) + 1] x 4 x Tosc x TMR2 prescaler
//PWM period = [(255)+1]x(4/8Mhz)x16
// [.001s/((4/8Mhz)*16)]-1=period
// [1/(f*(4/Tosc)*preescalar)]-1=period
OpenPWM2(124);
SetDCPWM1(127);
SetDCPWM2(127);
//Habilitamos interrupciones
RCONbits.IPEN=0; //Deshabilitamos prioridades
INTCONbits.PEIE=1; //Activamos Interrupciones por Timer0
INTCONbits.GIE=1; //Interrupciones global Activadas
}
void main(void){
OSCCON=0x70; //Oscilador a 8Mhz
//Se tiene que poner antes de todas las funciones
config(); //Funcion de configuracion
while(1){//bucle infinito
if(flag==1){ //Ha desbordado?
INTCONbits.PEIE=0; //Desactivamos TIMER0
flag=0; //TOGGLE timer0
Delay1KTCYx(1); //500uS
SetChanADC(0); //canal 0 empieza la conversion
ConvertADC(); //start convert
while(BusyADC()); //Ha terminado?
adc=ReadADC(); //lee dato
printf("ADC = %i\r\n",adc); //IMPRIME ADC
SetDCPWM1(adc); //CAMBIA VALORES DEL duty
SetDCPWM2(adc); //------------------------
INTCONbits.PEIE=1; //Activamos adc
}
}
}
Currently have 0 comentarios: