TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: alemaniafino en 09 de Mayo de 2013, 13:50:15
-
soy novato, me intereso mucho esto sobre pic's y estoy practicando, hice un ciclo que consiste en que por el PORTA prendieran leds a manera de numeracion secuencial es decir: '0001', luego '0010, '0011' y asi hasta llegar al 15, y por medio de un decfsz se repitiera el ciclo 3 veces pero, cuando lo simulo en proteus, los leds no paran nunca de prender, luego en mp lab verifique con mplabsim y el visor de registros, y me mando estos errores, a pesar de que en el quickbuild me puso Build succeeded:
:-/ :-/ Espero me ayuden porque ya me desespere y estoy muy entusiasmado con el pic :mrgreen: de antemano gracias ((:-))
Build:
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F84A "CONTADOR2.asm" /l"CONTADOR2.lst" /e"CONTADOR2.err"
Message[302] C:\CONTADOR2.ASM 13 : Register in operand not in bank 0. Ensure that bank bits are correct.
BUILD SUCCEEDED: Thu May 09 10:12:49 2013
MPLABSIM:
CORE-E0002: Stack under flow error occurred from instruction at 0x000404
codigo:
;DATOS
LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0x0C
ENDC
Contador EQU d'3'
ORG 0
Inicio bsf STATUS,RP0
clrf TRISA
bcf STATUS,RP0
movwf Contador
Principal
movlw b'0000'
movwf PORTA
call Retardo200
movlw b'0001'
movwf PORTA
call Retardo200
movlw b'0010'
movwf PORTA
call Retardo200
movlw b'0011'
movwf PORTA
call Retardo200
movlw b'0100'
movwf PORTA
call Retardo200
movlw b'0101'
movwf PORTA
call Retardo200
movlw b'0110'
movwf PORTA
call Retardo200
movlw b'0111'
movwf PORTA
call Retardo200
movlw b'1000'
movwf PORTA
call Retardo200
movlw b'1001'
movwf PORTA
call Retardo200
movlw b'1010'
movwf PORTA
call Retardo200
movlw b'1011'
movwf PORTA
call Retardo200
movlw b'1100'
movwf PORTA
call Retardo200
movlw b'1101'
movwf PORTA
call Retardo200
movlw b'1110'
movwf PORTA
call Retardo200
movlw b'1111'
movwf PORTA
call Retardo200
decfsz Contador,f
goto Principal
;SUBRUTINAS
CBLOCK
R_ContA
R_ContB
R_ContC
ENDC
Retardo200
movlw d'5'
goto RetardoDecima
RetardoDecima
movwf R_ContC
RetardoBucleExterno2
movlw d'50'
movwf R_ContB
RetardoBucleExterno1
movlw d'249'
movwf R_ContA
RetardoBucleInterno
decfsz R_ContA,F
goto RetardoBucleInterno
decfsz R_ContB,F
goto RetardoBucleExterno1
decfsz R_ContC,F
goto RetardoBucleExterno2
return
END
-
[code]Inicio bsf STATUS,RP0
clrf TRISA
bcf STATUS,RP0
movwf Contador[/code]
observo que estas asignando el valor de W al registro contador sin establecer antes un valor para W por lo cual esl registro contador esta siendo cargado con un valor indetermindado
Contador EQU d'3'
la directiva EQU se usa para crear una representacion fija de un valor numerico, es decir darle un nombre a un valor
en este caso estas fijando el valor '3' al nombre contador para luego usarlo como direccionamiento directo de un registro.
-
De nuevo aqui--- :)
Les cuento que me ha ido mal...
Quite la directiva EQU y declare la etiqueta Contador dentro de CBLOCK y ENDC: y ya le asigne un valor a Contador mediante el movlw, y el resto del codigo anterior...
LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0x0C
Contador
ENDC
ORG 0
Inicio bsf STATUS,RP0
clrf TRISA
movlw d'3'
movwf Contador
bcf STATUS,RP0
Tambien he Puesto Contador fuera del CBLOCK... como seguia sin parar intente poniendo como subrutina el decfsz
------ ;codigo antecedente
movlw b'1111'
movwf PORTA
call Retardo200
call Bucle
;SUBRUTINAS
CBLOCK
R_ContA
R_ContB
R_ContC
Contador
ENDC
Retardo200
-----------;codigo
Bucle
movlw d'3'
movwf Contador
decfsz Contador,f
goto Principal
return
END
y tampoco me valio, sigue sin parar, no estoy entendiendo esto.
que lata doy aunque esta sencillo no hago que pare el Bucle. :D
-
Hay otro error en tu código:
cuando el contador de programa llega a la ultima dirección de la memoria de programa se resetea y comienza a ejecutar desde la dirección cero de nuevo, en tu código cuando el registro "Contador" decrementa y su valor queda en cero sale de ese bucle, ejecuta la subrutina "retardo200"y luego no hay nada que le ordene al programa quedarse ahí quieto por lo cual el contador de programa sigue corriendo hasta que se acaba la memoria de programa y luego comienza desde la dirección cero otra vez ejecutando así todo el programa de nuevo.
Para corregir esto debes escribir donde deseas que pare, unas instrucciones que le indiquen al programa que se quede ahí y no siga avanzando el contador de programa.
de resto debería funcionar bien
-
Hola a todos :-/
Gracias alexhumbertoa, ya logre que parara, para que el decfsz no saltara a la siguiente instruccion que formaba parte de la subrutina primero apague los leds con un clrf y luego hice esto goto $, asi lo detuve, aunque en el mplabsim me marca un desbordamiento de pila (stack underflow from 0x000404) en el proteus si corre bien, y aqui pongo el codigo completo: ;DATOS
LIST P=16F84A
INCLUDE <P16F84A.INC>
Contador
ORG 0
Inicio bsf STATUS,RP0
clrf PORTA
bcf STATUS,RP0
Etiqueta
movlw d'2'
movwf Contador
Principal
movlw b'0000'
movwf PORTA
call Retardo200
movlw b'0001'
movwf PORTA
call Retardo200
movlw b'0010'
movwf PORTA
call Retardo200
movlw b'0011'
movwf PORTA
call Retardo200
movlw b'0100'
movwf PORTA
call Retardo200
movlw b'0101'
movwf PORTA
call Retardo200
movlw b'0110'
movwf PORTA
call Retardo200
movlw b'0111'
movwf PORTA
call Retardo200
movlw b'1000'
movwf PORTA
call Retardo200
movlw b'1001'
movwf PORTA
call Retardo200
movlw b'1010'
movwf PORTA
call Retardo200
movlw b'1011'
movwf PORTA
call Retardo200
movlw b'1100'
movwf PORTA
call Retardo200
movlw b'1101'
movwf PORTA
call Retardo200
movlw b'1110'
movwf PORTA
call Retardo200
movlw b'1111'
movwf PORTA
call Retardo200
decfsz Contador,F
goto Principal
clrf PORTA
goto $
;SUBRUTINAS
CBLOCK 0x0C
R_ContA
R_ContB
R_ContC
ENDC
Retardo200
movlw d'5'
goto RetardoDecima
RetardoDecima
movwf R_ContC
RetardoBucleExterno2
movlw d'50'
movwf R_ContB
RetardoBucleExterno1
movlw d'249'
movwf R_ContA
RetardoBucleInterno
decfsz R_ContA,F
goto RetardoBucleInterno
decfsz R_ContB,F
goto RetardoBucleExterno1
decfsz R_ContC,F
goto RetardoBucleExterno2
return
END
seguire estudiando y practicando ya les comentare en breve mis siguientes proyectos y dudas sobre ellos, saludos y gracias.