Autor Tema: Importante para usar PIC10 y CCS  (Leído 1985 veces)

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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Importante para usar PIC10 y CCS
« en: 06 de Noviembre de 2009, 01:36:21 »
Por lo visto el foro regreso a la vida... aunque no llegue a enterarme porque estuve ausente algunas semanas  :oops: asi que se podria decir que yo tambien vuelvo a la vida... y queria aportar algo con lo que llevo peleandome algunas horas.
Este nuevo hilo tiene origen en http://www.todopic.com.ar/foros/index.php?topic=26125.0
No mucha gente se aventura a utilizar pics de la familia 10F. Son tan enanos que parece que apenas pueden hacer algo por nosotros, cuando en realidad tanta potencia en tan poco espacio es lo que me asombra!
Los que se aventuraron con ellos tal vez hayan tenido problemas con el puerto GP. Y si ha logrado resolver esos problemas sabran que CCS se esforzo poco en integrar estos micros a sus librerias.
En concreto hay 2 problemas graves con los que me tope:

El primero afecta a toda la familia 10F. Cuando queremos activar los pullups intentaremos usar PORT_B_PULLUPS() sin demasiado exito. Esto es porque estos micros tienes varias opciones "mezcladas" en un mismo registro y CCS no implemento bien las cabeceras para ellos.
La solucion implica saber apenas algo de ASM:
Código: C
  1. void set_options(void){
  2. //declaro el registro OPTION
  3. int Opciones = 0;
  4.  
  5. #bit nGPWU              = Opciones.7
  6. #bit nGPPU              = Opciones.6
  7. #bit T0CS               = Opciones.5
  8. #bit T0SE               = Opciones.4
  9. #bit PSA                = Opciones.3
  10. #bit PS2                = Opciones.2
  11. #bit PS1                = Opciones.1
  12. #bit PS0                = Opciones.0
  13.  
  14. //seleccionar configuracion
  15. nGPWU = 1;      //Wake-up on pin change (Enable = 0, Disable = 1)
  16. nGPPU = 0;      //Weak pull ups (Enable = 0, Disable = 1)
  17. T0CS = 0;       //Timer0 Clock source (T0CKl pin = 1, Interno = 0)
  18. T0SE = 0;       //Timer0 Source Edge (L_to_H = 0, H_to_L = 1)
  19. PSA = 0;        //Prescaler assignment (WDT = 1, Timer0 = 0)
  20. PS2 = 0;        //Prescaler rate (mirar datasheet)
  21. PS1 = 0;        //Prescaler rate (mirar datasheet)
  22. PS0 = 0;        //Prescaler rate (mirar datasheet)
  23.  
  24. #asm
  25.         movf Opciones   //Opciones -> W
  26.         option                  //W -> option
  27. #endasm
  28. }
Tan solo seleccionando "1" o "0" para cada opcion, y luego llamando "set_options();" desde el main quedara configurado el registro.

El metodo anterior implica usar una variable, y dado que estos PICs no les sobran variables, tal vez queramos usar este otro metodo:
Código: C
  1. void set_options(void){
  2. //Bit   Funcion         Descripcion
  3. // 7    !GPWU           Wake-up on pin change (Enable = 0, Disable = 1))
  4. // 6    !GPPU           Weak pull ups (Enable = 0, Disable = 1))
  5. // 5    T0CS            Timer0 Clock source (T0CKl pin = 1, Interno = 0)
  6. // 4    T0SE            Timer0 Source Edge (L_to_H = 0, H_to_L = 1)
  7. // 3    PSA                     Prescaler assignment (WDT = 1, Timer0 = 0)
  8. //2-0   PS                      Prescaler rate (mirar datasheet)                        
  9.  
  10. #asm
  11.               //76543210
  12.         movlw 0bxxxxxxxx
  13.         option
  14. #endasm
  15. }
Aqui no gastamos un byte, pero la forma de configurar el OPTION no es tan grafica ya que tenemos que modificar las "x" por 0 o 1 segun queramos, pero todas juntas.

Ambos metodos permitiran configurar varias opciones, algunas de las cuales, nada intuitivas, pero necesarias para poder usar algun pin como entrada o salida en vez de otra funcion que tenga.



Este otro problema aplica a los PICs 10F220 y 10F222. Estos pics tienen un ADC, y la instruccion "setup_adc" del CCS no funciona como deberia, ya que al seleccionar las entradas analogicas lo hace incorrectamente.
La solucion es la siguiente:
Código: C
  1. void set_adc(int An){
  2.         An = An | 0b00001101;
  3. #asm
  4.         movf An         //An -> W
  5.         movwf 0x7       //W -> ADCON0
  6. #endasm
  7. }

Y desde el main llamamos a set_adc, con las opciones que trae CCS para este pic, que serian: sAN0, sAN1, ALL_ANALOG, NO_ANALOGS (solo AN0, solo AN1, ambas, ninguna)

De esta manera, por ejemplo llamando a set_adc(sAN1); se activara GP1 como analogico, y quedara GP0 como digital.


En resumen, ambos metodos son cruciales a la hora de usar estos pics, ya que si no recurrimos a ellos, nos quedaremos con algunos pines inutilizables. Esto se entiende mejor mirando la tabla 5.1 de los datasheets que nos dice la configuracion inicial de cada pin:

Es decir que para usar un pin como entrada o salida digital, primero habra que desactivar las demas funciones que tenga ese pin.

Releyendo veo que no me explique demasiado bien, pero siendo las 5:30 de la mañana me permitire concluir el tema aqui y si surgen dudas se resuelven sobre la marcha  :mrgreen:
Espero que sea util!
Salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Importante para usar PIC10 y CCS
« Respuesta #1 en: 06 de Noviembre de 2009, 02:58:52 »
Qué bien me habría venido este post hace unos años cuando tuve que pelear con estos problemas. Lo resolví pero no de forma tan elegante como tú, seguro que viene muy bien a mucha gente.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Importante para usar PIC10 y CCS
« Respuesta #2 en: 06 de Noviembre de 2009, 11:08:40 »
Tal vez no di las debidas gracia, pero la solucion de los pullups me la diste tu, y a partir de eso, los demas problemas que surgieron los solucione de manera similar, ya que sabia donde buscar el problema...
Asi que gracias Noc! realmente lo unico que hice fue maquillar un poco el ASM para que sea mas facil configurar los pics, y no tener que andar traduciendo bits a hex  :mrgreen:
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.


 

anything