Por lo visto el foro regreso a la vida... aunque no llegue a enterarme porque estuve ausente algunas semanas
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.0No 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:
void set_options(void){
//declaro el registro OPTION
int Opciones = 0;
#bit nGPWU = Opciones.7
#bit nGPPU = Opciones.6
#bit T0CS = Opciones.5
#bit T0SE = Opciones.4
#bit PSA = Opciones.3
#bit PS2 = Opciones.2
#bit PS1 = Opciones.1
#bit PS0 = Opciones.0
//seleccionar configuracion
nGPWU = 1; //Wake-up on pin change (Enable = 0, Disable = 1)
nGPPU = 0; //Weak pull ups (Enable = 0, Disable = 1)
T0CS = 0; //Timer0 Clock source (T0CKl pin = 1, Interno = 0)
T0SE = 0; //Timer0 Source Edge (L_to_H = 0, H_to_L = 1)
PSA = 0; //Prescaler assignment (WDT = 1, Timer0 = 0)
PS2 = 0; //Prescaler rate (mirar datasheet)
PS1 = 0; //Prescaler rate (mirar datasheet)
PS0 = 0; //Prescaler rate (mirar datasheet)
#asm
movf Opciones //Opciones -> W
option //W -> option
#endasm
}
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:
void set_options(void){
//Bit Funcion Descripcion
// 7 !GPWU Wake-up on pin change (Enable = 0, Disable = 1))
// 6 !GPPU Weak pull ups (Enable = 0, Disable = 1))
// 5 T0CS Timer0 Clock source (T0CKl pin = 1, Interno = 0)
// 4 T0SE Timer0 Source Edge (L_to_H = 0, H_to_L = 1)
// 3 PSA Prescaler assignment (WDT = 1, Timer0 = 0)
//2-0 PS Prescaler rate (mirar datasheet)
#asm
//76543210
movlw 0bxxxxxxxx
option
#endasm
}
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:
void set_adc(int An){
An = An | 0b00001101;
#asm
movf An //An -> W
movwf 0x7 //W -> ADCON0
#endasm
}
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
Espero que sea util!
Salu2