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.)

sábado, 15 de marzo de 2014

Arquitectura ARM

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