genero la onda. pero al variar el ciclo de trabajo, varia la amplitud, y ya no se que hacer para correguir el problema!! ayuda!!
#include <p18cxxx.h>
#include <delays.h>
#include <stdlib.h>
#include "lcd.h"
#pragma config PLLDIV = 5 // (20 MHz crystal)
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
#pragma config FOSC = HSPLL_HS //HSPLL_HS
#pragma config WDT = OFF
//variable lcd
CHAR lcd[16];
CHAR msg[]="% Alfa= ";
unsigned long n=0;
unsigned long conta=0;
float constante=17.64; // valor calculado por regla de tres
unsigned int ADC,Alfa;
unsigned long Valor_Escalado;
unsigned int adc_read(unsigned char ch);
// variable interrupcion
unsigned int count=0;
void initTimer (void);
void InterruptHandlerHigh (void);
// High priority interrupt vector
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
}
// High priority interrupt routine
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh ()
{
if (PIR1bits.TMR2IF == 1)
{
PIR1bits.TMR2IF = 0;
count++;
if(count==n)
PORTC=0;
if(count==512)
{
PORTC=0xFF;
count=0;
}
}
}
void main()
{
TRISB=TRISC=TRISD = 0x00; // set direction to be output
PORTC=0x0;
ADCON1 = 0x0F;
INTCONbits.GIE = 1; //enable global interrupts
INTCONbits.PEIE = 1; //enable peripherical interrupts
lcd_init();
TRISAbits.TRISA0 = 1;
initTimer();
do{
lcd_clear();
ADC = adc_read(0); // Read from channel 0 (AN0)
lcd_display(1,1,msg); // Display "mV = "
Valor_Escalado=ADC;
Valor_Escalado = constante*Valor_Escalado; // Scale up the result
Alfa = Valor_Escalado / 100; // Decimal part
itoa(Alfa,lcd); // Convert Vdec to string in "lcd"
lcd_display(1,8,lcd); // Output to LCD
Delay10KTCYx(250);
n=Alfa*2.85-1;
//initTimer();
}while(1);
}
void initTimer (void)
{
PR2 = 194; // T = (PR2+1) * 4 *(1/Fosc)*PRESCALER
// 16.25us= (PR2+1)* 4*(1/Fosc)*PRESCALER : Fosc=48Mhz : PRESCALER=1
T2CON=0;
T2CONbits.T2CKPS1 = 0;
T2CONbits.T2CKPS0 = 0; // 1:1 - prescaler
IPR1bits.TMR2IP = 1; // high priority
PIR1bits.TMR2IF = 0;
PIE1bits.TMR2IE = 1; //1=enable Interrupt
T2CONbits.TMR2ON = 1;
}
unsigned int adc_read(unsigned char ch){
unsigned int result;
ADCON0 = (ch & 0x0F) << 2;
ADCON1 = 0x0B; //RA0-RA3 Analog inputs.
ADCON2 = 0x96; // right justify,TACQ=4*TAD, TAD=1/(FOSC/64)
ADCON0bits.ADON = 1; // ADC on
ADCON0bits.GO_DONE = 1; // start
while (ADCON0bits.GO_DONE == 1);
result = ((unsigned int)(ADRESH) <<
+ ADRESL;
ADCON0bits.ADON = 0; // ADC Off
return result;
}