martes, 7 de octubre de 2008

Contador de 1 a f pero solo una vez

;**********************************************************************
;***** PROGRAMA QUE CUENTA DE 1 A F UNA VEZ *****
;**********************************************************************
.include"m32def.inc"
.def temp= r16

.def incr= r17

;***** TABLA DE VECTORES DE INTERRUPCION *****

.org $000 ;selección de dirección para esta inetrrupcion

rjmp RESET ;manjo de interrupción 1=RESET

.org $004
rjmp INT_1 ;manejo de interrupción 3=INT1

RESET:

ldi temp, low(RAMEND)
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp ;se configura al stack-pointer para subrutina e interrupciones
clr temp
out DDRD, temp
ser temp
out DDRB, temp
out PORTD, temp
ldi temp, 0b10000000
out GICR, temp ;se crea la mascara para interrupción externa
ldi temp, 0b00001000
out MCUCR, temp ;la interrupción se genera en el flanco positivo
sei ;habilitación del bit I en SREG
rjmp INICIO

;***** S U B R U T I N A S *****

SUBRUTINA:

; 2000000 cycles:
; -----------------------------
; delaying 1999998 cycles:
ldi R17, $12
WGLOOP0: ldi R18, $BC
WGLOOP1: ldi R19, $C4
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; -----------------------------
; delaying 2 cycles:
nop
nop
ret
; =============================
;***** INTERRUPCIONES *****
INT_1:


dec incr
rcall SUBRUTINA
out PORTB, incr
cpi incr, 0
breq fin
brne INT_1

fin:
reti
;***** P R O G R A M A P R I N C I P A L *****

INICIO:

inc incr
rcall SUBRUTINA
out PORTB, incr
cpi incr, 15
breq fina
brne INICIO

fina:
rjmp fina

sábado, 4 de octubre de 2008

REGRESO A LA PAGINA PRINCIPAL

Suma vista por el puerto pero con retardo

;********************************************************************************************************
;*****PROGRAMA QUE SUMA UNOS DATOS Y LOS ALMACENA EN LA MEMORIA *****
;********************************************************************************************************

.include "m32def.inc"
.def temp=r16

.def suma=r17

;Por el momento haremos un programa muy básico para demostrar algunas de las funciones del micro

RESET:
ldi temp, low(RAMEND)
out SPL, temp
ldi temp, high(RAMEND) ;configuración del Stack Pointer para uso de subrutinas
out SPH, temp

ser temp ;con esta instrucción se carga el número 255 a r16
out DDRA, temp ;confiduración del puerto Acomo salida
clr temp ;instrucción que borra el contenido de r16
rjmp INICIO

;***** SECCION DE SUBRUTINAS *****
; =============================

; delay loop generator
; 100000 cycles:
; -----------------------------
; delaying 99990 cycles:
RETARDO_A:
ldi R17, $A5
WGLOOP0:
ldi R18, $C9
WGLOOP1:
dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; -----------------------------
; delaying 9 cycles:
ldi R17, $03
WGLOOP2:
dec R17
brne WGLOOP2
; -----------------------------
; delaying 1 cycle:
nop
ret

;***** PROGRAMA PRINCIPAL *****

INICIO:
inc temp
sts 0x60, temp
lds temp, 0x60
add suma, temp
sts 0x61, suma
lds suma, 0x61
rcall RETARDO_L ;instruccion que hace un llamado a subrutina
out PORTA, suma ;visualización del resultado en el puerto A
rjmp INICIO

;NOTA:;El stack pointer es un puntero de pila que se utiliza para almacenar datos temporales, para almacenar;variables locales y almacenar el regreso de direcciones despues de llamados a subrutinas, así como;tambien despues de ejecutarse las interrupciones.;Para mas explicación ver la hoja de datos del ATMEGA32 en su sección del stack pointer

;NOTA:
;ir a la página principal para descargar el software generador de retardos para las siguientes aplicadiones...

Suma vista por el puerto A despues de leer de memoria

EJEMPLO 2:
;**************************************************************************************************
;*****PROGRAMA QUE SUMA UNOS DATOS Y LOS ALMACENA EN LAMEMORIA
;**************************************************************************************************
.include "m32def.inc"
.def temp=r16
.def suma=r17
;Por el momento haremos un programa muy básico para demostrar algunas de las funciones del micro
RESET:
ser temp ;con esta instrucción se carga el número 255 a r16
out DDRA, temp ;confiduración del puerto Acomo salida
clr temp ;instrucción que borra el contenido de r16
rjmp INICIO
INICIO:
inc temp
sts 0x60, temp
lds temp, 0x60
add suma, temp
sts 0x61, suma
lds suma, 0x61
out PORTA, suma ;visualización del resultado en el puerto A
rjmp INICIO
;NOTA:;Todos los puertos tienen registros de configuracion y se llaman DDR(nombre del puerto a configurar),
;en esta aplicación se ha configurado al puerto A como salidas poniendo todos los bits del puerto A ;a 1´s.
;NOTA:;Para configurar a cualquier puerto como entrada se le tiene que cargar al registro ;DDR(nombre del puerto) que es el de configuración los 0´s.

Suma de datos almacenados en memoria

;***************************************************************************************************
;***** PROGRAMA QUE SUMA UNOS DATOS Y LOS ALMACENA EN LA MEMORIA
;***************************************************************************************************
.include "m32def.inc" ;directiva que incluye los archivos del micro
.def temp=r16 ;directiva para definir un nombre smbolico para los registros

.def suma=r17 ;operandos los 32 registros de orden general r0-r31
;Por el momento haremos un programa muy básico para demostrar algunas de las funciones del micro

RESET: ;primera interrupcion ubicada en la direccion $000

ldi temp, 0 ;instrucción que carga un numero al registro r16
;operandos del r16-r31
rjmp INICIO ;salto relativo a inicio

INICIO: ;etiqueta para definir el programa principal a ejecutar

inc temp ;incremento de r16, valor inicial=0
sts 0x60, temp ;almacenamos este dato en la memoria de datos, direccion 0x60 hex.
lds temp, 0x60 ;leemos lo que esta en esta direccion
add suma, temp ;se hace una suma lógica entre los dos registros, resultado en r17
sts 0x61, suma ;se almacena resultado en memoria de datos, dirección 0x61
rjmp INICIO ;salto relativo a esta etiqueta.

;NOTA:;los comentarios de color verde no son ejecutados por el compilador solo sirven para dar enfasis a una ;operacion en especial.......
;NOTA1:;todos los numros sumados estan en el orden de nuemros hexdeimales por lo que supongo que usted ya ;sabe hacer la conversion.....