miércoles, 25 de noviembre de 2009

TP 12 !

La consiga de este TP es crear un programa capaz de activar una salida con una frecuencia de 500Hz, la misma se comandará desde una entrada.

Codigo Assembler

;********************************************************************
; Nombre del archivo: TestStarter.asm
;********************************************************************
; Descripción:
; ------------
; Este software sirve para verificar el funcionamientos de la
; placa Starter.
; Enciende y apaga los leds conectados al PORTB en una secuencia
; determinada por el programa, siempre y
; cuando se active mediante un "1" la llave conectada en RA0.
;
;********************************************************************
; Hardware:
; ---------
; Placa Starter
; XTAL: 4MHz
;********************************************************************
; Autores: VMMB Fecha: 18/11/09 Versión:1.0
;********************************************************************
LIST p=PIC16F84A
INCLUDE
__CONFIG _WDT_OFF & _PWRTE_ON & _CP_OFF & _XT_OSC
ERRORLEVEL -302

;********************************************************************
; Definiciones y Equivalencias
;********************************************************************

#DEFINE BANK0 bcf STATUS,RP0 ; Cambio al banco 0
#DEFINE BANK1 bsf STATUS,RP0 ; Cambio al banco 1

RAM EQU 0x0C
FLASHROM EQU 0x000

SW_0 EQU 0
SW_1 EQU 1
;********************************************************************
; Variables
;********************************************************************
CBLOCK RAM
var_1
var_2
var_3
w_temp
status_temp
ENDC
;********************************************************************
; MACROS (Sustituyen una o más lineas de código por un nombre)
;********************************************************************
; Macros usadas para este programa

LEDS_OFF MACRO
clrf PORTB
ENDM

LEDS_ON MACRO
movlw b'11111111'
movwf PORTB
call delay_200ms
LEDS_OFF
call delay_200ms
ENDM

LED_1 MACRO
movlw b'00000001'
movwf PORTB
ENDM

LED_2 MACRO
movlw b'00000010'
movwf PORTB
ENDM

LED_3 MACRO
movlw b'00000100'
movwf PORTB
ENDM

LED_4 MACRO
movlw b'00001000'
movwf PORTB
ENDM

LED_5 MACRO
movlw b'00010000'
movwf PORTB
ENDM

LED_6 MACRO
movlw b'00100000'
movwf PORTB
ENDM

LED_7 MACRO
movlw b'01000000'
movwf PORTB
ENDM

LED_8 MACRO
movlw b'10000000'
movwf PORTB
ENDM

LED_1y3 MACRO
movlw b'00000101'
movwf PORTB
ENDM

LED_2y4 MACRO
movlw b'00001010'
movwf PORTB
ENDM

LED_3y5 MACRO
movlw b'00010100'
movwf PORTB
ENDM

LED_4y6 MACRO
movlw b'00101000'
movwf PORTB
ENDM

LED_5y7 MACRO
movlw b'01010000'
movwf PORTB
ENDM

LED_6y8 MACRO
movlw b'10100000'
movwf PORTB
ENDM

LED_7y1 MACRO
movlw b'01000001'
movwf PORTB
ENDM

LED_8y2 MACRO
movlw b'10000010'
movwf PORTB
ENDM

LED_1y2 MACRO
movlw b'00000011'
movwf PORTB
ENDM

LED_3y4 MACRO
movlw b'00001100'
movwf PORTB
ENDM

LED_5y6 MACRO
movlw b'00110000'
movwf PORTB
ENDM

LED_7y8 MACRO
movlw b'11000000'
movwf PORTB
ENDM



; Macros usadas para guardar los registros W y STATUS al momento
; de llegar una interrupción

PUSH MACRO
movwf w_temp
swapf STATUS,W
movwf status_temp
ENDM


POP MACRO
swapf status_temp,W
movwf STATUS
swapf w_temp,F
swapf w_temp,W
ENDM

;********************************************************************
; Vectores
;********************************************************************
ORG FLASHROM
clrw
goto Inicio ; de Reset

ORG 0x004
goto Isr ; de Interrupción

;********************************************************************
Inicio
;********************************************************************

; Configuro los puertos I/O
BANK1
movlw b'11111'
movwf TRISA
clrf TRISB
BANK0
;********************************************************************
; Programa principal
;********************************************************************

Loop_1
;LEDS_OFF
LEDS_ON
goto Loop
Loop
btfss PORTA,SW_0
goto Variacion_1
goto Variacion_2

Variacion_1
btfss PORTA,SW_1
goto Loop_1
goto SECUENCIA_1

Variacion_2
btfss PORTA,SW_1
goto SECUENCIA_2
goto SECUENCIA_3

SECUENCIA_1
LED_1
call delay_200ms
LED_2
call delay_200ms
LED_3
call delay_200ms
LED_4
call delay_200ms
LED_5
call delay_200ms
LED_6
call delay_200ms
LED_7
call delay_200ms
LED_8
call delay_200ms
goto Loop


SECUENCIA_2
LED_1y3
call delay_200ms
LED_2y4
call delay_200ms
LED_3y5
call delay_200ms
LED_4y6
call delay_200ms
LED_5y7
call delay_200ms
LED_6y8
call delay_200ms
LED_7y1
call delay_200ms
LED_8y2
call delay_200ms
goto Loop


SECUENCIA_3
LED_1y2
call delay_200ms
LED_3y4
call delay_200ms
LED_5y6
call delay_200ms
LED_7y8
call delay_200ms
goto Loop


;********************************************************************
; Subrutinas
;********************************************************************
; Delays
;
delay_200ms
;499994 cycles
movlw 0x03
movwf var_1
movlw 0x18
movwf var_2
movlw 0x02
movwf var_3
delay_200ms_0
decfsz var_1, f
goto $+2
decfsz var_2, f
goto $+2
decfsz var_3, f
goto delay_200ms_0

;2 cycles
goto $+1

;4 cycles (including call)
return

;********************************************************************
; Servicio de Interrupción
;********************************************************************
Isr
PUSH

; Aca se escribe el Servicio de Interrupción

POP
retfie
;********************************************************************
END ;Directiva que indica la finalización del pgm


Simulación


No hay comentarios:

Publicar un comentario