miércoles, 29 de julio de 2009

Programando pic's desde linux. (ADC)

Ayer se descubrió mientras la lluvia caía, que el error el cual trate de encontrar desde el lunes, fue simplemente el un cambio de memoria... Suele pasar y eso que ni qué... El mundo del debuggeo es muy entretenido y te deja cosas muy buenas.

Así que hoy para variar, me he puesto a darle duro a esto para poder partir en mas fragmentos y mejor documentados, por lo que la configuración quedo dividida en los una rutina mas para la configuración del ADC y una para la configuración general del PIC.


org 0
call Init
call ADC_Config
goto Principal
org 4
retfie

Y con esto tenemos un mejor panorama de la configuración del modulo de ADC del PIC. Basta señalar que Init solo configura los puertos de entrada y salida. Pero ADC_Config se limita a configurar el modulo como esta a continuación.


ADC_Config
;Cambiando al banco 1 para configuracion del ADC
bsf STATUS,RP0
bcf STATUS,RP1

;Desactivando las interrupciones
clrf INTCON
clrf PIE1
;Configurando las patitas del puerto A
movlw 0x8F

movwf ADCON1
;Cambiando de banco. Y con esta linea arreglamos el problema que teniamos con el mal funcionamiento del pic.
bcf STATUS,RP0
;Seleccionando la frecuencia de reloj para la conversión. Fosc/8

;ADCS1=0
;ADCS0=1
;ADON=1
movlw 0x41
movwf ADCON0

;Configurando el bit de estado de la conversión.
;GO=1. Iniciandoce la conversión.
bsf ADCON0,GO
return

Y con esto resolvemos el problema de sobre escritura de ADCON1. y podremos seguir. Ya les ire poniendo mas cosas para que podamos seguir experimentando.

martes, 28 de julio de 2009

Programando pic's desde linux. (código)

El viernes paso algo muy curioso, el programa no jalo ni hizo lo que tenia. Es mas, ni siquiera hizo algo. Pero como a la par también revisaba el código para el LCD, no me quedo tiempo para debuggear en MPLAB. Y siendo sinceros, no tenia ni idea de algunas partes del código.

Así que valientemente iremos a cazar leones con una varita.

Así que antes de que podamos hacer algo en cuanto al código, hay que saber que hace y por que lo hace.

Primero vamos a configurar el pic.

Código:

Init
bcf STATUS,RP0
bcf STATUS,RP1
clrf PORTA

clrf PORTB
clrf PORTC
clrf PORTE
clrf PORTD

bsf STATUS,RP0
;Desactivando las interrupciones
clrf INTCON
clrf PIE1

;Configurando las patitas del puerto A
movlw 0x8F
movwf ADCON1
;---------------------------
clrf TRISB

clrf TRISE
bsf STATUS,RP0
;Seleccionando la frecuencia de reloj para la conversión. Fosc/8
;ADCS1=0

;ADCS0=1
;ADON=1
movlw 0x41
movwf ADCON0
;Configurando el bit de estado de la conversión.

;GO=1. Iniciandoce la conversión.
bsf ADCON0,GO
bcf STATUS,RP0
return

Ahora veremos que hace la función de leer.

Leer_ADC
;Se concatena IRP con FSR para seleccionar el banco de RAM
;0=Banco 0 y 1 (00h-FFh)
bcf STATUS,IRP
movwf FSR

movf INDF,w
movwf LSB
movlw 0x1E
movwf FSR

movf INDF,w
movwf MSB
bsf ADCON0,GO
return

Noches de trabajo


Noches de trabajo, originalmente cargada por Mr. Silent.

Ese es el escritorio que uso cada noche y donde planeo las entradas que aquí publico.

Nada como el café, la música y el whisky para una noche fría.

miércoles, 22 de julio de 2009

Creando un sistema de verciones con CVS. (introducción)

El programar es algo que me entretiene mucho y que trato de compartir con ustedes desde este blog. Pero la verdad es que me pongo a hacerle cada cosa que luego de tener una versión estable y funcional, termino teniendo una cosa que no tiene ni pies ni cabeza, por lo que los errores son cosa de todos los días y que podíamos estar guardando bajo un nombre diferente cada versión estable para poder regresar a ella en caso de una catástrofe.

Pero eso es verdaderamente tedioso, normalmente no lo hacemos y cuando nos acordamos, es demasiado tarde para que podamos dar vuelta atrás.

CVS (Concurrent Versións System) es una aplicación que permite la implementación de un sistema de verciones, manteniendo el registro de todo el trabajo y los cambios a un archivo. Permitiendo a demás, que distintos desarrolladores puedan tener acceso y trabajen de forma ordenada y sincronizada.

Creando el repositorio.

En modo de super usuario (De preferente estar en la cuenta y no por medio de sudo o el comando su) desde la linea de comandos teclea:

[root@Developer]#cvs -d /home/Sugizo/Public/cvsroot init

El directorio '/home/Sugizo/Public/cvsroot' es donde nuestro repositorio de fuentes se encontrará. Yo recomiendo que crees un grupo para acceder a este repositorio, algo así como cvs, develop, o cualquier cosa que se te ocurra. Y para crear un grupo desde la línea de comandos:

groupadd [-g group_id [-o]] [-r] [-f] nombre_del_grupo

Donde -g especifica el Id del grupo que debe ser un valor único y es mayor a 500. Si decides usar -o, el valor se acignara automaticamente y no será necesario poner -g.

-r, especifica al sistema que el id debe estar por debajo de 499. Cosa que yo no recomiendo, ya que todo por debajo de 499 sin id para el sistema.

-f le indica que cree el grupo a la fuerza y que oblige al sistema a no dar error en dado caso que pueda generar uno y no crearlo.

[root@Developer]#groupadd -g 503 developers_cvs

Cambiamos el repositorio de grupo root a developers_cvs con chown

[root@Developer]#chown -r root:developers_cvs /home/Sugizo/Public/cvsroot

Y agregamos el usuario al grupo con el comando usermod, donde el parametro -G, agrega grupos al usuario (usermod [-G grupo, grupo2, ...] usr)

[root@Developer]#usermod -G developers_cvs Sugizo

O puedes editar directamente '/etc/group' donde cada linea se compone de:
'nombre del grupo':'passwd del grupo':'id del grupo':'miembros del grupo'
El password no es obligatorio, por lo que puedes dejarlo en blanco.

Por último, cambia los permisos de '/home/Sugizo/Public/cvsroot' con el comando chmod

[root@Developer]#chmod -R 750 /home/Sugizo/Public/cvsroot

Con ello, todos los que esten el el grupo podrán escribir en el repositorio y leer de el.

Mas adelante hablaremos de como manejar cvs desde la linea de comandos, eclipse y Cervisia.

Programando pic's desde linux. (código)

En este punto, aún puedo escuchar un viejo reclamo de una amiga muy querida que solía decirnos a su novio y a mi: 'Estas como medio obsesionado con la programación. Me das miedo...'

Y siguiendo esa línea y en el mismo mood, se me ha dado la idea de hacer y poner todo un programa comentado para compartirlo con la comunidad estudiantil que lo necesite.

Espero que les pueda servir de algo.
; Programa de muestra hecho para el estudio de mi enanisima!!!

;Bits de configuración.
;LVD_OFF=Programa de voltaje bajo apagado.

;CP_OFF=Protección de código
;PWRTE_ON=habilita el reset mediante power up timer
;XT_OSC=Se utiliza un cristal de cuarzo
;BODEN_OFF=desabilita el reset por caida de tención.
;WDT_OFF= DESABILITA EL PERRO GUARDIAN.

__CONFIG _LVP_OFF & _CP_OFF & _PWRTE_ON & _XT_OSC & _BODEN_OFF & _WDT_OFF

;Generador de archivos list y llamada a librerias.

list p=pic16f877
;RADIX HEX
include<p16f877.inc>

;Declaración de variables
;b'00000111' Este valor pasa al registro OPTION_REG para configurar el divisor de frecuencia.
Prescaler equ d'256'
TMR_50ms equ d'56'

Cont equ 0x20
Cont1 equ 0x21
Temp equ 0x22


;indicadores del pic16f877

org 0x00
;Llamando a la rutina de configuración del pic.
call Init

;Llamando a la rutina principal del programa.
goto Principal
org 4
retfie
org 5

;rutinas

Init
;Cambiando al banco0.
bcf STATUS,RP0
bcf STATUS,RP1

;limpiando los puertos
clrf PORTA
clrf PORTB
clrf PORTC

clrf PORTE
;Cambiando al banco1
bsf STATUS,RP0
;Cambiando puertos de entrada a salida

;clrf TRISA
clrf TRISB
clrf TRISC
clrf TRISD

clrf TRISE
;Cambiando al banco0
bcf STATUS,RP0
return

confPrescaler
bcf STATUS,RP1
bcf STATUS,RP0
movlw b'00000001'

movwf OPTION_REG

;Algoritmo proporcionado por Labra Porthela Victor Manuel
;Lazo anidado.
delay10mS
movlw d'21'

call dmS
return

dmS
movwf Cont

ciclo
decfsz Cont,F
goto dmS1
return

dmS1

call d500uS
nop
goto ciclo

d500uS
movlw d'163'

call duS
return

duS
movwf Cont1


ciclo1
decfsz Cont1,F
goto ciclo1
return

;Programa principal.

Principal
;Usaremos el puerto A como entrada y el puesto B como salida.
movlw PORTA
movf PORTB
call delay10mS
goto Principal
end