Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Capitulo 1a PDF
Capitulo 1a PDF
PARTE 1
Libre distribucin.
Solo pongan de donde lo obtuvieron y referencias bibliogrficas.
Atmel, the Atmel logo and combinations thereof, and others are the registered trademarks or
trademarks of Atmel Corporation of its subsidiaries
Decid hacer este tutorial por que yo aprend a programar los Avrs en c++ y quera
aprender en ensamblador, estuve buscando y nunca encontr un tutorial que en realidad
le entendiera entonces decid aprender por mi cuenta. Tengo conocimientos sobre
ensamblador de Z80 y como funciona un sistema mnimo conecte uno en una protoboard
que ya no era tan sistema mnimo estaba bastante grande todava lo tengo por ah
armado de hecho no lo quiero desarmar, no lo uso por que que no tengo programador de
memorias paralelas. Y pues se poco ensamblador de PIC16F84 pero pues aqu tratamos
de aprender ensamblador de los Avrs. En general el ensamblador es lo mismo en todos
los Avrs no como en los PIC que cada uno tiene un ensamblador diferente. Desde mi
punto de vista y lo poco que conozco al arquitectura del uC Pic no fue muy bien pensada
en comparacin con la de los Avrs. Pero eso ya es decisin de cada uno.
Dedico este pequeo tutorial a todas las personas que me apoyan y me dicen que siga
adelante que cumpla con mis sueos a mis papas que siempre han sido la base de mi de
mi crecimiento como persona y que sin ellos no sabra todo esto, los quiero mucho. A mi
novia que siempre me apoya y mas que nada por el tiempo que no le dedico a ella y se lo
dedico a estas actividades que tanto me gustan.
Conocimientos Necesarios.
1. Electrnica bsica(conexiones)
2. Programacin ya sea en c o algn otro lenguaje.
3. Ganas de Aprender bien y hacer preguntas.
Componentes Necesarios.
Software necesario
Avr Studio 4
Avr Dude (dependiendo de el programador)
Pony Prog (dependiendo de el programador)
Sobre los componentes.
1.-Programador de Avrs, yo tengo el Avr Dragon pero cualquiera que tengan y que
funcione debe de funcionar bien y servirnos y si no tiene chequeen paginas como
http://www.pictronico.com/shop/osc/index.php?cPath=33
que tienen desde $ 300 pesos
Aqu en Celaya Voltix vende el Avr Dragon que cuesta aproximadamente $1000
En Queretaro esta Advandix ahi venden tambin
En la Ciudad de Mxico en el Centro en la calle de Repblica de el Salvador deben de
encontrar yo e visto en al plaza con el numero 24 en la parte de arriba es cosa de que
pregunten.
O otra opcin es hacerlo en lo personal yo no los e probado pero les dejo varios links.
Miren
http://www.obdev.at/products/vusb/prjprog.html
http://www.forosdeelectronica.com/f24/diagrama-programador-atmel-atmega16-32-a-
16274/
http://www.foroselectronica.es/f65/programador-atmega32-16pi-745.html
Mas adelante haber si agarramos un tutorial de estos y los probamos haber que pasa, si
alguien ve alguno y le funciono pues que nos diga
2.-Aqu en Celaya en Voltix los venden o pueden ponerse en contacto conmigo por
correo electrnico lams_007@hotmail.com y lams007@gmail.com y yo se los puedo
vender.
3.- Esta las pueden conseguir en Voltix o en Steren en cualquier tienda que venda
componentes electrnicos como para hobistas
4.-Pues esto pueden usar la de un cargador de celular una computadora o varias cosas as
o hacer una pequea fuente con LM7805 y un transformador ah esta el diagrama.
El Avr dude y el pony prog tambin son gratuitos esos hay que echarle una buscada en
google.
Desde mi punto de vista: es una computadora en un circuito integrado. Pueden tener mas
dispositivos dentro de ellos mismo como: Convertidores DAC, ADC, timers, PWM,
USART, UART, SPI, Comparadores, Interfaz usb, Ethernet, Controladores de LCD, etc..
Dependiendo de los mdulos extras que tenga es su precio y complejidad. Existen
muchos fabricantes como: Atmel, Microchip, Motorola, Parallax, Hitachi, National
Instruments, Texas Instruments, Zilog , etc...
Pues bueno nosotros vamos a usar el Attiny461 pero como ya lo dije y lo vuelvo a
repetir es ensamblador y pues sirve para casi todos los microcontroladores Atmel de la
seria AVR tiny y Avr Mega no se decirles de los Xmega nunca e usado uno pero espero y
pronto poder usarlo.
Ejecucin de instrucciones
Todos los uC tiene arquitectura Harvard al menos todos los que conozco esto quiere
decir tiene una memoria diferente para programa y para datos mientras que una
arquitectura Von Neuman es la misma memoria para datos y programa. Tener
arquitectura Harvard es mejor por que es mas rpido de accesar. Veamos lo as mientras
en Harvard yo lee el programa y tambin obtengo los datos al mismo tiempo en el
mismo ciclo de reloj en el de Von Neuman necesito dos ciclos de reloj uno para leer la
accin a hacer y la otra para el dato.
Les dejo una figura de como se lee los datos y el programa en los Avrs
Les dejo una imagen de la arquitectura y explicacin de los componentes que vamos a
usar en esta primera parte de el tutorial.
Contiene 32 Registros de propsito general de 8 bits con un tiempo de acceso de un
ciclo de reloj.
El flujo de el programa es provedo por saltos condicionados y no condicionados la
funcin Call o llamada a subrutina y esto es capaz de accesorio a toda la memoria de el
uC.
Statur register.(SREG)
Pues eso seria toda la teoria por este primera parte de el tutorial ahora si viene lo mismo
espero y ya tengamos al menos instalado el Avr Studio todos en nuestra maquina.
Si no recuerden descargarlo de la pagina de Atmel www.atmel.com
INICIO
Aqu le tenemos que dar click en new project y esta es la imagen que sale
Aqu seleccionamos Atmel Avr Assembler esto nos habilita el nombre de el proyecto y
el nombre de el archivo con extensin .asm y le damos en Next y sale esto.
ASEGURENSE TAMBIEN DE PONER CREATE INITIAL FILE.
Se alcanza a ver que son puras definiciones y pues as estn todos en este caso buscamos la que
diga tn461def para el uC que voy a usar si tiene el Atmega8 usan la que dice mega8def y as.
Pero notamos que no esta el tn461def buscamos el uC mas parecido y pues es el Attiny2113
usamos este solo en unos caso va a haber que definir mas cosas por ejemplo este Attiny2113 no
tiene ADC y el Attiny461 si los tiene pues ya cuando los usemos vemos como le hacemos por
lo pronto no hay que preocuparnos entonces en lugar de todas esas declaraciones al inicio de le
programa ponemos
.include tn2313def.inc
Esto har que todas las definiciones que tenemos en esa hoja queden en nuestro programa
cuando se este ensamblando y el ensamblador vea Sreg lo va a sustituir por el numero que
pusimos y no usamos mas memoria eso se hace a la hora de ensamblar.
Entonces tenemos algo que se ve como esto.
Ahora pues esto no hace nada incluso si se trata de ensamblar nos manda errores por que no
tiene nada este primer programa vamos a hacer que un led prenda y apague cada cierto tiempo
de hecho no se va a alcanzar a ver por que el uC lo va a hacer muy muy rpido.
El uC no sabe por donde queremos sacar el dato en esta caso hacer que se prenda o se apague el
led. Vamos a la hoja de datos y vemos tiene dos puertos de 8 bits pues que podemos hacer
sacamos todo el dato por un puerto en este caso voy a seleccionar el puerto B de alguna manera
tengo que decirle al uC que por el puerto B voy a sacar mi dato aqu es donde voy a usar mi
primera instruccin tengo que decirle al puerto B que sea salida para eso tengo que poner un
numero en el registro DDRB este numero es un 1 para que sea el bit 0 como salida pero no
puedo poner DDRB=1 tengo que cargrselo antes aun registro de propsito general para esto
vamos a hacer esto es lo que llevamos de el programacin
Quiero que en el panel de salida seleccionemos el que dice PORTB lo podemos hacer mas
grande con el botn de + que tiene ah o con seleccionarlo basta. Y donde quedamos que
estaban los archivos de el proyecto ya no estn ahora hay una que dice Processor bien ahi dicen
varias cosas dice Program Counter, Stack Pointes ,....., Sreg y al final Registers hacemos mas
grande la de Registers.
Aprieten la tecla F10 para ir paso a paso en la ejecucin de instrucciones o Alt+F5 vaya sola la
computadora e ligan lo que quieran y despus hagan lo siguiente
Ok ya que hicieron eso necesito que se fijen en 4 cosas en el panel de salida de el uC abajo va a
salir DDRB, PINB y PORTB y vena como PORTB y PINB cambia a la hora de que pasamos
por la instruccin OUT PORTB,R16 y ahora ne la parte de Processor quiero que vean como
el R16 cambia con las instrucciones LDI R16,0x00 y LDI R16,0x01 y se pone con el
numero que decimos en el registro. Fjense como la parte de hasta arriba el Program Counter va
incrementando de uno en uno hasta que llega a la instruccin RJMP y cambia a 0x0002 y si se
fijan el tan famoso Sreg nunca cambia esto quiere decir las instrucciones que estamos
ejecutando no lo afectan. Otra cosa importante a ver las instrucciones abran las instrucciones de
los Avrs que bajaron antes y bsquenlas. Esto seria el primer programa. El siguiente es hacer
un contador que implica un poco mas de instrucciones.
Si tienen dudas sobre esto no duden en escribirme a mis dos correos lams_007@hotmail.com y
a lams007@gmail.com o dejen un comentario en www.mecatronicamexicana.blogspot.com
Esto es lo que se ve en el osciloscopio pero agregue unas instrucciones llamadas NOP para
alargar tiempo de encendido. No les posteo el otro programa por que no vale la pena.
Aqu la imagen
Les dejo tambin el link al video espero y les guste perdn por la cmara ya esta mal y no
enfoca bien prometo comprar una que sirva bien lo mas rpido posible.
Vean el video de youtube de este programa.
http://www.youtube.com/watch?v=39gZ2sCYfFU
Programa numero 2
Para este segundo programa omitir todo lo que ya vimos de el primer programa. Solo que
debemos de crear un nuevo proyecto. Abordemos el problema es un Contador espero que
sepamos todos que es un contador esto quiere decir que empieza en cero y va contando hasta
que llena los 8 bits y se hace 255 aqu en este punto veremos algo interesante con el Sreg aun
no lo usaremos pero veremos algo interesante pues lo principal de nuevo usaremos el puerto b
como nuestra salida entonces lo principal sera
.include tn2313def.inc //definiciones
LDI R16,0xff //carga un 255 al registro 16
OUT DDRB,R16 //selecciona todo el puerto b como salida
Aqu quiero que aprendan esto si el registro DDRB tiene 0 es entrada si tiene unos es salida y si
quiero los primeros cuatro como entradas pues debo de poner los primeros cuatro en 0 y los
otros cuatro como salidas los debo de poner en uno seria este ejemplo:
De ahora en adelante lo que esta en cursiva y rojo es un ejemplo y no es parte de el programa
que estamos haciendo
include tn2313def.inc //definiciones
LDI R16,0xf0 //carga un 240 al registro 16
OUT DDRB,R16 //selecciona la parte alta del puerto b como salida y la baja como entrada
Espero y se all entendido bien lo siguiente aqu seria hacer que cuente y para eso buscamos en
nuestra hoja de instrucciones y encontramos la instruccin INC que incremente un registro en 1
entonces pues si ya tengo un registro el R16 aqu vale decir que puedo usar cualquier registro
bueno no cualquiera en las hojas de instrucciones dice que registros acepta cada instruccin
entonces le agregaramos a nuestro programa.
INC R16 // incrementa el registro 16 en 1
OUT PORTB,R16 //pone en el puerto b el valor de el R16
cabe mencionar que el R16 vala 255 antes de ejecutar INC R16 cuando se ejecuta la
instruccin cambia a 0 y aqu viene lo interesante noten que en el Sreg a la hora de compilarlo
y correrlo y se ejecuta el primer INC R16 la bandera de cero(ZF) pasa a ser uno que significa
que la ultima operacin resulto ser cero y que cuando es mayor de 128 estn activas las
banderas de signo y de negativo aunque esto no nos interesa ahorita. Lo nico que nos faltara
en el programa seria hacer que regrese y pues para eso tenemos la instruccin que ya
aprendimos de RJMP pero pues donde se debe de poner a donde regresa pues se pone a INC
R16 para que regrese e incremente en 1 y vuelva a sacar el dato de el puerto. Quedndonos
todo el programa como se muestra a continuacin.
.include "tn2313def.inc" //definiciones
LDI R16,0xff //carga un uno al registro 16
OUT DDRB,R16 //selecciona el puerto b como salida
REGRESO: INC R16 //incremento R16 en uno
OUT PORTB,R16
NOP //esto es una nop no importa no sirve de nada ahorita
NOP //nada mas insertan tiempo muerto y gastan memoria
RJMP REGRESO
Si lo alcanzan a ver este programa es mas pequeo que el otro por que el otro haba que poner
un registro a cero y aqui solo se incremente no necesitamos 2 outs.
No les pongo imagen de osciloscopio por que no puedo ver todas las seales pero pues les dejo
una foto de la protoboard
Como se ve es muy simple solo 8 leds y hacer un contador de 8bits con integrados usas muchos
mnimo 2 y este puedes hacer muchas mas cosas los leds no tiene resistencia por que son leds
que aguantan los 5 volts si tiene leds que aguanten menos voltaje si pnganles una resistencia
mnimo de 100 ohmsy mximo de 330 de ah en mas cualquiera esta bien. Y aqu el video de
youtube. http://www.youtube.com/watch?v=wl3x5gncOPU
Sobre el video que digo que el bit mas significativo no prende tendr que investigar voy a ver
si es internamente le uC por que el programa esta bien luego alguna vez me paso que estaba
programando un Atmega32 por Isp y cuando programas por Isp un puerto de Atmega32 se
deshabilita y pensaba que no servia el puerto y leyendo encontr que no pues hay que
deshabilitar un fusible, puede estar pasando lo mismo aqu. Otra cosa que me pareci
interesante sin tener que ver con los uC se fijan como se ve morado y como rayitas eso es luz
infrarroja que detecta la cmara y el filtro no la elimina bien supongo que las rayas por que esta
espaciado es el tiempo en encendido y apagado nunca lo haba notado aqu podemos aprender
de todo.
Sobre el error ya vi el error ese pin es el reset y como les dije es cosa de deshabilitar el fusible
y ya este tercer programa vamos a ver como programo fsicamente el uC.
Tercer programa
Este programa va a ser un poco mas difcil por que ya va llevar toma de decisiones del uC con
el Sreg y las banderas. Va a llevar un salto y varios retardos de tiempo se podra hacer con el
Stack Pointer y la memoria Ram pero eso prefiero dejarlo para la siguiente parte de el tutorial.
Abordemos el problema pues este consiste bsicamente en hacer un contador ascendente y
cuando llegue a 255 se vuelve descendente. Otro punto importante aqu si vamos a usar los 8
bits ya cheque cual era el problema como les dije un fusible con desactivarlo funciona bien y
cuando vean como lo programa pues ya con eso quedara entendido creo yo pues como siempre
empezamos igual la librera de definiciones y declarar al puerto B como salida sale.
.include "tn2313def.inc" //definiciones
LDI R16,0xff //carga un uno al registro 16
OUT DDRB,R16 //selecciona el puerto b como salida
Despus de esto queremos que se incremente el R16 se detenga un tiempo para que alcanzamos
a ver como cuenta entonces tendramos algo as
INC R16 //incremento R16
LDI R30,0x00 //cargo 0 en r30
LDI R31,0xFF //cargo 255 en R31
Aqu tenemos LDI R30,0x00 y LDI R31,0xFF esta operacin ya la conocemos pero pues mas
adelante nos va a servir para hacer comparaciones recuerdan que nuestro programa va a contar
de 0, 1, 2, 3, ........, 254, 255 y despus de 255, 254, 253, 252, ........, 1, 0 esos nos van a servir
para hacer eso saber cuando esta en 255 y cuando en cero.
MAS: INC R16 //muy fcil incremento R16
OUT PORTB,R16 //saco R16 por el puerto B
RJMP RETARDO //salto a retardo pero que hay en retardo
PRINCIPAL:CP R16,R31 //esto hace R16-R31 abajo lo explico
BREQ MENOS //dependiendo de las banderas salta a menos
RJMP MAS //salta a MAS que es la parte de hasta arriba de este cdigo
Pues bueno aqu tenemos dos instrucciones nuevas CP R16,R31 y BREQ MENOS.
CP es de comparacin esta hace una resta entre R16 menos R31 sin alterar el contenido de
ningn registro lo nico que nos modifica son las famosas banderas o el SREG explico solo las
banderas que nos interesan
Bandera de Cero (ZF) esta se pone a uno si R16 y R31 son iguales si no es cero.
Bandera de Carry (CF)esta se pone a uno solo si R31 es mayor que R16
Aqu la bandera que vamos a usar es la de cero, no nos interesa saber si uno es mayor o menor
que otro solo si son iguales el uno a otro sale.
BREQ (Branch if equal) checa la bandera de cero si es uno salta a donde dice en nuestro
programa. Esto quiere decir que cuando R16 y R31 son iguales CP pone la bandera de cero a
uno y BREQ checa la bandera y si es uno salta a menos en el otro caso si no son iguales no
salta y continua su ejecucin normal. Si recuerdan R31 contiene 0xFF esto quiere decir que
cuando llega a 255 es cuando se hace cero este ciclo es el que cuenta ascendente mente y
cuando llega a 255 salta a menos que es el que cuenta descendente mente y pues retardo se los
explico ahorita un poco mas adelante.
Cabe Recordar aqui que si quiero usar el puerto a como salida o sacar mi dato por el puerto a
en lugar de usar DDRB pongo DDRA en todo caso sera la letra de el puerto donde esta la X
DDRX, PINX y PORTX espero y esto les sirva.
Espero y les all gustado este tutorial es para ustedes para aprender en la siguiente parte de el
tutorial vamos a ver como se usan las entradas se me ocurre un contador cada vez que yo apret
un botn , como se usa la Ram y el satck pointer y como leer un dato analgico desde los ADC
internos que trae el micro. Manden sus dudas quejas sugerencias comentarios a
lams_007@hotmail.com y a lams007@gmail.com o dejen un comentario en
www.mecatronicamexicana.blogspot.com si les gusto o no el tutorial.
Muchas gracias por tomarse el tiempo para leer esto suerte.