capitulo 1a

30
TUTORIAL DE ATMEL AVR´s de 8-bits Logo propiedad de Atmel Ensamblador Autor: Luis Antonio Méndez Soto PARTE 1 Libre distribución. Solo pongan de donde lo obtuvieron y referencias bibliográficas. Atmel®, the Atmel logo and combinations thereof, and others are the registered trademarks or trademarks of Atmel Corporation of its subsidiaries "AVR®" and "AVR is a registered trademark of Atmel Corporation".

Upload: wilicoro2946

Post on 19-Dec-2015

220 views

Category:

Documents


0 download

DESCRIPTION

atmel

TRANSCRIPT

  • TUTORIAL DE ATMEL AVRs de 8-bits

    Logo propiedad de AtmelEnsamblador

    Autor: Luis Antonio Mndez Soto

    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

    "AVR" and "AVR is a registered trademark of Atmel Corporation".

  • Introduccin.

    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.

    1.-Programador de Avrs cualquiera que funcione.2.-uC Atmel Serie Avr Attiny 461, Atmega8(cualquier Avr funciona por que va a

    ser en ensamblador y todo ensamblador de Avr es muy parecido)3.-Protoboard

    4.-Pequea fuente de 5 Volts5.-Resistencias (variadas)

    6.-Leds Varios

    Software necesario

    Avr Studio 4Avr 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=33que tienen desde $ 300 pesosAqu en Celaya Voltix vende el Avr Dragon que cuesta aproximadamente $1000En Queretaro esta Advandix ahi venden tambinEn 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. Mirenhttp://www.obdev.at/products/vusb/prjprog.htmlhttp://www.forosdeelectronica.com/f24/diagrama-programador-atmel-atmega16-32-a-16274/http://www.foroselectronica.es/f65/programador-atmega32-16pi-745.htmlMas 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 [email protected] y [email protected] 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.

    5.- Igualmente en Voltix o en cualquier Steren si quiere me pueden contactar y yo tambin se las puedo vender.

    6.- Igualmente en Voltix o en cualquier Steren si quiere me pueden contactar y yo tambin se las puedo vender.

  • Software necesario

    Pues el Avr Studio lo pueden conseguir directo de la pagina de Atmel www.atmel.comeste software es gratuito solo hace falta registrarse y si quieren aprender pues con este

    basta por que tambin es simulador y para programas simples como con los que vamos a empezar con este software basta.

    El Avr dude y el pony prog tambin son gratuitos esos hay que echarle una buscada en google.

    Les recomiendo tambin tener la hoja de datos de su uC que quieren programar la pueden buscar directo en Atmel tiene todo muy bien organizado y las instrucciones de ensamblador de loa Avrs tambin estn en Atmel pero a esa si les dejo el link seria

    http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdfEstas son las instrucciones de los Avrs de 8 bits

  • Inicio y pura teoria.Que es un Microcontrolador?De Wikipedia: Un circuito Integrado o chip que incluye en sus interior las tres unidades bsicas de una computadora: Unidad central de procesamiento (CPU) , Memoria y unidades de E/S.

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

    Aplicaciones: Pues sus aplicaciones son prcticamente infinitas, imaginate cuantos aparatos conoces que tiene una pantalla ya sea de leds, touch, lcd como hornos, celulares,cmaras, refrigeradores, relojes, aires acondicionados, lavadoras, controles remotos, etc... Los aparatos que traen botones para interactuar con nosotros, los aparatos con leds pequeos y as muchos mas. Todo este tipo de aparatos necesita un controlador, generalmente es una computadora pero son muy caras para tenerlas dentro, ah es donde entra el uC. Un carro es un buen ejemplo, sin temor a equivocarme un carro moderno trae cerca de 50 uC, casi casi uno por sensor por que van interconectados a un una computadora central que controla todo pero algo necesita enviar los datos de una manera para que los entienda el CPU principal esto lo hace el uC. El bus que usan generalmente los carros se llama Bus CAN.

    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

    Imagen propiedad de AtmelFigura 1 de la hoja de datos del Attiny461

    Como se alcanza a ver en el primer ciclo de reloj se decodifica la primera instruccin y en el segundo ciclo ya se sabe que tiene que hacer y ejecuta la primera instruccin, mientras que en ese mismo ciclo la segunda instruccin se decodifica y al tercer ciclo se ejecuta esa segunda instruccin y se obtiene la 3er instruccin y as sucesivamente, todo esto es gracias a las dos memorias separadas para datos y para programa.

  • Un poco de la arquitectura.

    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.

    Imagen propiedad de Atmel

  • ALU

    Este esta conectado a los 32 registros de propsito general.se ejecutan instrucciones entre los registros en un solo ciclo de reloj puede ser con otro registro o con otro dato. Se divide en tres categoras :operaciones aritmticas, operaciones lgicas y operaciones de tipo bit.

    Statur register.(SREG)

    Contiene informacin de la operacin aritmtica ejecutada mas recientemente.Este registro no se guarda automticamente cuando entras a una subrutina, hay que guardarlo automticamente.

    Imagen propiedad de AtmelEsta parte es muy importante es la que nos dice como debe de seguir el programa o las condiciones aprndansela o impriman la es muy importante les explico cada bit.

    Bit 7 Global Interupt enable (GIE)Cuando este bit es 1 estn habilitadas la interrupciones del uC, si no esta habilitado y en los otros registros se habilitan no va a pasar nada por que este no esta habilitado. Se cambia a 0 automticamente por hardware cuando ocurre alguna interrupcin. Y puede ser puesto a uno de nuevo con la instruccin RETI. Puede ser puesto a 1 o 0 con las instrucciones SEI y CLI.

    Bit 6 Bit Copy Storage (BCS)Este se usa para copiar un bit de el SREG a un registro o de un registro al SREG no se usa mucho en programacin.

    Bit 5 Half Carry Flag (HCF)Indica si hay medio carry en la ultima operacin. O si la operacin anterior fue mayor a 15.

    Bit 4 Sign Bit (SB)Siempre es una operacin exclusive or con la bandera de negativo y la de complemento a dos y sobre flujo

    Bit 3 Two complements overflow flag

  • Esta la Explico un poco mas adelanteBit 2 Negative flag (NF)Indica si el resultado de la ultima operacin fue menor que cero. Tambien podemos checarla y ver que el numero es 128 o mayor

    Bit 1 Zero flag(ZF)Indica si la ultima operacin fue cero.

    Bit 0 Carry flag (CF)Indica si el resultado de la ultima operacin fue mas de 255.

    Sobre los registros.

    Los registros son una especie de memoria Ram pero no lo son estos estn conectados directo al ALU y todas las operaciones pasan por el ALU. Para un programa pequeo no necesita Ram pero si necesita guardar informacin para esto nos sirven los registros como lo dice son 32 registros les dejo una pequea imagen de como estn.

    Imagen propiedad de Atmel

  • Como se alcanza a ver aqu los registro del 26 al 31 de pueden usar como registros de 16 bits para lograr accesar a toda la memoria del uC.

    Las operaciones que se pueden hacer son:Una entrada de 8 bits de entrada y el resultado ser de 8 bits.Dos entradas de 8 bits y un resultado de 8 bits.Dos entradas de 8 bits y una salida de 16 bits.Una entrada de 16 bits y una salida de 16 bits.

    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

    Esta es la imagen con la que empezamos

    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.

    Aqu seleccionamos Avr Simulator y en mi caso Selecciono Attiny461 si ustedes tiene

  • otro uC seleccionen el modelo de el uC que tiene si no aparece en Avr Simulator seleccionen el Avr Simulator 2 y ah de seguro debe aparecer y damos click en Finish.

    Pues ahora si viene lo bueno no se si recuerden el Sreg que tiene un numero en hexadecimal a la hora de programar no existe el Sreg y los dems registros del timer, adc usart y dems cosas cada uno tiene un numero pero pues as es un poco mas difcil recordarlo por ejemplo el que les digo el Sreg tiene el numero hexadecimal 0x3F de ahora en adelante cuando vean 0xA0 va a ser un numero en hexadecimal es mas fcil aprender que es el Sreg que el registro 0x3F. Entonces lo que podemos hacer es que escribamos.De ahora en adelante todo texto en cursiva y negritas es parte de el programa

    .equ Sreg = 0x3Fy as para todos los dems registros que vayamos a y usar.Pero esta la otra opcin que se me hace mas fcil, donde se instalo el Avr Studio en mi caso C:\Program Files\Atmel hay una carpeta que dice Avr Tools le damos click ah despus hay una que dice Avr Assembler click y por fin en la que dice Appnotes. Vemos que nos aparece cosas as : m32def, m48def, tn2313def, tn45def, etc... abramos uno el que sea en este caso les pego una parte de lo que tiene el tn2313def aqu lo tienen:;***************************************************************************;* A P P L I C A T I O N N O T E F O R T H E A V R F A M I L Y;* Number :AVR000;* File Name :"tn2313def.inc";* Title :Register/Bit Definitions for the ATtiny2313;* Date :03.06.17;* Version :1.00;* Support E-mail :[email protected];* Target MCU :ATtiny2313

  • ;* DESCRIPTION;* When including this file in the assembly program file, all I/O register names and I/O register bit names appearing in the data book can be used.In addition, the two registers forming the data pointer Z have been assigned names ZL - ZH. ;* The Register names are represented by their hexadecimal address.;* The Register Bit names are represented by their bit number (0-7).;* Please observe the difference in using the bit names with instructions such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc" (skip if bit in register set/cleared). The following example illustrates this:;* in r16,PORTB ;read PORTB latch;* sbr r16,(1
  • .equ GPIOR0 = 0x13

    .equ PORTD = 0x12

    .equ DDRD = 0x11

    .equ PIND = 0x10

    .equ USIDR = 0x0F

    .equ USISR = 0x0E

    .equ USICR = 0x0D

    .equ UDR = 0x0C

    .equ UCSRA = 0x0B

    .equ USR = 0x0B ; for compatibility purpose

    .equ UCSRB = 0x0A

    .equ UCR = 0x0A ; for compatibility purpose

    .equ UBRRL = 0x09

    .equ UBRR = 0x09 ; for compatibility purpose

    .equ ACSR = 0x08

    .equ UCSRC = 0x03

    .equ UBRRH = 0x02

    .equ DIDR = 0x01

    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

    .include tn2313def.inc //definicionesLDI R16,0x01 //carga un uno al registro 16OUT DDRB,R16 //selecciona el bit0 del puerto b como salida

    Bien ahora no falta decirle que se prenda y se apague cada X tiempo para eso volvemos a usar la instruccin OUT pero en lugar de DDRB que dice si el puerto es entrada o salida ponemos PORTB que dice cuanto va a valer el PORTB quedando

    OUT PORTB,R16 //aqui saco el valor de el R16 por el puertoBBien ahora solo falta que se haga o para ver que si funciona entonces seria poner en un registro un cero y usar la otra vez la instruccin out quedando de esta manera.

    LDI R16,0x00 //uso de nuevo el R16 para que este un poco tiempo prendido OUT PORTB,R6 //saco el cero que tiene el registro r16

    Esto seria en si nuestro programa bsico miren.include tn2313def.inc //definiciones

  • LDI R16,0x01 //carga un uno al registro 16OUT DDRB,R16 //selecciona el bit0 del puerto b como salidaOUT PORTB,R16 //aqui saco el valor de el R16 por el puertoBLDI R16,0x00 //uso de nuevo el R16 para que este un poco tiempo prendido OUT PORTB,R6 //saco el cero que tiene el registro r16

    Pero nuestro aparato no se puede decir que es inteligente por que queremos que lo haga por siempre y si lo dejamos as lo va a hacer una vez y ya no va a hacer mas entonces hay que encontrar una manera para que lo repita por siempre y para eso usamos la funcin RJMP que brinca a una parte de el programa que queramos nosotros. El problema aqu es decidir a donde regresar podramos regresar a la primera linea la de LDI R16,0x01y quedara bien pero pues en cada nuevo ciclo declararamos otra vez que el bit0 de el puerto B es salida entonces yo mejor agrego una linea de que diga LDI R16,0x01 y despus el RJMP quedando todo el programa como:

    .include tn2313def.inc //definicionesLDI R16,0x01 //carga un uno al registro 16OUT DDRB,R16 //selecciona el bit0 del puerto b como salida

    INICIO: OUT PORTB,R16 //aqui saco el valor de el R16 por el puertoBLDI R16,0x00 //uso de nuevo el R16 para que este un poco tiempo prendido OUT PORTB,R6 //saco el cero que tiene el registro r16LDI R16,0x01 //cargo de nuevo un uno en el R16RJMP INICIO // salto a inicio

    Despus de RJMP pongo a donde quiero saltar puedo usar cualquier palabra o direccin de memoria pero es mas fcil la palabra aqu tendramos un led apagndose y prendiendo.Solo falta compilar y correr el programa para esto podemos usar la tecla F7 o usar en la barra de herramientas donde dice build darla build o build and run la diferencia es que build solo lo compila y build and run lo compila y corre usemos build and run para ver que pasa ok

  • En al parte de los errores no debe de aparecer esto para decir que todo nuestro programa esta bien. Quedamos que le ibamos a dar en build and run para simularlo entonces el programa ya debe de estar corriendo esperando a que le digamos que ejecute la siguiente operacion debe de estar algo asi.

    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 siguienteOk 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 [email protected] y a [email protected] o dejen un comentario en www.mecatronicamexicana.blogspot.comEsto 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 2Para 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 //definicionesLDI R16,0xff //carga un 255 al registro 16OUT 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 //definicionesLDI R16,0xf0 //carga un 240 al registro 16OUT 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 1OUT 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" //definicionesLDI R16,0xff //carga un uno al registro 16OUT DDRB,R16 //selecciona el puerto b como salida

    REGRESO: INC R16 //incremento R16 en unoOUT PORTB,R16NOP //esto es una nop no importa no sirve de nada ahoritaNOP //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" //definicionesLDI R16,0xff //carga un uno al registro 16OUT 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 R16LDI R30,0x00 //cargo 0 en r30LDI 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 BRJMP RETARDO //salto a retardo pero que hay en retardo

    PRINCIPAL:CP R16,R31 //esto hace R16-R31 abajo lo explicoBREQ MENOS //dependiendo de las banderas salta a menosRJMP 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 interesanBandera 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 R16Aqu 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.

    Aqu otra parte de el cdigo

  • MENOS: DEC R16 //no hay mucho que decir decremento en uno R16OUT PORTB,R16RJMP RETARDO1 //Salta a Retardo1 ahorita vemos que es retardo1

    PRINCIPAL1:CP R16,R30 //comparo R16 con R30BREQ MAS //dependiendo de las banderas salta a masRJMP MENOS //Salta a menos

    Pues primero voy a empezar a omitir la partes que ya vimos mas bien no las voy a explicar.Aqu tenemos una nueva instruccin DEC es muy fcil es como INC pero en lugar de sumar uno resta uno. Aqu se fijan tengo RJMP RETARDO1 es el mismo cdigo que RETARDO sin el 1 pero como el Avr no recuerda en donde estaba por eso dos rutinas de retardo si usramos la funcin CALL y el Stack Pointer (SP) no necesitaremos dos pero eso sera para la siguiente parte de el tutorial. Y pues para lo demas seria los mismo que el otro Resto R16-R30 si el resultado es cero salta a MAS si no salta a menos.Ahora si el tan famoso retardo.RETARDO:LDI R25,0x00REGRESO:INC R25

    CP R25,R31 //aqu comparo R25 con R31 deben de ser 255BREQ ACABO //si son iguales se va acabo y de acabo salta aRJMP REGRESO //principal que es la parte que cuenta hacia arriba

    ACABO: RJMP PRINCIPAL //si no a acabado salta a regreso y sigue contandoRETARDO1:LDI R25,0x00REGRESO1:INC R25

    CP R25,R31BREQ ACABO1 // es lo mismo pero para la parte de cuenta hacia RJMP REGRESO1 //abajo espero y lo entiendan

    ACABO1: RJMP PRINCIPAL1Espero y se entienda es muy parecido al contador aqu si yo quiero mas tiempo puedo agregar NOP entre INC R25 y BREQ ACABO aqu el ejemplo:REGRESO1:INC R25

    NOP //Inserto tiempo muertoNOP //Inserto tiempo muertoCP R25,R31BREQ ACABO1 // es lo mismo pero para la parte de cuenta hacia RJMP REGRESO1 //abajo espero y lo entiendan

    ACABO1: RJMP PRINCIPAL1Para aproximar el tiempo de retardo aqu hay que ver dos cosas el lazo o el ciclo que se hace que vendra siendo todo lo que esta entre INC R y RJMP REGRESO vemos las instrucciones que seria en este caso 6 y vemos cuantos ciclos de reloj toma cada una aqu todas toman una menos RJMP que lleva dos y BREQ cuando salta tambin son dos esa la podemos agregar al final por que solo salta una vez. Y pues se hacen 255 veces esas siete por que cuenta hasta 255 que serian 1785 instrucciones Y debemos agregarle dos ciclos de reloj por el RJMP REGRESO, RJMP PRINCIPAL1 y el ciclo que nos faltaba serian 5 ciclos mas entonces tomamos 1790 ciclos. Suponiendo que nuestro uC corre a 8MHZ eso hace que haga 8 millones de ciclos por segundo entonces hacemos la simple regla de tres 8 millones es a un segundo como 1790 es a cuanto que serian 0.00022375 s que es un retardo muy pequeo lo que

  • podemos hacer es aadir mas NOP o podemos poner un ciclo dentro de esos lo cual nos dara un retardo mucho mas grande. Aqu les dejo tal cual el programa que yo le puse al uC de el video.

    .include "tn2313def.inc" //definicionesLDI R16,0xff //carga un uno al registro 16OUT DDRB,R16 //selecciona el puerto b como salidaINC R16LDI R30,0x00LDI R31,0xFF

    MAS: INC R16OUT PORTB,R16RJMP RETARDO

    PRINCIPAL:CP R16,R31BREQ MENOSRJMP MAS

    MENOS: DEC R16OUT PORTB,R16RJMP RETARDO1

    PRINCIPAL1:CP R16,R30BREQ MASRJMP MENOS

    RETARDO:LDI R25,0x00REGRESO:INC R25

    NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPCP R25,R31BREQ ACABORJMP REGRESO

    ACABO: RJMP PRINCIPALRETARDO1:LDI R25,0x00REGRESO1:INC R25

    NOPNOPNOPNOPNOPNOP

  • NOPNOPNOPNOPCP R25,R31BREQ ACABO1RJMP REGRESO1

    ACABO1: RJMP PRINCIPAL1Como ven es mucho mas grande por las NOP y tiene un retardo no muy grande de 0.00047875 s o 4.7875 mili segundos.Les dejo el diagrama de conexin elctrico para estos ltimos dos programas si conocen algn programa para hacerlos mas bonitos dganme por que no me gusto mucho como quedo si no pues los har a mano y los escaneo.

  • Vean los videos de youtube el de como programar con Avr Studio y el de este tercer programa funcionando aqu estn los links. O visiten www.mecatronciamexicana.blogspot.comProgramar http://www.youtube.com/watch?v=p58QXXSYgXcTercer Programa http://www.youtube.com/watch?v=FaVF6jDs74o

    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

  • [email protected] y a [email protected] 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.

    LUIS ANTONIO MNDEZ SOTOwww.mecatronicamexicana.blogspot.com

    "AVR" and "AVR is a registered trademark of Atmel Corporation".