Hola, buen dia, primero que nada felicidades por el foro. Soy nuevo aqui y tengo una pregunta relacionada a un proyecto que estoy haciendo con el dspic30F4011.
Por el momento solo estoy haciendo la prueba del ADC para ajustar un PWM entre 0 y 3ms y muestro la lectura del ADC en un LCD pero la lectura del ADC siempre
esta cambiando aun cuando el pot esta inmovil y no se cual sea el problema, ya configure el modo de maxima velocidad de muestreo que indica el datasheet respetando minimos de tiempos en Tad y todo lo demas pero a lo mejor estoy dejando por ahi un clavo suelto AAAAAAAAAAA jeje.
Otra pregunta que tengo es que si en #use delay(clock=4000000) eesta bien el valor de 4M aunque tenga PLL16 o debe ser 64M, uso un cristal de 4M
De ante mano muchas gracias
PD: el codigo esta en CCS
#include <30F4011.h> //EJEMPLO PWM
#device adc=10
#include <math.h>
#FUSES XT_PLL16 //XT Crystal Oscillator mode with 16X PLL
#FUSES PR //Primary Oscillator
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOWDT //No Watch Dog Timer
#FUSES MCLR // Master Clear pin enabled
#use delay(clock=4000000)
#define LCD_ENABLE_PIN PIN_D0 ////
#define LCD_RS_PIN PIN_D2 ////
#define LCD_RW_PIN PIN_D3 ////
#define LCD_DATA4 PIN_F1 ////
#define LCD_DATA5 PIN_F4 ////
#define LCD_DATA6 PIN_F5 ////
#define LCD_DATA7 PIN_F6
#include <lcd.c>
#define ADC_CLOCK_INTERNAL 0x0184
int16 p1;
float a;
unsigned int16 duty;
void main()
{
setup_timer1(TMR_DISABLED);
setup_timer2(TMR_INTERNAL | TMR_DIV_BY_8,0xABDF); //periodo de 22ms para servos
setup_compare(2, COMPARE_PWM | COMPARE_TIMER2);
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
#asm
mov #0x80E4,w4;
mov w4,0x02A0;
mov #0x0100,w4;
mov w4,0x02A2;
#endasm
;
setup_spi(FALSE);
//set_tris_B(0x01);
set_tris_D(0x00);
set_tris_F(0x00);
lcd_init();
int i=0;
set_adc_channel(0); // pot 1K
delay_us(10);
while(i==0){
p1=read_adc();
a= (93.75 * p1 / 1023.0);
duty=a * (int16)64;
set_pwm_duty(2,duty);
lcd_gotoxy(1,1);
printf(lcd_putc,"p1=%4ld",p1); // u,4ld,f
lcd_gotoxy(1,2);
printf(lcd_putc,"duty ms=%4ld",duty);
delay_ms(1);
}
}