Buenas.
Te pongo en rojo lo que tienes que añadir al programa
Codigo:
clrf salto
empe btfsc salto,0
goto salta
btfss ptoa, 4 ;chequea el pulsador
call subir ;llama la rutina de incremento
salta bsf salto,0
btfsc ptoa,4
bcf salto,0
movlw 08h ;iniciar un 1 en el registro de rotacion
movwf rota
movlw dig1 ;con el registro selector (fsr) se apunta
movwf fsr ;al primer dato que se va a mostrar
disp movlw 00h ;colocar en cero el dato del display
movwf ptob ;para apagarlos
movf rota, w ;pasa rotacion del 1 a la variable work
movwf ptoa ;enciende el transistor (display)
movf indo, w ;lee el dato del registro apuntado por fsr
call tabla ;genera el digito de 7 segmentos
movwf ptob ;envia el digito al puerto b
movlw 03h ;retardo de 3ms para visualizacion
call retardo
btfsc rota, 0 ;controla si terminaron las cuatro rotaciones
goto empe ;si termino, vuelve desde el comienzo
bcf status, c ;carry en cero para no afectar las rotaciones
rrf rota ;desplaza el 1 que enciende los displays
incf fsr ;incrementa el puntero. Apunta el proximo
goto disp ;digito a mostrar
Con esta modificación el programa incrementa cuando pulsas el botón por primera vez y activa el primer bit de un registro "salto" que debes definir al principio del programa. Este bit sirve para que , mientras esté activado, no se incremente la cuenta. El bit se desactiva cuando levantas el dedo del pulsador.
Si tienes alguna duda no dudes en preguntar
Buenas.
No te preocupes. Aqui estamos para estas cosas. Prefiero comentarte las cosas en el foro par que si a alguien le surge la misma duda, que tenga este post de referencia.
El error surge porque no has definido el registro "salto". Para poder utilizar los registros tales como ptoa, ptob, etc.., hay que asociar dicho nombre con una dirección de memoria. Así al principio del programa, se relaciona un nombre con una dirección de memoria y no hay que recordar que dirección de memoria tenía un registro u otro, sino que símplemente recordamos el nombre que le asignamos. Por ejemplo el purto A del PIC tiene la dirección 05h, y lo relacionamos con el nombre ptoa de la siguiente forma:
ptoa equ 05h
Así cuando escribamos "ptoa", el compilador sustituye este nombre por su valor.
En nuestro programa, vamos a asociar el nombra salto con cualquier dirección de memoria libre, por ejemplo la 20h. Te escribo en rojo la modificación:
Codigo:
indo equ 00h ;registro de indireccion
pc equ 02h ;contador de programa
status equ 03h ;registro de estado
fsr equ 04h ;registro de seleccion
ptoa equ 05h ;puerto a
ptob equ 06h ;puerto b
rota equ 0fh ;variable para desplazamiento de display
trisa equ 85h ;configuracion puerto a
trisb equ 86h ;configuracion puerto b
dig1 equ 10h ;acumulador miles
dig2 equ 11h ;acumulador centenas
dig3 equ 12h ;acumulador decenas
dig4 equ 13h ;acumulador unidades
loops equ 1dh ;variables usadas en retardos
loops2 equ 1eh
salto equ 20h
z equ 02h ;flag de cero
ram equ 05h ;bit de seleccion de pagina de memoria
c equ 00h ;flag de acarreo
w equ 00h ;bit de destino a variable de trabajo
El resto de mensajes son debidos a que cuando hay una orden "incf" o "decf", por defecto el compilador asigna este incremento al registro con el que se está trabajando. Por ejemplo, si yo escribo "incf contador", estoy incrementadno el valor del contador y el resultado lo guardo en el propio registro contador. Esta instrucción, se puede escribir de la siguiente forma: "incf contador,1". El resultado es el mismo que antes. Si en vez de poner un 1 ponemos un cero: "incf contador,0", el resultado se guarda en el registro de trabajo "w" y el contenido del registro contador no se modifica. Resumiendo:
incf contador --> Incrementa contador y resultado en contador (aparece mensage al compilar)
incf contador,1 --> Incrementa contador y resultado en contador ( no aparece mensage al compilar)
incf contador,0 --> Incrementa contador y resultado en "w"( no aparece mensage al compilar)