Dudas para crear temporizador en ensamblador

Iniciado por Fox_Neo, 20 Marzo 2013, 10:15 AM

0 Miembros y 1 Visitante están viendo este tema.

Firos

Estaba revisando el hilo un poco... y se me ha ocurrido otra cosa.

Veo que en tu código para cambiar de bancos tocas los registros RP0 y RP1.


Lo que voy a proponerte ahora es otra cosa para que no tengas que estar escribiendo eso también. Imagínate que cada vez que quieras cambiar de banco no tuvieras que pensar... mmm en cual había que poner un "1" en RP0 o en RP1?...


Pues bien. Puedes hacer lo siguiente:
Banco0 macro
bcf STATUS,RP0
bcf STATUS,RP1
endm

Banco1 macro
bsf STATUS,RP0
bcf STATUS,RP1
endm

Banco2 macro
bcf STATUS,RP0
bsf STATUS,RP1
endm

Banco3 macro
bsf STATUS,RP0
bsf STATUS,RP1
endm

padigital macro ;Para el correcto funcionamiento de esta macro es
movlw 06 ;necesario que antes se esté posicionado en el banco 1.
movwf ADCON1
endm



Con esto, estas creando unas macros y te servirán para no tener que escribir tanto en el código cada vez que quieras cambiar de banco. Será menos tedioso programar en ASM.


Estas macros lo que hacen es sustituir en el código donde pongas "Banco0" por lo que pone ahí. No es como una subrutina o función a la cual llamas y realizas un salto de PC para ejecutarla. Con esto directamente le mandas a el compilador que sustituya "Banco 0" por "bcf STATUS,RP0 / bcf STATUS,RP1".

Esto puedes guardarlo en la misma carpeta donde vayas a compilar tu programa y llámalo "macros.inc" por ejemplo. Luego, para incluirlo en tu programa, en vez de ponerlo abajo, ponlo arriba, encima de la declaración de variables, debajo de la configuración del PIC.

Código (asm) [Seleccionar]
list p=16f876, f=INHX8M, r=hex
include "p16f876.inc"
include "macros.inc"

CONDIR equ 20
CONCAR equ 21


org 0


Pruébalo. Espero que te sirva.


Un saludo.
El final del camino no está determinado, lo determinamos nosotros mismos paso a paso, día a día, y se puede cambiar.

Fox_Neo

Gracias Firos como siempre  me gusta mucho tus respuestas, despúes de las vacaciones me lo miraré con más detenimiento. Si veo que no entiendo algo ya lo diré  ;D Salu2

Meta

Cita de: Firos en 26 Marzo 2013, 21:32 PM

Cuando comprobamos si un interruptor está a "1" o a "0" hay que eliminar rebotes.


Ejemplo de antirebores de un pulsador. Este antirebores es por software y funciona de maravilla, es para ahorrar más electrónica.

Código (asm) [Seleccionar]
; Cada vez que presiona el pulsador conectado a la línea RA4 conmutará el estado de
; un LED conectado a la línea RB1.
;
; ZONA DE DATOS **********************************************************************

LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

CBLOCK 0x0C
ENDC

#DEFINE Pulsador PORTA,4 ; Pulsador conectado a RA4.
#DEFINE LED PORTB,1 ; Línea donde se conecta el diodo LED.

; ZONA DE CÓDIGOS ********************************************************************

ORG 0 ; El programa comienza en la dirección 0.
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
bsf Pulsador ; La línea RA4 se configura como entrada.
bcf LED ; Se configura como salida.
bcf STATUS,RP0 ; Acceso al Banco 0.
bcf LED ; En principio diodo LED apagado.
Principal
btfsc Pulsador ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto Fin ; No. Vuelve a leerlo.
call Retardo_20ms ; Espera que se estabilicen los niveles de tensión.
btfsc Pulsador ; Comprueba si es un rebote.
goto Fin ; Era un rebote y sale fuera.
btfsc LED ; Testea el último estado del LED.
goto EstabaEncendido
EstabaApagado
bsf LED ; Estaba apagado y lo enciende.
goto EsperaDejePulsar
EstabaEncendido
bcf LED ; Estaba encendido y lo apaga.
EsperaDejePulsar
btfss Pulsador ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
goto EsperaDejePulsar ; No. Espera que deje de pulsar.
Fin
goto Principal

INCLUDE <RETARDOS.INC>
END


Saludo.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/