Hola, ahora me toca preguntar :- P, quiero experimentar con una disquetera, y no encuentro un diagrama que describa que funcion cumple cada uno de sus pines, ¿donde podria hayarlo?
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes Menú
ESTADO EQU 0x03
PORTA EQU 0x05
PORTB EQU 0x06
org 0
bsf ESTADO,5
clrf PORTA
comf PORTA,1
clrf PORTB
bcf ESTADO,5
INICIO btfsc PORTA,0
goto APAGAR
goto ENCENDER
APAGAR bcf PORTB,0
bsf PORTB,1
goto INICIO
ENCENDER bsf PORTB,0
bcf PORTB,1
goto INICIO
end
ORG 00H
CLRF VARIABLE1
bsf PORTB,3
goto ENCENDIDO
clrf PORTA
#DEFINE BANCO1 BSF STATUS,5
#DEFINE BANCO0 BCF STATUS,5
[.........]
BTFSC VARIABLE1,0 ;Si el bit 0 de VARIABLE1 es "0" se salta la siguiente instrucción
GOTO ESUNO ;Salta a ESUNO solo si el bit 0 de VARIABLE1 es "1" BSF VARIABLE1,0 Si el bit 0 de VARIABLE1 es 0 se ejecuta esta instrucción y el programa sigue por aquí
[.........]
ESUNO ;Etiqueta a una dirección de programa
BCF VARIABLE1,0 ;Si el bit 0 de VARIABLE1 es "1" se ejecuta esta otra instrucción y el programa sigue por aquí
[.........]
![]() | Una subrutina o subprograma es una parte de programa que hace algo concreto y se repite a menudo, para ahorrar memoria y esfuerzo y para hacer el programa mas comprensible se agrupa en forma de subrutina. Una subrutina se debe ejecutar siempre llamándola con la instrucción CALL y al final de dicha subrutina debe haber siempre un RETURN. El esquema de la derecha muestra como funcionan las subrutinas: Durante el programa principal se llama varias veces a la subrutina SUBR (el nombre es lo de menos) con la instrucción CALL. Cuando el pic ejecuta una instrucción CALL se guarda en memoria la dirección de código de programa a la que tiene que retornar de tal forma que cuando se encuentra con la instrucción RETURN vuelve al programa principal donde lo dejó. Una subrutina no solo puede ser llamada desde el programa principal, también puede hacerse desde otra subrutina (una subrutina que llama a otra subrutina) o desde una interrupción (enseguida las veremos). El siguiente ejemplo muestra un programa que utiliza una subrutina de retardo a la que llama DELAY. Esta subrutina de retardo se hace decrementando el registro CUENTA2 desde FFh hasta 00h 16 veces (las veces que se decrementa CUENTA2 son contadas hacia atrás por CUENTA1) De esta forma se consigue perder tiempo (el tiempo perdido con esta subrutina depende de la frecuencia a la que opere el pic) |
;************************************
;* http://www.electron.es.vg *
;************************************
;* EJEMPLO 5: EVITANDO REBOTES *
;************************************
;* El siguiente programa cuenta las *
;* veces que se acciona un pulsador *
;* conectado a RB0 y Previene los *
;* rebotes del mismo mediante la *
;* subrutina de retardo REBOTE *
;************************************
STATUS EQU 03H
TRISB EQU 05H
PORTB EQU 05H
CUENTA EQU 0CH ;Registro donde contaremos
RETARDO EQU 0DH ;Registro para el retardo
F EQU 1
w EQU 0
#DEFINE BANCO0 BCF STATUS,5
#DEFINE BANCO1 BSF STATUS,5
ORG 00H
BANCO1 ;Pasamos al banco 1
BSF TRISB,0 ;Configuramos RB0 como Entrada
BANCO0 ;Volvemos al banco 0
CLRF CUENTA ;Pone a cero la cuenta
INICIO BTFSS PORTB,0 ;si RB0 es "1" salta la siguiente instrucción
CALL SUMA1 ;Llama a la subrutina SUMA1 (porque RB0 es "0" y,
;por lo tanto, se ha accionado el pulsador)
GOTO INICIO ;vuelve a INICIO
;================================================
; SUMA1: Subrutina que suma uno al registro
; CUENTA y espera a que se suelte el
; pulsador conectado a RB0. Tiene en
; cuenta los rebotes
SUMA1 INCF CUENTA,F ;Incrementa el registro CUENTA
CALL REBOTE ;Llama a la subrutina que previene los rebotes
ESPERA BTFSS PORTB,0 ;\
GOTO ESPERA ; }Espera a que se suele el pulsador para retornar
RETURN ;/
; Fin de SUMA1
;================================================
;================================================
; REBOTE: Subrutina que hace una pequeña
; temporización para prevenir
; los rebotes
REBOTE MOVLW 0FFH ;Carga el acumulador con 0FFh
MOVWF RETARDO ;Mueve el contenido del acumulador a RETARDO
REBO DECFSZ RETARDO,F ;\
GOTO REBO ; }No retorna hasta que RETARDO llega a cero
RETURN ;/
; Fin de REBOTE
;=================================================
END ;Indica final del programa