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

viernes, 25 de julio de 2014

14 nm y la Ley de Moore

Es impresionante como la tecnología avanza. Me gusta mucho los avances tecnológicos y lo que se puede lograr con ese tipo de avances, ahora que Intel anuncia su nueva hazaña de llegar a los 14 nanómetros en tecnología de fabricación de semiconductores, no cabe duda que ellos mismos han dejado atrás la Ley de Moore.

Pero ¿Que es todo eso de los 14nm y la ley de Moore?
 Empecemos por lo básico, las computadoras se basan esencialmente en transistores, un transistor colocado adecuadamente y haciendo equipo con otros transistores pueden lograr compuertas lógicas que van dando forma a un microcontrolador. Antes las computadoras necesitaban espacios grandes ya que los transistores eran grandes, con el tiempo ese espacio se ha ido reduciendo hasta poder llegar a tener una computadora en la palma de tu mano. Gordon Moore cofundador de Intel dijo en su momento que el espacio que necesitaban los transistores dentro de un chip se reduciría a la mitad cada 24 meses, fue algo disparatado en el momento que lo publicó, y si lo fue, se quedó corto, ya que la tecnología a avanzado mucho mas rápido.

Intel nos muestra su tecnología de 14nm es decir que ahora los transistores dentro de un chip son de ese tamaño !14 nanómetros! Un nanómetro es la milmillonésima parte de un metro, si nos ponemos a comparar podemos ver que la bacteria del cólera mide aproximadamente 1.5 micrómetros, es decir que los transistores que lanza Intel ahora son mil veces mas pequeños que esa bacteria.

A parte de lo sorprendente en tamaño, el rendimiento de los microcontroladores incrementa, son mas veloces, se calientan menos, consumen menos electricidad, baja el costo de producción, etc.
esto gracias a que los transistores pueden estar mas cerca el uno del otro y necesitan menos energía eléctrica para comunicarse.

Estoy en espera de ver que dispositivos usaran esta tecnología, supongo que Apple será de los primeros, cuando salgan escribiré mas a cerca de esto.

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