TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: PICYO en 25 de Marzo de 2010, 14:06:05

Título: comparador, conversor ad...los dos ?
Publicado por: PICYO en 25 de Marzo de 2010, 14:06:05
hola, tengo un pequeño lio mental. Vereis, quiero controlar la salida PWM, basandome en un ejemplo que tengo. Quiero modificar ese ejemplo, pero no se cómo. os pongo el esquema :
(http://img291.imageshack.us/img291/4242/circuito1.jpg)

y el programa :
Código: C
  1. #include <18f4520.h>
  2. #fuses XT,NOWDT
  3. #use delay(clock=4000000)
  4. #byte CMCON=0xFB4
  5. #byte TRISA=0xF92
  6.  
  7.  
  8. void main() {
  9.  
  10. int16  dutty;
  11.  
  12. TRISA= 0B11101011;
  13. CMCON= 0b00000100;
  14.  
  15.   setup_timer_2(T2_DIV_BY_4,62,1);
  16.   setup_ccp1(CCP_PWM);
  17.   set_pwm1_duty(714);
  18.  
  19. while(1) {
  20.   IF(C1OUT) dutty=714;
  21.   else dutty=0;
  22.   set_pwm1_duty(dutty);  }
  23. }

1. Con CMCON= 0b00000100 lo que hace es poner el tipo comparador 100, q pone 2 comparadores con la misma referencia. A parte de configurar el TRIS, no hace nada mas. Entonces, segun datasg¡heet esos pines de entrada se leen como analógicos?? Directamente ??(http://img695.imageshack.us/img695/9863/circuito2x.jpg)

2. Lo que yo esperaba ver, es una conversion a/d, es decir, medir la tension proporcionada en ese punto, digitalizarla, y compararla con una referencia distinta a la que hay ( la de la fuente de 4.5V).

3. Yo pretendo hacer pasar una tension diferente, de alrededor 0.02 voltios. Detectar dicha tension, y cerrar el modulo PWM en cuanto ocurriese eso. Entonces pues la duda es: a partir de que tension (minima) detecta el PIC que le entra algo ? Valdria poner un AO pues a esta modificacion mia ?
Y hace falta realmente hacer la conversion a/d ??
Título: Re: comparador, conversor ad...los dos ?
Publicado por: bmfranky en 25 de Marzo de 2010, 17:51:24
Porque no pruebas a establecer como entrada de uno de los comparadores , la señal que quieres controlar, y en la otra generas una igual al limite que quieras comparar  (con el generador interno de referencia sección 21.0 datasheet) , y aprovechas la interrupción de igualdad para decidir si paras o no el PWM, de esta forma ,configurando los dos comparadores, podrías detectar si es superior o inferior la señal de entrada, y así activar o desactivar el PWM.

Perdona si te parece una tonteria, pero creo que funcionaria.
Título: Re: comparador, conversor ad...los dos ?
Publicado por: PICYO en 26 de Marzo de 2010, 06:59:47
que tal bmfranky
Una  de las señales de entrada, es en efecto la que quiero controlar ( luego jugaria a modificar esa señal de entrada a mi antojo apara ver loq ue pasa).
La señal de referencia ( sin ser interna) pruebo a ponerla baja, y veo que no hay definicion minima, no reconoce el pic 0.02 V?
Título: Re: comparador, conversor ad...los dos ?
Publicado por: PICYO en 26 de Marzo de 2010, 07:32:16
uhm...puede que tenga problemas por el proteus..veo que un usuario dice no poder usar el modulo comparador correctamente pra un pic18, con su version 7.6
Mi version es ...espera que lo mire...7.2 entonces deberia tener problemas por ello.
Si alguien no los ha tenido, podria decir que hizo para solucionar eoss problemas?
Título: Re: comparador, conversor ad...los dos ?
Publicado por: PICYO en 26 de Marzo de 2010, 10:05:36


Bueno, al margen , o a la par, del fallido comparador, he decidido usar el A/D. Mido la tension en canal0 ( A0), y no obtengo respuesta  alguna..quiero que cuando el dato sea mayor, o menor, o igual ( he probado esas combinaciones para que por que si, empieze a digitalizar) encienda un pin ( el led asociado al pin), pero no funciona...alguien sabe que sucede ?!!!

Código: C
  1. #include <18f4520.h>
  2. #fuses XT,NOWDT
  3. #use delay(clock=4000000)
  4. #byte CMCON=0xFB4
  5. #byte TRISA=0xF92
  6. #byte TRISB=0xF93
  7.  
  8. #USE STANDARD_IO (A)
  9. #USE STANDARD_IO (B)
  10. #USE STANDARD_IO (C)
  11. #USE STANDARD_IO (D)
  12. #USE STANDARD_IO (E)
  13.  
  14. #byte  porta = 0xf80
  15. #byte   portb = 0xf81
  16. #byte   portc = 0xf82
  17. #byte   portd = 0xf83
  18. #byte   porte = 0xf84
  19.  
  20. #byte   t1con = 0xfcd
  21. #byte   latd = 0xf8c
  22.  
  23. #byte   adcon0 = 0xfc2
  24. #byte   adcon1 = 0xfc1
  25. #byte   adcon2 = 0xfc0
  26.  
  27. #byte   adresl = 0xfc3
  28. #byte   adresh = 0xfc4
  29.  
  30.  
  31. void main() {
  32.  
  33. int16  dutty;
  34. float value;
  35.  
  36. TRISA= 0B11101011;
  37. CMCON= 0b00000100;
  38. TRISB= 0B11001011;
  39.  
  40.  
  41.  
  42.  
  43.  
  44.   setup_timer_2(T2_DIV_BY_4,62,1);
  45.   setup_ccp1(CCP_PWM);
  46.   set_pwm1_duty(714);
  47.  
  48. while(1) {
  49.   IF(C1OUT) dutty=714;
  50.   else dutty=0;
  51.   set_pwm1_duty(dutty);  }
  52.   setup_adc (adc_clock_internal);     // selecciona el moodo para la configuracion del modulo conversor A/D
  53.                                     //correspondientes a los bits7:6 del ADCON0
  54.   setup_adc_ports (all_analog);       //DEFINICION DE LAS ENTRADAS ANALOGICAS CORRESPONDIENTE A LOS BITS 3-0 DEL ADCON1
  55.   set_adc_channel (0);                // Elige canal analogico a medir
  56.   delay_us (20);                      //espera 20 microseg
  57.   value=read_adc ();              // Hace conversión A/D
  58.   if (value>1){
  59.      output_high(pin_C5);
  60.      delay_ms(10000);
  61.      }
  62. }
Título: Re: comparador, conversor ad...los dos ?
Publicado por: bmfranky en 26 de Marzo de 2010, 10:25:10
Quiza te falte esto.
Código: [Seleccionar]
#device ADC=10 ///captura 10 bits
o
#device ADC=8/// captura 8 bits
Título: Re: comparador, conversor ad...los dos ?
Publicado por: PICYO en 26 de Marzo de 2010, 12:53:20
cierrto. me he dejado eso, pero sige igual..no se entera de nada...la verdad es que no qiero usar los ejemplos que tengo por ahi como una cotorra, porque entonces nunca sabr que esta pasando ...
Título: Re: comparador, conversor ad...los dos ?
Publicado por: bmfranky en 26 de Marzo de 2010, 14:09:06
Prueba con esto y me comentas, yo he simulado con potenciometro en RA0 y cuando pasa de 0 voltios prende el led y cuando vuelve a cero lo apaga.
Código: [Seleccionar]
 
      #include <18f4520.h>
 
      #fuses XT,NOWDT
 
      #use delay(clock=4000000)


#byte CMCON=0xFB4

#byte TRISA=0xF92

#byte TRISB=0xF93

 

#USE STANDARD_IO (A)

#USE STANDARD_IO (B)

#USE STANDARD_IO (C)

#USE STANDARD_IO (D)

#USE STANDARD_IO (E)
       

 
   

      void main() {
       
      int16  dutty;
       float value;
       
 
      TRISA= 0B11101011;

      CMCON= 0b00000100;
 
      TRISB= 0B11001011;
       
       
       
       
       
        setup_timer_2(T2_DIV_BY_4,62,1);
        setup_ccp1(CCP_PWM);
 
       set_pwm1_duty(714);
 
       set_pwm1_duty(dutty);
        setup_adc (adc_clock_internal);     // selecciona el moodo para la configuracion del modulo conversor A/D
                                          //correspondientes a los bits7:6 del ADCON0
        setup_adc_ports (AN0);       //DEFINICION DE LAS ENTRADAS ANALOGICAS CORRESPONDIENTE A LOS BITS 3-0 DEL ADCON1
        set_adc_channel (0);                // Elige canal analogico a medir
/// si redefines las entradas cada vez nunca leeras nada,
 
       while(1) {//1 el while tiene que abarcarlo todo o no chequea las entradas analoguicas.
        IF(C1OUT) dutty=714;
        else dutty=0;
       
         delay_us (20);                      //espera 20 microseg
        value=read_adc ();              // Hace conversión A/D
       if (value>1){//2 si mayor a 1 enciende
           output_high(pin_C5);
         
           delay_ms(10000);
         
         }//2
        else{//3 de lo contrario apaga.
        output_low(pin_C5);
        delay_ms(10000);
        }//3
       }//1

      }
Título: Re: comparador, conversor ad...los dos ?
Publicado por: PICYO en 29 de Marzo de 2010, 07:20:44
bueno va bien, pero lo que no entiendo es la forma de leer el analogico. Por ejemplo, si le pongo ( directamente, desde una fuente ) una tension de 1,5 voltios, y quiero que a mas tension se pare el PWM, por que solo lo hace si le pongo la tension menor  a 0.007?

Yo se que VDD*TENSION QUE QUIERO/1024 ( definicion a 10 bits) da ese numero que yo digo, 0.007..pero leche...el input es precisamente la tension que quiero, o sea 1,5 voltios... Que valor saca o lee el AD por la entrada de tension que el pongas en A0?? poniendo que precisamos de 10 bits en el AD.

Porque cada calculo que doy no me hace caso..no es logico que si pongo 1voltio en la entrada ( que 1<1,5) se me pare ya el PWM, he de bajar a esos 0.007...
Título: Re: comparador, conversor ad...los dos ?
Publicado por: pablomanieri en 29 de Marzo de 2010, 08:34:10
Si tienes configurado el ADC a 10Bits y tu tensión de referencia es 4.5V. La salida del ADC va a ser 1024 cuando la entrada sea 4.5V, ahora para los valores intermedios, es una simple regla de 3.

ValorADC=Vin*1024/4.5V.
por ejemplo si le metes 1.5v a la entrada
ValorADC=1.5V*1024/4.5V=341


si le colocas 0.007V a la entrada
ValorADC=0.007V*1024/4.5V=1.59
pero como el adc solo da valores enteros, te va a dar un 1 o un 2, esta oscilación es debida al error de cuantización.
Es decir que el valor que te da el ADC, es una valor que escala el rango entre Vref+ y 0V, a la longitud de la palabra que es de 10bits.

ValorADC=Vin*1024/Vref+


En este caso Vref- no se considera porque lo tienes a 0V
Título: Re: comparador, conversor ad...los dos ?
Publicado por: bmfranky en 29 de Marzo de 2010, 08:37:18
El problema lo tienes al asignar el valor del adc a un float, asignalo a un int 6 y lo podras ver en la simulacion, porque no se el motivo , el isis no lo muestra, el 0007 es la direccion en memoria; prueva esto y veras.
Código: [Seleccionar]
  #include <18f4520.h>
 
      #fuses XT,NOWDT
 
      #use delay(clock=4000000)


#byte CMCON=0xFB4

#byte TRISA=0xF92

#byte TRISB=0xF93

 

#USE STANDARD_IO (A)

#USE STANDARD_IO (B)

#USE STANDARD_IO (C)

#USE STANDARD_IO (D)

#USE STANDARD_IO (E)
      

 
    

      void main() {
      
      int16  dutty;
      INT32 TMP=0;
       float value;
        
  
      TRISA= 0B11101011;

      CMCON= 0b00000100;
 
      TRISB= 0B11001011;
        
      
        
        
        
        setup_timer_2(T2_DIV_BY_4,62,1);
        setup_ccp1(CCP_PWM);
 
       set_pwm1_duty(714);
 
       set_pwm1_duty(dutty);
        setup_adc (adc_clock_internal);     // selecciona el moodo para la configuracion del modulo conversor A/D
                                          //correspondientes a los bits7:6 del ADCON0
        setup_adc_ports (AN0|VSS_VDD);       //DEFINICION DE LAS ENTRADAS ANALOGICAS CORRESPONDIENTE A LOS BITS 3-0 DEL ADCON1
        set_adc_channel (0);                // Elige canal analogico a medir
/// si redefines las entradas cada vez nunca leeras nada,
 
       while(1) {//1 el while tiene que abarcarlo todo o no chequea las entradas analoguicas.
        IF(C1OUT) dutty=714;
        else dutty=0;
        
         delay_us (20);                      //espera 20 microseg
        value=read_adc();              // Hace conversión A/D
        TMP=value;
      if (value>1){//2
           output_high(pin_C5);
          
           delay_ms(10000);
        
         }//2
        else{//3
        output_low(pin_C5);
        delay_ms(10000);
        }//3
       }//1

      }
comprueva como un valor lo muestra y el otro no.
Título: Re: comparador, conversor ad...los dos ?
Publicado por: pablomanieri en 29 de Marzo de 2010, 08:41:47
Ahora si lo que necesitas es saber que tensión le aplicaste a la entrada, teniendo el valor que te da el ADC debes hacer

Vmedida=ValorADC*Vref+/1024
en tu caso si la Vref+=4.5v

Vmedida=ValorADC*4.5v+/1024


Si por ejemplo el ADC te dio un valor de ValoADC=341
Vmedida=341*4.5/1024=1.498V

Debes tener en cuenta que el valor de adc es un entero. Por lo tanto para poder realizar las operaciones correctamente, tu variable medida debes declararla como float.

Título: Re: comparador, conversor ad...los dos ?
Publicado por: PICYO en 29 de Marzo de 2010, 09:02:31
hola!
gracias por las respuestas a todos..que rapidos !

Lo del a tension de referencia no entiendo si es a 4,5 V..yo creo que son 5 voltios ( si no ponia yo a drede alguna Vref distinta). Bueno, en efecto, lo que es el "valor real" o sea, lo que lee, esta en los registros ADRESH y ADRESL. Del ADRESH solo cojo 2 bits, ya que esta para 10 bits. He visto en el isis una ventanita donde le puedes poner para ver el resultado de esos registros ( o los que quieras del pic) y...en efecto..por regla de 3...
si 1024 ( que son los 10 bits a 1) son los 5 voltios ( si no pongo nada de Vref. lo toma como 5..?) entonces 286 ( que es el valor que leo si meto 1.4 voltios de input, por los registros ADRESH=00000001  ADRESL=00011110) seran  x voltios. Solucionamos... y en efecto, sale 1.4 V .

Para que salgan los 1.4, se ha de sumar el 0 del resultado de los registros, o sea, no 286 sino 287.
Ahora pues, inhabilitar mi PWM hago esto :
Código: C
  1. value = read_adc();
  2.  delay_us(10);
  3.  valor_real=5.0*value/1024.0;
  4.  delay_us(10);
  5.  
  6. if(value>286){     //  286 ( mas el 0) es lo que lee el ADC del PIC con una entrada de 1,4 voltios
  7.  setup_ccp1(CCP_OFF);
  8.  setup_ccp2(CCP_OFF);

Ahora lo mas " bonito" seria hacer la comparacion del if, no con el valor del rgistro, sino con el valor de la tension que quiero, o sea valor real

El siguiente punto seria hacer esto solo con comparador ( que esa era la duda del principio) para ver que ventajas tiene hacerlo por conversion AD o por comparador, para parar el PWM
Título: Re: comparador, conversor ad...los dos ?
Publicado por: pablomanieri en 29 de Marzo de 2010, 09:28:47
Lo de 4.5v fue por lo que vi en el esquemático, y solo fue  modo de ejemplo  :lol:, en realidad en el código está configurado para 5V de Vref+.


Si utilizas los comparadores, solo vas a lograr un control On/OFF del pwm. con lo que el riple de salida creo va a ser muy grande.
Yo me inclinaría por utilizar el ADC y así poder implementar un control PID, para lograr así una tensión de salida lo más estable posible.
Título: Re: comparador, conversor ad...los dos ?
Publicado por: PICYO en 29 de Marzo de 2010, 09:58:00
uhmm..PID...si... Estoy de acuerdo, porque depende de que valor que se que "cortara" el PWM le deja hacer una pasadita... Si por ejemplo esa "pasadita" de valores lo pongo en mi circuito boost ( que por otra parte me esta costando configurarlo...pero eso es otro tema ya ) no deberia pasar nada, pq el tiempo de conversion del boost es algo mas lento ( hasta que se cargan los C de carga), pero depende de en que circuito lo use...esa pasadita por el valor malo una vez (solo) me daria probloemillas. Asi que si, en efecto, me decantaria por el AD que ya esta y un posible PID. De todos modos, probare el comparador, porque no lo he hecho, y asi ya tengo una cosa mas aprendida . merci!

PD: ahhh !! ahora entiendo lo de la Vref...uy que despitado...e sque ese primer circuito era para entender un segundo, que es el que pongo a continuacion..asi despejo dudas..nadie diga..." y este de que habla..?" jaja! :P

En ese circuito el boost me falla, lo que decia antes, pero para A0 pongo una fuente de tension analogica directa, para provar los valores de tension que quiero

(http://img193.imageshack.us/img193/2111/dibujoadi.jpg)
Título: Re: comparador, conversor ad...los dos ?
Publicado por: PICYO en 30 de Marzo de 2010, 09:09:17

ya entiendo como funciona el A/D. Para entenerlo mejor, he prescindido de hacerlo con las funciones que da CCS, y configurar los bits de los registros pertinentes "manualmente". Ahora si que me cabría la duda de , como han usado el tiempo de adquisición de datos. No quiero hacer una nueva función, lo dejaría asi... asi será más fácil pasarlos al compilador de  C18. Primero pongo como esta por CCS ( veo que noes muy nuevo por aqui..:P) y luego pongo como he configurado los bits de los registros del ADC.

Usando solo CCS:

Código: C
  1. #include <18F4550.h>
  2. #DEVICE ADC=10  // para decir que usare 10 bits. Este device no se como hacerlo "manualmente" sin usar CCS...
  3.  
  4. #include <stdlib.h>
  5. #include "ad_comparador_mis_registros.h"
  6. #use delay(clock=48000000) //
  7. #fuses XT,NOWDT
  8.  
  9.  
  10. #byte  porta = 0xf80   // direccionamiento de memoria para los puertos
  11. #byte   portb = 0xf81
  12. #byte   portc = 0xf82
  13. #byte   portd = 0xf83
  14. #byte   porte = 0xf84
  15.  
  16.  
  17.  
  18.  
  19. #USE STANDARD_IO (A)
  20. #USE STANDARD_IO (B)
  21. #USE STANDARD_IO (C)
  22. #USE STANDARD_IO (D)
  23. #USE STANDARD_IO (E)
  24.  
  25. void pulso(int x, long time,int duty);
  26. void temp1seg(void);
  27. void proteccion_intensidad(void);
  28.  
  29.  
  30. int x,dato1;     //
  31. float value,valor_real;
  32.  
  33. void main(){
  34. set_tris_A(0x0F);//XXO1111
  35. set_tris_B(0xF9);
  36. set_tris_C(0x10);        // |SD0|Tx|D+|D-|PWM|X|X|X|-> 00010000=0x10
  37. set_tris_D(0x00);
  38.  
  39.  
  40. setup_adc (ADC_CLOCK_INTERNAL);
  41. setup_adc_ports(AN0);
  42. set_adc_channel(0);
  43.  
  44. setup_timer_2(4,224,1);  //4KHz */
  45. x=256;
  46.  
  47. setup_ccp1(CCP_PWM);
  48. setup_ccp2(CCP_PWM);
  49.  
  50. setup_adc_ports (ALL_ANALOG );
  51. setup_adc( ADC_CLOCK_INTERNAL );
  52. set_adc_channel( 0 );
  53. delay_us(10);
  54.  
  55. while(1){
  56.  
  57.  pulso(256,1,0xAF);
  58.  
  59.  value = read_adc();
  60.  delay_us(10);
  61.  valor_real=5.0*(value)/1024.0;
  62.  delay_us(10);
  63.  
  64.  if(valor_real>1.4){// numero 286 en registros
  65.  
  66.  setup_ccp1(CCP_OFF);
  67.  setup_ccp2(CCP_OFF);
  68.  pulso(50,100,0x00);
  69.  output_high(pin_d2);
  70.  
  71.  }
  72.  
  73. }
  74. }
  75.  
  76. void pulso(int x, long time,int duty)
  77. {
  78. setup_timer_2(T2_DIV_BY_1,x, 1);
  79. set_pwm1_duty(duty);
  80. delay_ms(time);
  81. set_pwm1_duty(0);
  82.  
  83.  
  84.  
  85. void proteccion_intensidad(void){
  86. IF(C1OUT)dato1=0;
  87. }


esto lo substituyo por lo siguiente :

Código: C
  1. #include <18F4550.h>
  2. #DEVICE ADC=10
  3.  
  4. #include <stdlib.h>
  5. #include "ad_comparador_mis_registros.h"
  6. #use delay(clock=48000000) //
  7. #fuses XT,NOWDT
  8.  
  9.  
  10. #byte  porta = 0xf80
  11. #byte   portb = 0xf81
  12. #byte   portc = 0xf82
  13. #byte   portd = 0xf83
  14. #byte   porte = 0xf84
  15.  
  16.  
  17.  
  18. #USE STANDARD_IO (A)
  19. #USE STANDARD_IO (B)
  20. #USE STANDARD_IO (C)
  21. #USE STANDARD_IO (D)
  22. #USE STANDARD_IO (E)
  23.  
  24. void pulso(int x, long time,int duty);
  25. void temp1seg(void);
  26. void proteccion_intensidad(void);
  27.  
  28.  
  29. int x,dato1;     //
  30. float value,valor_real;
  31.  
  32. void main(){
  33. set_tris_A(0x0F);//XXO1111
  34. set_tris_B(0xF9);
  35. set_tris_C(0x10);        // |SD0|Tx|D+|D-|PWM|X|X|X|-> 00010000=0x10
  36. set_tris_D(0x00);
  37.  
  38.  
  39. /////////////////////////////////////ADCON0 |--|--|0|0|0|0|1,0|1|-> canal ad, estado conversion, habilitar conversion
  40.  CHS3=0;  //Para habilitar en canal 0
  41.  CHS2=0;
  42.  CHS1=0;
  43.  CHS0=0;
  44.  ADON=1; // habilitar el conversor A/D
  45.  ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46.  
  47.  ////////////////////////////ADCON1: A/D CONTROL REGISTER 1///////////////////////////////////////////////
  48.  VCFG_neg=0;   //  tension referencia Vref- o Vref- o Vss(0)
  49.  VCFG0_pos=0; // tension referencia Vref+ o Vref+ o Vdd(0)
  50.  PCFG3=0; // configurar puerto ( pines analogicos o digitales)
  51.  PCFG2=0; //
  52.  PCFG1=0; //
  53.  PCFG0=0; //
  54. ////////////////////////////////////////////////////////////////////////////////////////////////////
  55.  
  56. //////////ADCON2: A/D CONTROL REGISTER 2 ///////////////////////////////////////////////
  57.  
  58.  ADFM=0 ;  // A/D Result Format Select bit
  59.  
  60.  ACQT2=0 ;  // A/D Acquisition Time Select bits
  61.  ACQT1=0 ;
  62.  ACQT0=1;
  63.  
  64.  ADCS2= 1; // A/D Conversion Clock Select bits
  65.  ADCS1=1;
  66.  ADCS0=1 ;
  67.  
  68.  
  69.  
  70.  
  71.  
  72. setup_timer_2(4,224,1);  //4KHz */
  73. x=256;
  74.  
  75. setup_ccp1(CCP_PWM);
  76. setup_ccp2(CCP_PWM);
  77. delay_us(10);
  78.  
  79. while(1){
  80.  
  81.  pulso(256,1,0xAF);//pr2
  82.  
  83.  value = read_adc();   // esta funcion de lectura podria substituirla por la "suma" de los 2 bits del registro ADRESH y los 8 del ADRESL, pero aun no se como
  84.  delay_us(10);
  85.  valor_real=5.0*(value)/1024.0;
  86.  delay_us(10);
  87.  
  88.  if(valor_real>1.4){       // numero 286 en registros ADRESH + ADRESL
  89.  
  90.  setup_ccp1(CCP_OFF);
  91.  setup_ccp2(CCP_OFF);
  92.  pulso(50,100,0x00);
  93.  output_high(pin_d2);
  94.  }
  95.  
  96. }
  97. }
  98.  
  99. void pulso(int x, long time,int duty)
  100. {
  101. setup_timer_2(T2_DIV_BY_1,x, 1);
  102. set_pwm1_duty(duty);
  103. delay_ms(time);
  104. set_pwm1_duty(0);
  105. }
  106.  
  107.  
  108. void temp1seg(void){
  109.    int cont=0;
  110.    output_toggle(PIN_B1);
  111.  
  112.    while(cont<2){
  113.    set_timer1(3036);
  114.    while(get_timer1()>3036);
  115.    CONT++;
  116.    }
  117. }
  118.  
  119. void proteccion_intensidad(void){
  120. IF(C1OUT)dato1=0;
  121. }


y los registros estan ubicados en esta libreria ( bueno, no se si puedo llamarlo libreria, pero nos entendemos ):

Código: C
  1. /////////////////////////////REGISTROS DE COMPARADOR ////////////////////////////////////////////////
  2.  
  3. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  4. #byte CVRCON=0xFB5    // registro de control del comparador de referencia de voltaje
  5. #bit  CVREN=0xFB5.7
  6. #bit  CVROE=0xFB5.7
  7. #bit  CVRR=0xFB5.7
  8. #bit  CVRSS=0xFB5.7
  9. #bit  CVR3=0xFB5.7
  10. #bit  CVR2=0xFB5.7
  11. #bit  CVR1=0xFB5.7
  12. #bit  CVR0=0xFB5.7
  13. //CVRCON: COMPARATOR VOLTAGE REFERENCE CONTROL REGISTER ////////////////////////////////////////////////////////////////////////////////
  14. //|CVREN| CVROE| CVRR| CVRSS |CVR3| CVR2| CVR1| CVR0|                                                           //
  15. //bit 7 CVREN: Comparator Voltage Reference Enable bit                                                          //
  16. //   1 = CVREF circuit powered on                                                                                 //
  17. //   0 = CVREF circuit powered down                                                                              //
  18. //bit 6 CVROE: Comparator VREF Output Enable bit //
  19. //   1 = CVREF voltage level is also output on the RA0/AN0/CVREF pin //
  20. //   0 = CVREF voltage is disconnected from the RA0/AN0/CVREF pin//
  21. //bit 5 CVRR: Comparator VREF Range Selection bit//
  22. //   1 = 0.00 CVRSRC to 0.625 CVRSRC with CVRSRC/24 step size//
  23. //   0 = 0.25 CVRSRC to 0.719 CVRSRC with CVRSRC/32 step size//
  24. //bit 4 CVRSS: Comparator VREF Source Selection bit//
  25. //   1 = Comparator reference source, CVRSRC = (VREF+) . (VREF-)//
  26. //   0 = Comparator reference source, CVRSRC = VDD . VSS//
  27. //bit 3-0 CVR<3:0>: Comparator VREF Value Selection 0 . CVR3:CVR0 . 15 bits//
  28. //   When CVRR = 1://
  29. //   CVREF = (CVR3:CVR0/24) . (CVRSRC)//
  30. //   When CVRR = 0://
  31. //   CVREF = 1/4 . (CVRSRC) + (CVR3:CVR0/32) . (CVRSRC)//
  32. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33.  
  34. ///////////////////////////////REGISTROS DE DATO DE CONVERSION //////////////////////////////////////////////////////////////////////
  35. #byte ADRESH=0xFC4
  36. #byte ADRESL=0xFC3
  37. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38.  
  39. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  40. #byte CMON=0xFB4      // registro de control de comparador
  41. #bit C2OUT=0xFB4.7
  42. #bit C1OUT=0xFB4.6
  43. #bit C2INV=0xFB4.5
  44. #bit C1INV=0xFB4.4
  45. #bit CIS=0xFB4.3
  46. #bit CM2=0xFB4.2
  47. #bit CM1=0xFB4.1
  48. #bit CM0=0xFB4.0
  49. // CMCON: COMPARATOR CONTROL REGISTER ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  50. // |C2OUT |C1OUT| C2INV |C1INV |CIS |CM2 |CM1| CM0|
  51. //bit 7 C2OUT: Comparator 2 Output bit
  52. //   When C2INV = 0:
  53. //   1 = C2 VIN+ > C2 VIN-
  54. //   0 = C2 VIN+ < C2 VINWhen
  55. //   C2INV = 1:
  56. //   1 = C2 VIN+ < C2 VIN-
  57. //   0 = C2 VIN+ > C2 VINbit
  58. //bit 6 C1OUT: Comparator 1 Output bit
  59. //When C1INV = 0:
  60. //   1 = C1 VIN+ > C1 VIN-
  61. //   0 = C1 VIN+ < C1 VINWhen
  62. //   C1INV = 1:
  63. //   1 = C1 VIN+ < C1 VIN-
  64. //   0 = C1 VIN+ > C1 VINbit
  65. //bit 5 C2INV: Comparator 2 Output Inversion bit
  66. //   1 = C2 output inverted
  67. //   0 = C2 output not inverted
  68. //bit 4 C1INV: Comparator 1 Output Inversion bit
  69. //   1 = C1 output inverted
  70. //   0 = C1 output not inverted
  71. //bit 3 CIS: Comparator Input Switch bit
  72. //   When CM2:CM0 = 110:
  73. //   1 = C1 VIN- connects to RD0/PSP0
  74. //       C2 VIN- connects to RD2/PSP2
  75. //   0 = C1 VIN- connects to RD1/PSP1
  76. //       C2 VIN- connects to RD3/PSP3
  77. //bit 2-0 CM2:CM0: Comparator Mode bits
  78. //
  79. //Legend:
  80. //R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
  81. //-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
  82. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  83.  
  84.  
  85.  
  86.  
  87. //////////////////////////////////////////// REGISTROS DE A /D  /////////////////////////////////////////////////
  88. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  89. #byte ADCON0=0xFC2   // registro de control de  A/D CONTROL REGISTER 0
  90. #bit CHS3=0xFC2.5
  91. #bit CHS2=0xFC2.4
  92. #bit CHS1=0xFC2.3
  93. #bit CHS0=0xFC2.2
  94. #bit GO_DONE=0xFC2.1
  95. #bit ADON=0xFC2.0
  96. /* //////////////////////////////////////////////////////////////////////////////////////////////////////////
  97. // ADCON0: A/D CONTROL REGISTER 0
  98. |ADCS1| ADCS0 |CHS2 |CHS1| CHS0| GO/DONE| — |ADON|
  99. bit 7-6 ADCS1:ADCS0: A/D Conversion Clock Select bits (ADCON0 bits in bold)
  100. bit 5-3 CHS2:CHS0: Analog Channel Select bits
  101.    000 = Channel 0 (AN0)
  102.    001 = Channel 1 (AN1)
  103.    010 = Channel 2 (AN2)
  104.    011 = Channel 3 (AN3)
  105.    100 = Channel 4 (AN4)
  106.    101 = Channel 5 (AN5)(1)
  107.    110 = Channel 6 (AN6)(1)
  108.    111 = Channel 7 (AN7)(1)
  109. Note 1: These channels are unimplemented on PIC18F2X8 (28-pin) devices. Do not select
  110. any unimplemented channel.
  111. bit 2 GO/DONE: A/D Conversion Status bit
  112.    When ADON = 1:
  113.    1 = A/D conversion in progress (setting this bit starts the A/D conversion which is automatically
  114.       cleared by hardware when the A/D conversion is complete)
  115.    0 = A/D conversion not in progress
  116. bit 1 Unimplemented: Read as ‘0’
  117. bit 0 ADON: A/D On bit
  118.    1 = A/D converter module is powered up
  119.    0 = A/D converter module is shut-off and consumes no operating current  ////////////////////////////////////////// */
  120. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  121.  
  122.  
  123. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  124. #byte ADCON1=0xFC1   // registro de control de A/D CONTROL REGISTER  1
  125. #bit VCFG_neg =0xFC1.5
  126. #bit VCFG0_pos =0xFC1.4
  127. #bit PCFG3=0xFC1.3
  128. #bit PCFG2=0xFC1.2
  129. #bit PCFG1=0xFC1.1
  130. #bit PCFG0=0xFC1.0
  131. /* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  132. ADCON1: A/D CONTROL REGISTER 1
  133. //////////////////////////////////////////////////////////////////////////////////////////////
  134. |ADFM |ADCS2 |— |— |PCFG3| PCFG2| PCFG1 |PCFG0|
  135. bit 7 ADFM: A/D Result Format Select bit
  136.    1 = Right justified. Six (6) Most Significant bits of ADRESH are read as ‘0’.
  137.    0 = Left justified. Six (6) Least Significant bits of ADRESL are read as ‘0’.
  138. bit 6 ADCS2: A/D Conversion Clock Select bit (ADCON1 bits in bold)
  139. bit 5-4 Unimplemented: Read as ‘0’
  140. bit 3-0 PCFG3:PCFG0: A/D Port Configuration Control bits
  141. Legend:
  142. R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
  143. -n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
  144. Note: On any device Reset, the port pins that are multiplexed with analog functions (ANx)
  145. are forced to be analog inputs.
  146. ADCON1
  147. <ADCS2>
  148. ADCON0
  149. <ADCS1:ADCS0>
  150. Clock Conversion
  151. 0 00 FOSC/2
  152. 0 01 FOSC/8
  153. 0 10 FOSC/32
  154. 0 11 FRC (clock derived from the internal A/D RC oscillator)
  155. 1 00 FOSC/4
  156. 1 01 FOSC/16
  157. 1 10 FOSC/64
  158. 1 11 FRC (clock derived from the internal A/D RC oscillator)
  159. A = Analog input D = Digital I/O
  160. C/R = # of analog input channels/# of A/D voltage references
  161. Note: Shaded cells indicate channels available only on PIC18F4X8 devices.
  162. PCFG AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 VREF+ VREF- C/R
  163. 0000 A A A A A A A A VDD VSS 8/0
  164. 0001 A A A A VREF+ A A A AN3 VSS 7/1
  165. 0010 D D D A A A A A VDD VSS 5/0
  166. 0011 D D D A VREF+ A A A AN3 VSS 4/1
  167. 0100 D D D D A D A A VDD VSS 3/0
  168. 0101 D D D D VREF+ D A A AN3 VSS 2/1
  169. 011x D D D D D D D D — — 0/0
  170. 1000 A A A A VREF+ VREF- A A AN3 AN2 6/2
  171. 1001 D D A A A A A A VDD VSS 6/0
  172. 1010 D D A A VREF+ A A A AN3 VSS 5/1
  173. 1011 D D A A VREF+ VREF- A A AN3 AN2 4/2
  174. 1100 D D D A VREF+ VREF- A A AN3 AN2 3/2
  175. 1101 D D D D VREF+ VREF- A A AN3 AN2 2/2
  176. 1110 D D D D D D D A VDD VSS 1/0
  177. 1111 D D D D VREF+ VREF- D A AN3 AN2 1/2
  178. A = Analog input D = Digital I/O
  179. C/R = # of analog input channels/# of A/D voltage references
  180. Note: Shaded cells indicate channels available only on PIC18F4X8 devices.
  181. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
  182.  
  183. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  184. //////////ADCON2: A/D CONTROL REGISTER 2 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  185.  /*    |ADFM |— |ACQT2 |ACQT1| ACQT0| ADCS2| ADCS1| ADCS0|
  186.  
  187. bit 7 ADFM: A/D Result Format Select bit
  188.    1 = Right justified
  189.    0 = Left justified
  190. bit 6 Unimplemented: Read as ‘0’
  191. bit 5-3 ACQT2:ACQT0: A/D Acquisition Time Select bits
  192.    111 = 20 TAD
  193.    110 = 16 TAD
  194.    101 = 12 TAD
  195.    100 = 8 TAD
  196.    011 = 6 TAD
  197.    010 = 4 TAD
  198.    001 = 2 TAD
  199.    000 = 0 TAD(1)
  200. bit 2-0 ADCS2:ADCS0: A/D Conversion Clock Select bits
  201.    111 = FRC (clock derived from A/D RC oscillator)(1)
  202.    110 = FOSC/64
  203.    101 = FOSC/16
  204.    100 = FOSC/4
  205.    011 = FRC (clock derived from A/D RC oscillator)(1)
  206.    010 = FOSC/32
  207.    001 = FOSC/8
  208.    000 = FOSC/2
  209. Note 1: If the A/D FRC clock source is selected, a delay of one TCY (instruction cycle) is added before the A/D
  210. clock starts. This allows the SLEEP instruction to be executed before starting a conversion.*/
  211. #byte ADCON2=0xFC0
  212. #bit ADFM=0xFC0.7
  213. #bit ACQT2=0xFC0.5
  214. #bit ACQT1=0xFC0.4
  215. #bit ACQT0=0xFC0.3
  216. #bit ADCS2=0xFC0.2
  217. #bit ADCS1=0xFC0.1
  218. #bit ADCS0=0xFC0.0
  219. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  220.  
  221.  
  222.  
  223. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  224. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  225. /////                                                                                                                                                /////
  226. /////                                         PASOS PARA REALIZAR UNA CONVERSION A/D Y POSTERIOR COMPARACION                                          ////
  227. /////                                                                                                                                                 ////
  228. /////                                                                                                                                                 /////
  229. /////                                                                                                                                                 /////
  230. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  231. //
  232. //   1. Configurar el modulo A/D:
  233. //      * configurar pines analogicos/tension de referencia/I/O digitales -> ADCON1
  234. //      * seleccionar el canal input A/D -> ADCON0
  235. //      * seleccionar clock conversion A/D -> ADCON0
  236. //      * activar (ON) el modulo -> ADCON0
  237. //
  238. //   2. Configurar interrupcion A/D, si se desea
  239. //      * Clear el bit ADIF
  240. //      * setear los bits ADIE, y el bit GIE
  241. //
  242. //   3. Esperar el tiempo de adquisicion requerido
  243. //   4. inicio de la conversion.
  244. //      * Set en bit GO/DONE* -> ADCON0
  245. //   5. Esperar para la completa conversion A/D, por lo mismo:
  246. //      * Espera de cambios en el bit GO/DONE* para ser cleared o el bit ADIF seteado,
  247. //        o
  248. //      * Esperar la interrupción A/D
  249. //   6. Leer el resultado del registro A/D (ADRESH:ADRESL), limpiar el bit ADIF, si es necesario.
  250. //   7. Para la siguiente conversion, ir a paso 1 o 2.
  251. //


Bueno, espero que si alguien estaba como yo, dudndo de como hacian en CCS para configurarlo, le vaya bien esto. De todos modos, aún hay cosas que me gustaría cambiar, pero bueno, espero que os rsulte interesante :)