Muy buenos días, mi nombre es Daniel y son nuevo en este foro y en electrónica.
Estoy aprendiendo a programar PIC y para esto utilizo el MPLab y estoy probando sobre el p16f84a, mi consulta es sobre un error y no he encontrado la respuesta en otro foro de este sitio.
En MPLab, cuando realizo la simulación todo parece funcionar perfecto pero, cuando quiero probar en otro simulador (PIC simulator IDE) al ejecutar el código me da el siguiente error.
Hardware stack underflow
Aun no he construido ningún circuito físico para probar el micro ya que me faltan comprar algunas cosas y no se si aun como detectar errores en el.
Si fuera necesario ver el código (En asembler) lo pego debajo.
Un saludo y gracias por leer este post.
;---------------------------
; V.1.0
; Prueba de movimiento de LED por el puerto B (8 LED, max.)
; Dependiendo la combinación de pulsadores en el puerto A (5 Switch, max.)
;
; Daniel G. Samborski
;------ Encabezado --------------
list p=16f84 ; indico el controlador que voy a utilizar
radix hex
include p16f84a.inc
;----- Configuro los puertos -------------
org 0x00
goto inicio
org 0x05
inicio bsf STATUS,RP0
movlw 0x00 ; 0000 0000 Todos los puertos como salida
movwf TRISB ; Prepara el puerto B como salida.
movlw b'00011' ; pone 00001 4 como salida y 1 como entrada
movwf TRISA ; Prepara el PuertoA para recibir datos
; desde el bit 0 (El primero de los 5)
bcf STATUS,RP0
btfsc PORTA,0 ; Si el bit 0 de PORTA no es 0
call on_led ; encenderá el led
btfsc PORTA,0 ; Si el bit 0 de PORTA no es 0
goto decide ; Decidirá que hacer
goto off_led ; Si el bit 0 de PORT a es 1, apaga el LED
goto inicio ; Regresa a inicio
decide ;---- Comienza a ver donde saltar ----------------------------------
movf PORTA,W ; Se copia a F, el valor W de PORTA
addwf PCL,F ; Se suma a PCL el valor de F
nop ; NOP quiere decir que no hará nada.
nop ; Esto se pone para que salte a estas líneas
goto der ; Si el bit 1 de PORTA es 0, irá a la derecha
goto izq ; Si el bit 1 de PORTA es 1, irá a la izquierda
;------ Apaga los LEDs ------------
off_led
movlw 0x00 ; Deja en 0 todos los bit del Puerto B
movwf PORTB ; asignándoselos...
return
;------ Enciendo el LED 0 ------------
on_led
bsf PORTB,0 ; Enciende el primer LED
return
;----- Comienza secuencia de barrido a la derecha----------
der
btfsc PORTA,1 ; Si el bit 1 de PORTA no es 0
goto izq ; girar a la izquierda
rrf PORTB,1 ; sino, girar a la derecha
btfss PORTA,0 ; Si el bit 0 de PORTA no es 1
goto inicio ; re iniciar las verificaciones
btfss PORTB,0 ; sino, si el bit 0 de PORTB no es 1
goto der ; seguir el giro a la derecha
bcf PORTB,7 ; sino, limpiar el bit 7 de PORTB
goto der ; y seguir el giro a la derecha
;----- Comienza secuencia de barrido a la izquierda----------
izq
btfss PORTA,0 ; Si el bit 0 de PORTA no es 1
goto inicio ; re iniciar las verificaciones
btfss PORTA,1 ; Si el bit 1 de PORTA no es 1
goto der ; comenzar a girar a la derecha
rlf PORTB,1 ; sino, girar a la izquierda
btfss PORTA,1 ; Si el bit 1 de PORTA no es 1
goto inicio ; re iniciar las verificaciones
btfss PORTB,7 ; sino, si el bit 7 de PORTB no es 1
goto izq ; seguir el giro a la izquierda
bcf PORTB,0 ; sino, limpiar el bit 0 de PORTB
goto izq ; y seguir con el giro a la izquierda
;---------------------------------------------
end
;-------------------------------------------