Autor Tema: comparador, conversor ad...los dos ?  (Leído 5786 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: comparador, conversor ad...los dos ?
« Respuesta #15 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 :)


 

anything