Programar atmega16

#1
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 )
 
#2
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
 
#3
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.
 
#4
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
 
#5
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

#6
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
 
#9
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
 
#11
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).
 
#14
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.
 
#15
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.
 
#16
¿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
 
#17
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.
 
#20
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...
 

Temas similares