Hace mucho que dejé de estar involucrado con micro-controladores, desde la escuela no lo hacía, pero me sigue interesando mucho el código ensamblador de algunos micros. En esta entrada voy a dejar un código de un core ARM específicamente un cortex M0 de 32 bits, estos procesadores son de bajo consumo y es interesante como está estructurado su set de instrucciones. También voy a adjuntar el set de instrucciones y el manual de referencia por si a alguien le interesa.
Este código es muy sencillo, solo para mostrar como se activan los puertos y los módulos de este micro,
en este codigo se conecta un trimpot a un puerto del micro y con el ADC cambiamos el valor que se guarda en un registro especifico, valores desde 0000 a FFFF ya que el ADC es de 16 bits.
Nota: El compilador que usé fue CodeWarrior y no se puede debuggear a menos que esté conectado el micro.
/* This assembly file uses GNU syntax */
.text
.section .rodata
.align 2
.data
.LC0:
.text
.align 2
.global main
.type main function
/*Etiquetas */
/*Con estas etiquetas ponemos las direcciones de memoria donde se encuentran los módulos requeridos */ /*En este caso tenemos que activar clocks del ADC y del puerto que vamos a conectar con el trimpot*/
.set SIM_SCGC6, 0X4004803C
.set SIM_SCGC5, 0x40048038
.set ADC0_CFG1, 0x4003B008
.set ADC0_SC1A, 0x4003B000
.set ADC0_RA, 0X4003B010
.set SIM_SCG6_ENABLE, (1<<27)
.set SIM_SCG5_ENABLE, (1<<13)
.set ADC0_CFG1_MODE_16BITS, 0x0C
.set ADCO_SC1A_ENABLE_A, 0X17
main:
push {r3, lr}
add r3, sp, #4
/*En esta sección activamos los clocks de los puertos y el ADC de acuerdo a los valores requeridos y que se encuentran marcados en el manual de referencia del micro. Pag 191 cap. 12*/
ldr r0,=SIM_SCGC6
ldr r1,=SIM_SCG6_ENABLE
str r1,[r0]
ldr r0,=SIM_SCGC5
ldr r1,=SIM_SCG5_ENABLE
str r1,[r0]
ldr r0,=ADC0_CFG1
ldr r1,=ADC0_CFG1_MODE_16BITS
str r1,[r0]
/*Iniciamos el loop infinito*/
Loop:
ldr r0,=ADC0_SC1A
ldr r1,=ADCO_SC1A_ENABLE_A
str r1,[r0]
/*Aquí hacemos que el ADC comience a leer los datos y esperamos la bandera de que ya leyó dato para mostrarlo en un registro especifico. Estos valores los podemos ver en la pag 457 cap. 28 del manual de referencia. */
ldr r0,=ADC0_SC1A
Wait:
ldr r2,[r0]
ldr r3,=(1<<7)
and r2,r3
cmp r2,#0
beq Wait
ldr r0,=ADC0_RA
ldr r3,[r0]
b Loop /*Aqui brincamos al loop infinito y hacemos lo mismo todo el tiempo*/
mov r3, #0
mov r0, r3
pop {r3, pc}
.align 2
.L3:
.word .LC0
.end
Aqui dejo el enlace para que puedan ver el Manual de referencia del micro
https://drive.google.com/file/d/0B8nrTf9p3apyczFxVS1udEZxQVk/edit?usp=sharing
Este blog lo voy a dedicar a subir algunos códigos básicos de programación en distintos lenguajes. Creo que a veces es bueno tener una idea de como iniciar algo, a mi me sucedía, y me hubiera gustado encontrar algún código que me ayudara a ordenar mis ideas... Yo buscaba mucho algunos códigos y no los encontraba, casos como verilog, vhdl y codigos en ensamblador para micros de freescale en especifico los de la familia flexis. Así que aquí voy a ir dejando algunos codigos, espero ayudar a alguien a entender estos codigos. (Dejé de adentrarme en la programación de los microcontroladores, pero eso no implica que me hayan dejado de gustar. Voy a tratar de dejar entradas del avance que van teniendo y con ellos los gadgets que podremos ver.)
No hay comentarios:
Publicar un comentario