Ayuda con programación en ASM (PIC 16F84A)

Hola soy nuevo en los foros y también soy nuevo en la electrónica, me gustaría que me ayudaran con un error en el siguiente programa escrito para el PIC 16F84A en ASM
Código:
----------------------------------------------------------------------------------------------------------------------------------

       List       p = 16f84
	   include    "P16F84.INC"
	   
	   org 0x00
	   goto       Inicio
	   
	   org 0x05
	   
	   Inicio     
	              CONTADOR_01 equ 0x0C
                  RETRASO_01  equ 0x0D				  
	   
	              clrf   PORTB
	              bsf    STATUS,5
				  clrf   TRISB
				  movlw  b'00001111'
				  movwf  TRISA
				  bcf    STATUS,5
				  
	   Ciclo      movlw  b'00000000'
                  movwf  PORTB	   
       
	              btfsc  PORTA,1
				  goto   Secuencia_02
				  
				  btfsc  PORTA,2
				  goto   Secuencia_03
				  
				  btfsc  PORTA,3
				  goto   Secuencia_04
				  goto   Ciclo
				  
				  Secuencia_01
				        movlw   b'00000001'
						movwf   PORTB
						goto    Ciclo
				  
				  Secuencia_02
				        movlw   b'00000010'
						movwf   PORTB
						goto    Ciclo
				  
				  Secuencia_03
				        movlw   b'00000100'
						movwf   PORTB
						goto    Ciclo
						
				  Secuencia_04
				        movlw   b'00100000'
						movwf   PORTB
						movlw   #255
						movwf   RETRASO_01
						Tiempo_01
						       call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   decfsz RETRASO_01
							   goto   Tiempo_01
						
						movlw   b'01000000'
						movwf   PORTB
						movlw   #255
						movwf   RETRASO_01
						Tiempo_02
						       call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   decfsz RETRASO_01
							   goto   Tiempo_02
							   
						movlw   b'00001000'
						movwf   PORTB
						movlw   #255
						movwf   RETRASO_01
						Tiempo_03
						       call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   decfsz RETRASO_01
							   goto   Tiempo_03
							   
						movlw   b'00010000'
						movwf   PORTB
						movlw   #255
						movwf   RETRASO_01
						Tiempo_04
						       call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   decfsz RETRASO_01
							   goto   Tiempo_04
							   
						goto    Ciclo
				  
	   goto   Ciclo	

       Rutina_01  movlw   #255
	              movwf   CONTADOR_01
	              Retrasar   decfsz  CONTADOR_01,1
                  goto    Retrasar	
                  return		   
				  
	   end

---------------------------------------------------------------------------------------------------------------------------------

Este código se supone que va a servir para controlar un invernadero automatizado, en el establezco de RA0 a RA3 como puertos de entrada y todos los puertos de RB como salida. Las secuencias del 1 al 3 deben de reflejar las entradas de RA0 a RA2 en RB0 a RB2 respectivamente y la Secuencia_04 es para encender un motor a pasos. El problema que tengo es que una vez que RA0 se encuentra lo refleja en RB0 pero cuando lo bajo el LED de RB0 no cambia siempre se encuentra en alto.

Agradecería mucho su ayuda para solucionar este inconveniente, saludos.
 
Última edición por un moderador:
Gracias por tu respuesta, cuando lo estaba tratando de arreglarlo borre Secuencia_01 y donde verificaba RA0 y se me olvido volver a escribir lo de RA0. Haha que vergüenza. Aquí dejo el código completo de nuevo, el problema sigue siendo el mismo:

Código:
----------------------------------------------------------------------------------------------------------------------

       List       p = 16f84
	   include    "P16F84.INC"
	   
	   org 0x00
	   goto       Inicio
	   
	   org 0x05
	   
	   Inicio     
	              CONTADOR_01 equ 0x0C
                  RETRASO_01  equ 0x0D				  
	   
	              clrf   PORTB
	              bsf    STATUS,5
				  clrf   TRISB
				  movlw  b'00001111'
				  movwf  TRISA
				  bcf    STATUS,5
				  
	   Ciclo      movlw  b'00000000'
                  movwf  PORTB	   
				  
				  btfsc  PORTA,0
				  goto   Secuencia_01
       
	              btfsc  PORTA,1
				  goto   Secuencia_02
				  
				  btfsc  PORTA,2
				  goto   Secuencia_03
				  
				  btfsc  PORTA,3
				  goto   Secuencia_04
				  goto   Ciclo
				  
				  Secuencia_01
				        movlw   b'00000001'
						movwf   PORTB
						goto    Ciclo
				  
				  Secuencia_02
				        movlw   b'00000010'
						movwf   PORTB
						goto    Ciclo
				  
				  Secuencia_03
				        movlw   b'00000100'
						movwf   PORTB
						goto    Ciclo
						
				  Secuencia_04
				        movlw   b'00100000'
						movwf   PORTB
						movlw   #255
						movwf   RETRASO_01
						Tiempo_01
						       call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   decfsz RETRASO_01
							   goto   Tiempo_01
						
						movlw   b'01000000'
						movwf   PORTB
						movlw   #255
						movwf   RETRASO_01
						Tiempo_02
						       call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   decfsz RETRASO_01
							   goto   Tiempo_02
							   
						movlw   b'00001000'
						movwf   PORTB
						movlw   #255
						movwf   RETRASO_01
						Tiempo_03
						       call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   decfsz RETRASO_01
							   goto   Tiempo_03
							   
						movlw   b'00010000'
						movwf   PORTB
						movlw   #255
						movwf   RETRASO_01
						Tiempo_04
						       call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   decfsz RETRASO_01
							   goto   Tiempo_04
							   
						goto    Ciclo
				  
	   goto   Ciclo	

       Rutina_01  movlw   #255
	              movwf   CONTADOR_01
	              Retrasar   decfsz  CONTADOR_01,1
                  goto    Retrasar	
                  return		   
				  
	   end

-----------------------------------------------------------------------------------------------------------
¡Saludos!
 
Última edición por un moderador:
salu2 el problema es que al programar tenes que tener en cuenta todos los aspectos de los bits, lo que hiciste fue testear el entrada si habia un cero o un 1 y en base a eso poner en uno la salida correspondiente pero te falto el "que pasa si la entrada es cero?" segun tu programa seguia preguntando el estado de las demas entradas, pero antes tenias que "copiar " la entrada por mas que fuera cero, si recen empesas te aconsejo que leas el set de instrucciones ya que se te pueden facilitqar ciertas instrucciones , en el caso de tu programa las Bcf y Bsf que sirven para cambiar un solo bit de un registro (el puesto tambien es un registro)
te recomiendo el libro " Pic16f84a Desarrollo de proyectos de editorial rama" es muy bueno, sino hay tutoriales muy simples y buenos en internet o enste mismo foro.
aca te dejo con lo que para mi es el problema

Código:
List       p = 16f84
	   include    "P16F84.INC"
 
	   org 0x00
	   goto       Inicio
 
	   org 0x05
 
	   Inicio     
	              CONTADOR_01 equ 0x0C
                  RETRASO_01  equ 0x0D				  
 
	              clrf   PORTB
	              bsf    STATUS,5
				  clrf   TRISB
				  movlw  b'00001111'
				  movwf  TRISA
				  bcf    STATUS,5
 
	   Ciclo      movlw  b'00000000'  ; aca emppieza tu programa
                  movwf  PORTB	   
 
				  btfsc  PORTA,0       ; me fijo si porta,0 esta en 1 si esta en 0 se saltea el goto secuencia1
				  goto   Secuencia_01
 ;aca yo agregaria
bcf       portb,0 ; ya que reflejo que hay un 0 en la entrada , pongamos un cero en la salida
; ya que si solo reflejas los 1 estas en problemas¿¿

	              btfsc  PORTA,1
				  goto   Secuencia_02
 bcf    portb,1    ;  pongo a cero bit1 del porb
				  btfsc  PORTA,2
				  goto   Secuencia_03
 bcf    portb,1    ;  pongo a cero bit2 del porb
				  btfsc  PORTA,3
				  goto   Secuencia_04
				  goto   Ciclo
 
				  Secuencia_01
				        movlw   b'00000001'
						movwf   PORTB
; las dos lineas anteriores se pueden reemplazar por: Bsf portb,0
						goto    Ciclo
 
				  Secuencia_02
				        movlw   b'00000010'
						movwf   PORTB
; las dos lineas anteriores se pueden reemplazar por: Bsf portb,1
						goto    Ciclo
 
				  Secuencia_03
				        movlw   b'00000100'
						movwf   PORTB
; las dos lineas anteriores se pueden reemplazar por: Bsf portb,2
						goto    Ciclo
 
				  Secuencia_04
				        movlw   b'00100000'
						movwf   PORTB
						movlw   #255
						movwf   RETRASO_01
						Tiempo_01
						       call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   decfsz RETRASO_01
							   goto   Tiempo_01
 
						movlw   b'01000000'
						movwf   PORTB
						movlw   #255
						movwf   RETRASO_01
						Tiempo_02
						       call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   decfsz RETRASO_01
							   goto   Tiempo_02
 
						movlw   b'00001000'
						movwf   PORTB
						movlw   #255
						movwf   RETRASO_01
						Tiempo_03
						       call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   decfsz RETRASO_01
							   goto   Tiempo_03
 
						movlw   b'00010000'
						movwf   PORTB
						movlw   #255
						movwf   RETRASO_01
						Tiempo_04
						       call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   call   Rutina_01
							   decfsz RETRASO_01
							   goto   Tiempo_04
 
						goto    Ciclo
 
	   goto   Ciclo	
 
       Rutina_01  movlw   #255
	              movwf   CONTADOR_01
	              Retrasar   decfsz  CONTADOR_01,1
                  goto    Retrasar	
                  return		   
 
	   end
saludos y espero que te haya servido



ahh me olvidaba¿¿¿¿¿¿¿¿ la parte despues de ciclo :
Ciclo movlw b'00000000' ; aca emppieza tu programa
movwf PORTB
esta parte borrala¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
 
Última edición por un moderador:
Hola y gracias por la respuesta. La solución que me sugieres ya la había intentado al principio de la etiqueta "Ciclo" de la siguiente manera:

--------------------------------------------------------------------------------------------------------------

movlw b'00000000' ;Aquí limpio el registro W
movwf PORTB ;Aquí pongo todos los RB's en 0's porque se supone que copia lo que hay en W ¿no?
--------------------------------------------------------------------------------------------------------------

¿Hay algo malo en hacerlo de esta manera en lugar de poner cada bit en 0 individualmente? En todo caso también intente tu solución exacta con bcf PORTB,0 y RB0 siempre sigue en alto.

También quisiera preguntar si hay alguna forma de poder reflejar las entradas en las salidas al mismo tiempo (es decir mi programa original solo puede realizar una secuencia a la vez) sin la necesidad de crear una secuencia para cada combinación posible (sin tener que agregar en mi código Secuencia_04, Secuencia_05, Secuencia_N), algún ejemplo sería de bastante utilidad.

Otra duda que tengo es que en varios ejemplos de internet los 'delays' en el PIC se realizan con el registro WDT con retrasos de medio segundo, un segundo y hasta dos segundos y medio (cosa que me parece más sencilla que andar calculando cuantas veces tengo que ciclar instrucciones para obtener el tiempo que deseo) . Yo en mi programa los realizo con la subrutina ya que según leí el PIC 16F84A tarda un milisegundo en realizar cada instrucción con un cristal a 4Mhz. Un ejemplo sencillo y claro sería infinitamente apreciado.

Finalmente desearía que alguien podría recomendarme algún tutorial para controlar un display LCD y un teclado matricial con este mismo PIC. Esto y todo lo anterior si fuera posible con indicaciones "for dummies" ya que no conozco mucho de esto y el profesor que me imparte la materia no me ha podido dar mucha orientación sobre el tema.

¡Saludos!
 
la manera mas facil de copiar el puerto a en el b seria directamente leyendolo y copiandolo(redundante no?) algo como esto

movf PORTA,W ; COPIO EL REGISTRO EN W
movwf PORTB

de esta manera copias todo el a en el b

con el tema de las temporizaciones, yo ya no calculo los ciclos de un bucle para hacer un retardo, yo uso un programita que no se de donde lo saque pero me sirve mucho

Ver el archivo adjunto calcular_retardos.zip

espero te sirva
 
Gracias por el programa. Ya solucione el problema de RB0 siempre en alto (era un problema con mi circuito y no con el código). Aquí dejo el código por si a alguien le sirve:

Código:
   List      p = 16F84
   include   "P16F84.INC"   
   
   org       0x00
   goto      Inicio
   org       0x05
   
   Inicio
             CONTADOR_01  equ 0x0C
			 RETRASO_01   equ 0x0D
			 
			 clrf   PORTB
             bsf    STATUS,RP0
             clrf   TRISB
             movlw  b'00011111'
             movfw  TRISA
             bsf    OPTION_REG,7
             bcf    STATUS,RP0

   Ciclo   
             clrf   PORTB
             movlw  b'00000000'

             btfsc  PORTA,0
			 goto   Accion_00
			 bcf    PORTB,0
			 
		Comprobacion_00 	 
			 btfsc  PORTA,1
			 goto   Accion_01
			 bcf    PORTB,1
			 
		Comprobacion_01		
			 btfsc  PORTA,2
			 goto   Accion_02
			 bcf    PORTB,2
			 
		Comprobacion_02	 
			 btfsc  PORTA,3
			 goto   Accion_03
			 bcf    PORTB,3
			 bcf    PORTB,4
			 bcf    PORTB,5
			 bcf    PORTB,6
			 
			 goto   Ciclo
			 
			 Accion_00
			       bsf   PORTB,0
				   goto  Comprobacion_00
				   goto  Comprobacion_01
				   goto  Comprobacion_02
				   
			 Accion_01
                   bsf   PORTB,1
                   goto  Comprobacion_01
				   goto  Comprobacion_02

             Accion_02
                   bsf   PORTB,2
                   goto  Comprobacion_02
				   
             Accion_03			
                   bsf   PORTB,5
                   movlw #255
                   movwf RETRASO_01
				   Tiempo_00
				         call   Rutina_01
						 call   Rutina_01
						 call   Rutina_01
						 call   Rutina_01
						 call   Rutina_01
						 decfsz RETRASO_01
						 goto   Tiempo_00
				   bcf   PORTB,5
						 
				   bsf   PORTB,6
                   movlw #255
                   movwf RETRASO_01
                   Tiempo_01 	
                         call   Rutina_01
                         call   Rutina_01
 						 call   Rutina_01
						 call   Rutina_01
						 call   Rutina_01
						 decfsz RETRASO_01
						 goto   Tiempo_01
				   bcf   PORTB,6	
						 
				   bsf   PORTB,3
				   movlw #255
				   movwf RETRASO_01
				   Tiempo_02
				         call   Rutina_01
                         call   Rutina_01
 						 call   Rutina_01
						 call   Rutina_01
						 call   Rutina_01
						 decfsz RETRASO_01
						 goto   Tiempo_02
				   bcf   PORTB,3
				   
				   bsf   PORTB,4
				   movlw #255
				   movwf RETRASO_01
				   Tiempo_03
				         call   Rutina_01
                         call   Rutina_01
 						 call   Rutina_01
						 call   Rutina_01
						 call   Rutina_01
						 decfsz RETRASO_01
						 goto   Tiempo_03				                              
                  				   
			       goto  Ciclo
				   
             Rutina_01  
			       movlw     #255
	               movwf     CONTADOR_01
	               Retrasar  decfsz  CONTADOR_01,1
                   goto      Retrasar	
                   return		   
				   
	   end
 
Atrás
Arriba