# Programar  atmega16



## Norberto (May 4, 2007)

Programo muy bien PICs y ahora tengo que migrar a ATMEGA16 tengo todo lo necesario pero no se como comenzar a programar en asembler en estos bichos, si alguien tiene alguna pequeña rutina para prender y apagar un led donde figuren todos los seteos iniciales se lo agradecere (tiene que ser asembler no C )


----------



## Perromuerto (May 4, 2007)

Aqui esta el enlace a un codigo:
http://www.avrfreaks.net/index.php?module=Freaks Files&func=viewFile&id=69&showinformación=1
Lo obtuve de donde esta todo lo que puedas necesitar sobre los AVR:
http://www.avrfreaks.net/
Lo ejor del AVR es que el compilador C es gratuito. Para Windows hay un ambiente
integrado llamado WinAVR:
http://winavr.sourceforge.net/
Desde el simulador y ensamblador que Atmel te da, puedes crear programas en C 
y ejecutarlos dentro del simulador. 
De paso, el CPU es siempre el mismo. Solo varian los perifericos y la cantidad
de memoria.

Saludos


----------



## Norberto (May 4, 2007)

Lo que busco es asembler basico para prender un led y luego y explorando de apoco, el que me mandas en el link tiene demasiadas cosas y saber que sacar o que dejar es mas complicado que empesar de cero, y por otro lado el C por ahora no me sirve, igualmente muchas gracias.


----------



## Perromuerto (May 5, 2007)

Aqui hay un sitio dedicado a principiantes:
http://www.avr-asm-tutorial.net/avr_en/beginner/index.html
En todo caso, me tome la molestia de podar un codigo:

; 
;**** Comienzo del segmento de codigo
.def            RAMEND=1023              ; Fin de la RAM (ajustar de acuerdo al modelo) 
.cseg					;Segmento CODE
.org 0                                  ; Contador de posicion a cero
		rjmp reset		;Manejador del reset
		nop			;interrupcion no atendid
		nop                     ;interrupcion no atendida
		nop			;interrupcion no atendida

;*** Manejador del reset **************************************************
;*** Configura el puerto

reset:		
                ldi R16,LOW(RAMEND) ; Inicializa el apuintador de pila
                out SPL,R16
                ldi R16,HIGH(RAMEND)
                out SPH,R16

		ser R16			; R16 a unos
		out DDRB,R16		;Configura todo el puerto B como salidas
		out PORTB,R16		;Pone todas las patillas de B a uno
		clr flags		;Borramos las banderas


;**** Parpadeo
blink:
		ser R16			; R16 a unos
		out PORTB,R16		;Pone todas las patillas de B a uno
                rcall retardo
		clr R16			; R16 a ceros
		out PORTB,R16		;Pone todas las patillas de B a cero
                rcall retardo
                rjmp blink

; retardo simple
retardo:
                ser r15                 ; r15 a FFh
retardo1:
                dec r15                 ; decrementa
                cpi r15,0               ; compara con cero
                brne retardo1        ; si no es igual salta a retardo1
                ret                     ; regresa de subrutina


----------



## Norberto (May 7, 2007)

Gracias perromuerto, hasta aca todo bien, como configuro los bit del programador el circuito es basico, tiene un xtal de 8mhz, los pines de programacion y un led+R conectado entre el pin 40 y masa, todo alimentado con 5V, puedo programarlo, leerlo, pero no logro prender el led!! el micro es el ATMEGA16, fijate si hay que modificar el codigo que enviastes antes


----------



## Perromuerto (May 7, 2007)

Habia un par de gazapos en el codigo.
Como me dices que usas la patilla 40, entonces empleas 
el puerto A. Modifique eso tambien el codigo es este:
;*****************************************************
;**** Comienzo del segmento de codigo
.include "m16def.inc"
.cseg ;Segmento CODE
.org 0 ; Contador de posicion a cero
    rjmp reset ;Manejador del reset
    nop ;interrupcion no atendid
    nop ;interrupcion no atendida
    nop ;interrupcion no atendida

;*** Manejador del reset **************************************************
;*** Configura el puerto

reset:
    ldi R16,LOW(RAMEND) ; Inicializa el apuintador de pila
    out SPL,R16
    ldi R16,HIGH(RAMEND)
    out SPH,R16

    ser R16 ; R16 a unos
    out DDRA,R16 ;Configura todo el puerto A como salidas
    out PORTA,R16 ;Pone todas las patillas de A a uno


;**** Parpadeo
blink:
    ser R16 ; R16 a unos
    out PORTA,R16 ;Pone todas las patillas de A a uno
    rcall retardo
    clr R16 ; R16 a ceros
    out PORTA,R16 ;Pone todas las patillas de A a cero
    rcall retardo
    rjmp blink

; retardo simple
retardo:
    ser R17 ; r17 a FFh
retardo1:
    dec R17 ; decrementa
    cpi R17,0 ; compara con cero
    brne retardo1 ; si no es igual salta a retardo1
    ret ; regresa de subrutina
;******** Fin del programa
;*****************************************************

Lo acabo de correr en el AVRStudio 4.0 y funciona 
perfectamente. El simulador muestra como las patillas son
configuradas y activadas. Mucha suerte.

Saludos


----------



## Norberto (May 8, 2007)

Perromuerto como configuro los bit de programacion del micro para el hardware que te describi???


----------



## Norberto (May 8, 2007)

Perromuerto como configuro los bit de programacion del micro para el hardware que te describi???


----------



## Perromuerto (May 8, 2007)

Parece que lo tenías programado para un reloj externo, o sea, una
señal cuadrada que viene de alguna otra parte.
Para tu hardware, tal como lo describes, con un cristal de 8MHz, pon los
fusibles internos de la siguiente forma:
CKOPT=1, CKSEL1=1, CKSEL2=1, CKSEL3=1, CKSEL0=0
SUT0=1, SUT1=1
Lo demas lo dejas igual. Siempre es bueno tener a mano un osciloscopio.
Pudiera ser que el oscilador no este arrancando.

Saludos


----------



## Norberto (May 8, 2007)

pruebo y te digo, el seteo era algo que vi en internet, seguro estaba mal.


----------



## Norberto (May 8, 2007)

no entiendo la parte del bootloader, mi idea es que arrnaque igual que cualquier micro estandar, con un programa basico lineal ( saltos, testeo de pines, cambio de estados de los puertos etc).


----------



## Perromuerto (May 8, 2007)

Pon BOOTRST a 1. Eso deshabilita el bootloader y todo arranca
como quieres.

Suerte


----------



## alertamaxima (May 8, 2007)

Yo estoy utilizando el Bascom AVR, baje una demo compila hasta 2k es muy facil y eficiente.
Te lo recomendo.
Saludos


----------



## Perromuerto (May 9, 2007)

Si no se va a usar el assembler, usese el C. WinAVR es gratuito
y es reconocido por avrstudio4, que puede crear proyectos con el 
y simular la ejecución del código C y permite depurarlo en fuente.
Para el C existen sistemas operativos y pilas TCP/IP gratuitas,
además de excelentes librerías para el manejo de los periféricos.
De paso sin límites de memoria de ningún tipo. Además, como
lenguaje de programación el C es absolutamente superior a "aquello".
Según palabras de Dijstra:
"Es prácticamente imposible enseñarle buena programación a
estudiantes que han tenido una exposición previa al basic: están
mentalmente mutilados mas allá de toda esperanza de recuperación"
Cita traducida de:
http://www.cs.utexas.edu/users/EWD/transcriptions/EWD04xx/EWD498.html
Assembler y C. Para alto nivel Java y Python. Para scripting Perl y Python.
C++ sólo bajo amenaza de muerte, pero nunca, nunca el Basic.


----------



## Norberto (May 11, 2007)

No puedo hacer que prenda el led, no hay forma, y lo peor que al configurar los fusibles del micro setee los los bit cksel3,2,1,0 y el micro ya no puede ser borrado, leido o programado, probe lo mismo con otro y tambien dejo de funcionar, realmente me siento frustrado por la potencialidad de estos micros y el no poder prender un simple led.


----------



## Perromuerto (May 11, 2007)

¿Verificaste si el oscilador oscila? Si no es así, intenta inyectarle una onda cuadrada
del orden de 1MHz por la patilla xtal1. La onda debe tener una amplitud enter 0V y VCC.
Normalmente el micro vuelve a responder. Por cierto ¿que programador estás usando?

Saludos


----------



## Norberto (May 14, 2007)

Logre hacer parpadear el LED el problema estaba en el tipo de archivo generado en el ensamblador, si alguno me ayuda o me aclara algo voy a estar mas contento.
Uso el AVR studio 3 programo en assembler  pero por default cuando ensamblo el assembler, solo genera un archivo .obj, entre a "project"->"project setting" y code generation y lo setee en generic hex cosa que no funcion y ahi es donde tuve todos los problemas.
Cambie por "intel intellec 8" y todo comenzo a marchar, si alguien entiende el porque o si hay que setear otro cosa por favor avise!!!, desde ya muchas gracias.


----------



## Perromuerto (May 14, 2007)

Para empezar, bajate la version 4.12 del avrstudio de aqui:
http://www.atmel.com/dyn/resources/prod_documents/aStudio412SP4b498.exe
Segundo, parece que no genera el archivo HEX si no escoges "intel intellec 8".
Lo que ocurre es que hay que ser muy detallista, por que hay muchos pasos
envueltos. Ademas, si descargas la última versión del  AVR Studio, te darás
cuenta que hay una nueva versión del ensamblador.

Saludos


----------



## Norberto (May 15, 2007)

El problema es que hay maquinas donde utilizo este soft y otros que tengo win98 y no funcionan versiones superiores al avr studio 3.56.


----------



## Fernando2008 (May 28, 2008)

buneno amigo aqui te describo como hacer lo que deseas:
*****programa para leer un interruptor desde un portico y prender o apagar un led*****


.include"m16def.inc"                 ;para incluir todas las librerias

.cseg                       ;con esto inicializo en la primera direccion de la memoria de programa
ldi r16,0b1111111 ; configuro portico a el pin0 como entradas (con 1)
out ddra,r16

ldi r16,0b11111110   ; configuro portico b como salidas (Con 0)
out ddrb,r16

inicio:
in r16,pina     ; leo el portico a
sbrs r16,0   ;testeo el bit 0 si es uno salta a sbrc y prende el led, si es uno prendo el led 
cbi portb,0    ; apago led
sbrc r16,0
sbi portb,0 ; prender led

rjmp inicio
------------------------------------
Listo, es recomendable configurar como entradas los pines q no ocupes. 
sbrs y sbrc son instrucciones para testear bits de un registro.
con 1 en el interruptor enciendes el led y con 0 apagas el led.
espero q te haya podido ayudar.....avisame si necesitas mas ayuda o si tienes ,mas preguntas...


----------



## TxOs (Ago 4, 2008)

Hola amigos, despues de haber visto muchos foros, noté que aqui se habla con conocimiento y propiedad del tema electrrónico en cuestión. (cosa que me alegra)
Una pregunta, sobre el atmega16 y sus fusibles.
Necesito colocarle un reloj externo al AT16 y según el datasheet, se requiere cololocar todos los CKSEL en "0" (o sea programados).
También dice que al programar el CKOPT se puede habilitar el condensador internode 36 pF entre la patilla XTAL1 y GND. 
Alli viene la pregunta...
-De que depende que habilite o no el CKOPT?
-------------
Nota, estoy utilizando un atmega16 y necesito hacerlo trabajar con el reloj de un ENC28J60 (por motivos de cincronizacion entre ambos).


----------

