TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: pizz en 03 de Octubre de 2011, 11:07:06
-
Hola, quería ver si me podían dar una ayudita.
Estoy intentando crear un bucle consistente en dos rutinas. Es decir, de los 8 leds conectados al puerto B de mi 16F84A, primero quiero que roten los 4 primeros y cuando lo haya hecho tres veces que vaya a que roten los otros 4 leds y cuando también hayan rotado otras 3 veces, que vuelva a hacerlo.
El problema es que cuando entra en el bucle de "Decrementa2" y hace el "CONTA2,1" siempre se queda haciendo ese bucle y se va a "Inicio3" y siempre están rotando esos 4 leds y nunca vuelve a Inicio1. Es como si "CONTA2" nunca restara y nunca valiera cero.
Ya sé que el resto del programa se podría hacer con rrf o rrl y demás pero este pequeño programa lo he montado más que nada para el tema de contar bucles y salir hacia otro bucle y luego poder volver y así.
Si me pudieran decir dónde puedo estar fallando se lo agradezco.
Saludos.
;*****Establecimiento constantes ****
STATUS equ 03h
TRISB equ 86h
PORTB equ 06h
PDel0 equ 0Ch
PDel1 equ 0Fh
PDel2 equ 0Dh
CONTA1 equ 0Eh
CONTA2 equ 0Fh
;
;****Configuración del Puerto****
bsf STATUS,5 ; Cambiamos al banco 1Switch to Bank 1
movlw 00h ; Ponemos los pines del puerto B ...
movwf TRISB ; ...como salidas.
bcf STATUS,5 ; Volvemos al Banco 0.
Inicio1
clrf CONTA1
clrf CONTA2
movlw d'4'
movwf CONTA1
movlw d'4'
movwf CONTA2
Decrementa1
decfsz CONTA1,1
goto Inicio2
goto Decrementa2
Inicio2
movlw b'00000001'
movwf PORTB
call PDelay
movlw b'00000010'
movwf PORTB
call PDelay
movlw b'00000100'
movwf PORTB
call PDelay
movlw b'00001000'
movwf PORTB
call PDelay
movlw b'00000000'
movwf PORTB
call PDelay
goto Decrementa1
Decrementa2
decfsz CONTA2,1
goto Inicio3
goto Inicio1
Inicio3
movlw b'10000000'
movwf PORTB
call PDelay
movlw b'01000000'
movwf PORTB
call PDelay
movlw b'00100000'
movwf PORTB
call PDelay
movlw b'00010000'
movwf PORTB
call PDelay
goto Decrementa2
PDelay movlw .14 ; 1 set number of repetitions (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set number of repetitions (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set number of repetitions (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) is the time over? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) is the time over? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 cycles delay
PDelL2 clrwdt ; 1 cycle delay
return ; 2+2 Done
end
-
Estás asignando el mismo lugar de memoria a PDel1 y a CONTA2, no se si será ese el único problema. Saludos
-
No me lo puedo creer !!!!!!.
No te imaginas la de vueltas que le he estado dando al programa.
Pues supongo que sí que será eso. En unas horas llego a casa, lo pruebo y te digo.
Siento mucho haber hecho una pregunta tan estúpida aunque de verdad que no se puede decir que no lo haya estado repasando porque me volví loco.
También debo reconocer que gracias a todos los fallos que voy cometiendo voy aprendiendo mucho de cómo "pensar" como el pic para ir haciendo los programas y creanme que se va a prendiendo mucho.
Por supuesto también es gracias a los que aquí nos ayudáis a los novatos como yo que cometemos estos fallos tan tontos. Pero si no fuera por ustedes a las dos semanas ya abandonaríamos todo.
Muchas gracias y dentro de unas horas te digo qué tal.
Saludos.
-
Perfecto!!.
Muchas gracias. Me había obsesionado en mirar todo el código y hay que prestar atención desde el principio de todo.
Como dije antes, gracias a todos los que nos ayudáis a los más nuevos en esto. Si no fuera por vosotros, más de uno habríamos dejado ya de intentar continuar.
Saludos y hasta la próxima.
-
Me alegro que haya funcionado. Todos aprendemos de este maravilloso foro. :-/
-
Hola, me alegro que ya te funciona, y para no tener que indicar las direcciones de los registros del micro, puedes definir de esta manera
LIST P=16F873A ;Se indica el modo de procesador
INCLUDE <P16f873A.inc> ;se incluye la definicion de los registros internos
y ya te carga según los nombres del fabricante...
y tus registros, los puedes "direccionar" empleando CBLOCK
ejemplo
CBLOCK H'20' ;32 decimal H'0C'
;ASIGNACION DE REGISTRO DE USO GENERAL
UNIDADES
NUMERO
FLAG
BANDERA
DATO
loops
loops2
BYTE
ENDC
recuenda terminar con ENDC :mrgreen:
-
Uy, te agradezco mucho a ti también "todopic" por las indicaciones que me das, aunque a primera vista lo único que entiendo es lo de "LIST P=16F873A". Tendré que buscar información sobre lo que me pones porque no me queda muy claro lo primero de que se carguen los nombres del fabricante. No sé exactamente qué quieres decir con eso ni como utilizarlo.
Y con el ejemplo que me pones me pasa igual. Buscaré información porque no me queda muy claro lo que quieres que haga con todo eso que me pones.
Indagaré acerca de "CBLOCK" y a ver qué encuentro.
Gracias y saludos.
-
Hola, por ejemplo, lo que tu escribes como
;*****Establecimiento constantes ****
STATUS equ 03h
TRISB equ 86h
PORTB equ 06h
son direcciones de registros dados por el fabricante.. que puedes ahorrar de escribir si colocas el INCLUDE y las definiciones como te mencione arriba...
y los registros que tu colocas con EQU, puedes hacerlo con CBLOCK y la primer dirección donde se ubica... los otros se van incrementando solitos...
por ejemplo.... escribiste
PDel0 equ 0Ch
PDel1 equ 0Fh
PDel2 equ 0Dh
CONTA1 equ 0Eh
CONTA2 equ 0Fh
podrias hacer
CBLOCK H'0C'
PDel0 ;TOMA LA DIRECCION H'0C'
PDel1 ;TOMA LA DIRECCION H'0C' +1 ETC
PDel2
CONTA1
CONTA2
ENDC
-
Aaaaaahhhh !!!, ya veo ya!!. Pues es algo super práctico.
Es algo que como bien dices, puede ahorrar mucho trabajo y además evitar errores como el que cometí yo.
Intentaré utilizarlo así como me dices para cuando depure este proyecto o si no, para el siguiente. Según vaya de tiempo.
Muchas gracias !!!
Saludos.