miércoles, 8 de septiembre de 2010

Mi Primer Proyecto -ATMEGA8 Y AVR STUDIO 4

Bueno amigos, creo yo que esto es la más básico que se puede enseñar.. así que sin más que  decir veremos cómo prender un led usando un botón con un atmega8.
Antes de ir con el código, mostraré cómo crear un proyecto con el avr studio.
Para ello ya deben tener  instalado el AVR STUDIO, si aún no lo descargan, lo pueden hacer desde este enlace AVR STUDIO 4.18  o desde este otro  AVR STUDIO 4.17
·······> http://www.atmel.com/dyn/resources/prod_documents/AvrStudio4Setup.exe

Antes de pasar al código, les mostraré cómo crear un proyecto:

La primera ventana con las que encontrarán después de abrir el avr studio será la siguiente y en la cual seleccionaremos New Project.



Luego en la siguiente ventana se nos pedirá darle un nombre a nuestro proyecto, así como dónde se desea guardar dicho proyecto; también se nos pregunta si deseamos crear una carpeta específica para nuestro proyecto, la cual llevará el nombre del mismo. Luego daremos click en Next.


En esta ventana se nos pide seleccionar la plataforma de depuración y el dispositivo con el cual trabajaremos. En nuestro caso seleccionaremos la plataforma AVR Simulator y el dispositivo ATmega8. Luego daremos click en Finish.


Por fin nos encontramos en nuestro entorno de trabajo. 


Ahora si podemos iniciar con la programación....


El programa que se muestra como primer ejemplo es el siguiente:



Este programa deberá ser ensamblado usando cualquiera de los siguientes botones : el segundo de estos no permite ensamblar y hacer la simulación de programa.


Explicación de código:

 .include "m8def.inc" --> Contiene todas la definiciones de registros y otros datos del m8=ATmega8, si se trabajará con un ATmega1284p se colocaría  .include "m1284pdef.inc"

.cseg --> O segmento de código, Indica que lo que sigue es el programa que ira en la flash. También existe .eseg o segmento de eeprom (para datos que irán en la eeprom) y .dseg o segmento de datos(para datos que irán en la ram).

.org 0x0000 RJMP INICIO -->Es la primera dirección o la dirección de inicio del programa ( esto siempre debe estar presente para poderle indicar a uC dónde debe ir al iniciar el programa). En nuestro caso haremos un salto incondicional (RJMP INICIO) a la etiqueta INICIO:

SBI DDRB,PB1 --> O Setear Bit en registro I/O permite configurar el pin PB1 como salida. Cada puerto de I/O cuenta con 3 registros: DDRx permite configurar entradas ("1") y salidas ("0"); PORTx permite poner la salida a "1" ó "0" cuando el pin es salida y también permite habilitar("1") la resistencia pull up de dicho pin o deshabilitarla("0") cuando el pin es entrada; PINx permite leer el estado del pin.

//**************************************************************************************
SBIC  PINB,PB0 --> Salta si Bit en registro I/O es Clear 
CBI   PORTB,PB1-->Clear Bit en registro I/O
SBIS  PINB,PB0 -->Salta si Bit en registro I/O está Seteado 
SBI   PORTB,PB1 --> Setear Bit en registro I/O
RJMP BUCLE_INFINITO --> Salto incondicional a la etiqueta BUCLE_INFINITO:
.............................................................
Con esto termino mi primer pequeño ejemplo, espero sea de ayuda... Jonathan r s f 


20 comentarios:

  1. Excelente. Jonathan creo que tambien sería interesante incluir un anexo para los que usamos el BASCOM AVR que ademas viene con los programas de grabado en el chip mas usados del mercado. Tambien es compatible con el USBasp con ZIF que mencionas en este blog. Dicho sea de paso, ya voy bloquendo un ATmega8 por no configurar bien los FUSES.

    ResponderEliminar
    Respuestas
    1. Voy a ver si me da el tiempo para escribir en otros lenguajes. Pero para ser sinceros yo prefiero usar C, y estaba pensando en escribir ejemplos en C. Pero no descarto escribir en basic. Por otro lado, si quieres desbloquear tu ATmega tienes que generar una señal de reloj(>4MHz) con otro uC y aplicarla al pin XTAL1.

      Saludos...!!!

      Eliminar
  2. Una consulta Jonathan. ¿Es posible general esa señal de reloj con el simulador ISIS, hacerla salir por un pin del puerto serial (DB9) y aplicarla al pin XTAL1 que mencionas ?

    ResponderEliminar
    Respuestas
    1. mmm... no lo creo, ya que por en DB9 salen solamente bits. Lo que QUIZÁ podría funcionar es enviar constantemente 0x55, esto funcionaria como una señal de reloj (ya que cambia se 0 a 1). Si bloqueaste tu ATmega te recomiendo generar con otro uC la señal de reloj.
      Espero tengas buenos resultados.. Saludos.

      Eliminar
    2. Recomendación: Lo que yo hice para no tener problemas fue modificar el firmware del USBasp y agregarle una señal de reloj de 4MHz como salida, esa señal siempre la aplico al pin XTAL1 del cada uC que programo... nunca he tenido problemas.. es mas, esto lo hice para el programador que vendo.

      Eliminar
  3. Explicame por favor esta última recomendacion si es que te refieres al programador USBasp con socket ZIF (yo te lo compré hace algún tiempo). Yo uso el BASCOM AVR versión 1.11.9.8 que soporta el programador USBasp (aunque para serte sincero, todavía no lo uso para quemar uC's; he usado para tal fin el eXtreme Burner AVR siempre con el USBasp). Muchas gracias de antemano..!! Ah por cierto..!! Muy bueno tu blog...!!

    ResponderEliminar
    Respuestas
    1. Mi programador genera una señal de reloj de 4MHz, esta se aplica automáticamente al pin XTAL1 de cada uC que coloques en el ZIF. Que fuses le pusiste a tu uC para bloquearlo ¿?. Si le pusiste XTAL externo no deberías tener problemas, ya que el programador genera el clock, lo mismo si le pusiste osc externo. Si pusiste RC interno no es necesaria una señal a XTAL1. Si pusiste RC externo debes considerar la frecuencia. Recuerda que la frecuencia a la cual programas debe ser < 0.25 veces la principal. Para cambiar de frecuencias de programación te recomiendo usar el SinaProg 2.

      Eliminar
  4. Jonathan, sería muy complicado para ti que mostraras un circuito simple que pueda armarse en un protoboard para resetear los fusibles de mis ATmega8 bloqueados..?? Se bloquearon al configurar mal los bits de reloj interno/externo. Muchas gracias de antemano.
    Saludos.
    Javier Agama

    ResponderEliminar
  5. Hola Jonathan, tengo que hacer un termometro con atmega8 PERO NO ME SALE BN PODRIAS ASESORARME TENGO ALGUNAS DUDAS AL HACER EL CODIGO

    ResponderEliminar
  6. Amigo excelente tutorial yo empecé utilizando bascom avr pero en la universidad me piden assembler en vmlab o acepta studio quisiera saber si podes subir un tutorial de como controlar una pantalla gráfica gdm128* 64a1 con atmega8 porfavor. La verdad Módem como poder realizarlo .Lo pidieron en la universidad colocar nombre ygenerar una onda senoidal gráficamente. Gracias te agradecería. Te contactes conmigo. No de si en este foro arma puede poner email.

    ResponderEliminar
  7. Cual es la diferencia de escribir

    SBI PORTB,PB0
    o
    SBI PORTB,0


    CBI PORTB,PB0
    o
    CBI PORTB,0

    ResponderEliminar
  8. Hola una pregunta tengo dudas con la funcion de PORTX:
    El registro PORTx es para escribir datos en los pines del puerto x que están configurados como salida. Ése es su uso habitual. Sin embargo, escribir en los bits de PORTx cuyos pines estén configurados como entradas significa activar o desactivar las pull-ups de dichos pines. Ésta es la segunda función de PORTx. Leer el registro PORTx solo significa obtener el último valor que se escribió en este registro. Esa es la información que encuentro de PORTX.

    Pero cuando pone:
    SBI PORTB,0
    QUe se supone que indica ese cero, que esta configurado como entrada? ó que va a mantener el pin0 del puerto B, como entrada?

    ResponderEliminar
    Respuestas
    1. PB0 = PORTB0 = 0.
      Para seleccionar si es entrada o salida se usa DDRx.

      Eliminar
  9. PB0= es lo mismo que poner PINB0 en el código cierto?

    Entonces tiene sentido
    El registro PORTx es para escribir datos en los pines del puerto x que están configurados como salida

    ResponderEliminar
    Respuestas
    1. PORT se usa cuando el puerto es salida, y cuando es entrada es para activar las pull up

      Eliminar
  10. SBI PORTB,PB0

    Bueno mi duda surgio apartir que compile mi programa
    y puse

    SBI PORTB,PINB0

    Y funcionaba igual que al poner SBI PORTB,PB0.
    Ya que en la patita Pb0 puse un LED, asi que supuse ello.

    ResponderEliminar