Programar atmega16

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

Adjuntos

  • bits_115.jpg
    bits_115.jpg
    31.4 KB · Visitas: 2,028
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
 
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
 
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).
 
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.
 
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.
 
¿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
 
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.
 
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...
 
Atrás
Arriba