Vref de ADC en PIC18F4550

#FUSES PLL12 //Divide By 12(48MHz oscillator input)

para empezar esta mal la frecuencia de oscilacion, dices que es de 20MHz que cristal tiene?

estas duplicando el use delay tambien

y el diagrama?

el diagrama no lo puedo poner porque no me permite, dice que excede el tamaño para subir la foto
:unsure: y si lo haces mas chico o ve como te las arreglas XD
 
Última edición:
prueba cambiando el fuse de

#FUSES PLL12

a

#FUSES PLL5

y el delay ponlo de 48000000

osea asi el del programa principal

#use delay(clock=48000000) y nada mas elimina la linea del que esta en el archivo adc.h

y comentas si funciono.
 
Última edición:
Pues no funcionó. :cry: Ya quité la línea, modifiqué la programación y le puse #use delay (clock=48000000) y puse #FUSES PLL5 pero siguió igual.


Código:
#include <adc.h>
#use delay(clock=48000000)
#define  BITS  8

void main() 
{
   
   int16 valor_default;
   int16 valor_1; 
   
   setup_adc_ports(AN0_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);                                                                                                             
   set_tris_a(0b00000001);
   set_tris_b(0x00);
   
   set_adc_channel(0);
   delay_ms(10);
   valor_default=read_adc();
   
 while(true)
  {
        valor_1=read_adc(); 
        
        if(valor_1>valor_default)
          {
             output_high(pin_b0);
           valor_default=valor_1;
          }
        
        if(valor_1<valor_default)
          {
              output_low(pin_b0);
           valor_default=valor_1;
          }
  }
}




Código:
#include <18F4550.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES PLL5                    //Divide By 5(48MHz oscillator input)
#FUSES CPUDIV4                  //System Clock by 4
#FUSES USBDIV                   //USB clock source comes from PLL divide by 2
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES VREGEN                   //USB voltage regulator enabled
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES MCLR                     //Master Clear pin enabled
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES ICPRT                    //ICPRT enabled
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
 
Última edición por un moderador:
:unsure: asi deberia funcionar...

mira si quieres prueba agregando esta linea en el programa principal...

#device ADC=8

y quita esa que dice
#define BITS 8
que no sirve para nada.

y deja lo simulo yo para ver que se supone que debe hacer y como.
 
Pues ya le puse el #device adc=8 y le quite el #define bits 8 y pues en la simulacion si funciona al igual que antes pero ya en la protoboard sigue sin funcionar :$
 
a ver mira...

en el ADC.h pon esto:
Código:
#include <18F4450.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES PUT                      //Power Up Timer
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT                    //Program memory not write protected
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES NOIESO                     //Internal External Switch Over mode enabled
#FUSES NOFCMEN                    //Fail-safe clock monitor enabled
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
#FUSES BBSIZ2K                  //2K words Boot Block size
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL1                     //No PLL PreScaler

#use delay(clock=20000000)

y en el programa principal pon esto:

Código:
#include "ADC.h"


void main()
{
   int valor_default;
   int valor_1;
   
   setup_adc_ports(AN0|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_oscillator(False);
   set_tris_a(0b00000001);
   set_tris_b(0x00);

   set_adc_channel(0);
   delay_ms(10);
   valor_default=read_adc();

   while(true){
    valor_1=read_adc(); 
    if(valor_1>valor_default){
     output_high(pin_b0);
     valor_default=valor_1;}
    if(valor_1<valor_default){
     output_low(pin_b0);
     valor_default=valor_1;}
 }
}



:unsure: lo estuve simulando y me marca que se excede el tiempo de conversion.

tambien prueba poniendo un delay despues del Readac

asi...
....
while(true){
valor_1=read_adc();
delay_ms(10);
if(valor_1>valor_default){
output_high(pin_b0);
valor_default=valor_1;}

....
 
Última edición:
en la simulacion tambien esta bien pero cuando lo paso al pic y lo pruebo ahora todo el tiempo permanece prendido



acabo de observar lo que hace el pic y lo que me di cuenta es que si giro el potenciometro a la izquierda sin detenerlo si se queda apagado el led y so lo giro a la derecha sin detenerlo se queda prendido osea que si cumple con las condiciones pero si no muevo el potenciometro empieza a parpadear muy rapido el led por lo cual me hace pensar que hace falta una condicion:

if(valor_1==valor_default)
{
//no se que poner aqui
valor_default=valor_1;
}



y tambien tengo la duda de para que sirven estos:

setup_adc_ports(AN0|VSS_VDD);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_oscillator(False);
 
Última edición:
despues aclaramos las dudas del setup si quieres...

y si es muy logico que haga eso que te hace, le hace falta una histeresis ...

prueb asi:

Código:
   while(true){
    valor_1=read_adc();
    delay_ms(10);
    if(valor_1>valor_default+20){
     output_high(pin_b0);
     valor_default=valor_1;}
    if(valor_1<valor_default-20){
     output_low(pin_b0);
     valor_default=valor_1;}
 }

solo por probar.
 
Ya lo probe y......si ya funciona!!! hehe enserio amigo muchas gracias te debo una

entonces lo que estaba mal era que como no ponia como un intervalo de comparacion comparaba hasta las milesimas de la señal analogica y como varian causaba ese parpadeo me imagino :D !!
 
entonces lo que estaba mal era que como no ponia como un intervalo de comparacion comparaba hasta las milesimas de la señal analogica y como varian causaba ese parpadeo me imagino

si amigo, por ahi va el asunto, reviza como se hace una histeresis o comparador de ventana que no recuerdo en este momento como se hace el algoritmo. ese codigo no puede ser el ideal para el proposito que buscas.
 
si empezare a buscar mas sobre la histeresis.....solo que tambien no funcionaba porque le hacian falta los setup, no se si me puedas explicar breve para que sirve cada uno de los que le añadiste...
 
:unsure: mira no estoy muy seguro que es realmente lo que fue por lo que no jalaba, o sea el codigo no tenia esa rango de comparacion, los fuses no estaban del todo bien, y aparte eso del setup_ADC.

hay algunos valores que ya pone por defecto que quizas coincidan con los que puse, es cuestion de comparalos.

pero bueno, te explico que son mas o menos...

setup_adc_ports(AN0|VSS_VDD); -> este define el el puerto AN0 como analogo pero el voltaje de referecia va desde 0V hasta 5V. no se si el VSS_VDD este establecido como predeterminado si no se especifica, que en eso hay una diferencia con el que pusiste. y puedes checarlo en la ayuda del CCS

setup_wdt(WDT_OFF);este no tiene nada que ver, este WDT checa si el pic se pasma,pero esta deshabilitado y no creo que se hubiese estado pasmando.

setup_timer_0(RTCC_INTERNAL); ->este es la configuracion del modulo del timer, pero tampoco tiene mucho que ver.

setup_timer_1(T1_DISABLED); ->este tampoco tiene nada que ver pues es la configuracion del timer1
setup_timer_2(T2_DISABLED,0,1); ->este tampoco tiene nada que ver pues es la configuracion del timer2
setup_oscillator(False); y este tampoco tiene mucho que ver porque se usa con el oscilador interno y el pic usa el externo. (Que basicamente es un prescaler del oscilador y se maneja con el registro OSSCON)
 
Atrás
Arriba