# Errores con mi programacion de asm en pic18



## Alexdro7 (Abr 12, 2009)

tengo un problema con mi programacion en ensamblador, ya que no logro enlazar los puertos A y D de mi programa, osea que no puedo usar como entrada el puerto a y esperar que el puerto d me responda, no logro hacer eso, ya cheke mucho mi programa y con un simulador, y no encuentro el error, por favor ayudenme con  esto, aqui dejo la programacion que hize, gracias



```
LIST P=18F452
	#include <p18f452.inc>


	
	#DEFINE DERECHA			PORTD,0		; 
	#DEFINE IZQUIERDA   	PORTD,1  	; 
	#DEFINE SINTRACCION  	PORTD,2	    ; 
	
	
	ORG 0				;Empieza desde resposo
	GOTO	PRINCIPAL		;Nos vamos a la funcion 'PRINCIPAL'

; Establecimiento de constantes

STATUS	equ	0XFD8	; Damos nombre al registro del stetus del PIC18
TRISA	equ	0XF92
PORTA	equ 0XF80
TRISD	equ	0XF95
PORTD	equ	0XF83

	SETF TRISA
	SETF TRISD
;
;/////////////////////////////////////////dECLARA sALIDAS Y eNTRADAS
PRINCIPAL
			bsf		STATUS,Z
			movlw	b'00000000'
			movwf	TRISD
			movlw	b'11111111'
			movwf	TRISA
			bcf		STATUS,Z

INICIO		
			xorlw 	B'00000001'
			XORWF	PORTA,W
			BTFSC	STATUS,Z
			GOTO 	MOVERDERECHA
			
					
			xorlw 	B'00000010'
			XORWF	PORTA,W
			BTFSC	STATUS,Z
			GOTO 	MOVERIZQUIERDA
	
						
			xorlw 	B'00000000'
			XORWF	PORTA,W
			BTFSC	STATUS,Z
			GOTO 	MOVERSINTRACCION
	
							
			xorlw 	B'00000011'
			XORWF	PORTA,W
			BTFSC	STATUS,Z
			GOTO 	MOVERSINTRACCION
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

MOVERDERECHA	

			bsf		DERECHA
			bcf		IZQUIERDA
			bcf		SINTRACCION
			goto 	INICIO

MOVERIZQUIERDA
	
			bsf		IZQUIERDA
			bcf		DERECHA
			bcf		SINTRACCION
			goto 	INICIO

MOVERSINTRACCION

			bcf		IZQUIERDA
			bcf		DERECHA
			bsf		SINTRACCION
			goto	INICIO
			end
```


Muchas gracias


----------



## Albert 1001 (Abr 12, 2009)

Hola, soy nuevo en este foro y es mi primer mensaje, bueno espero poder ayudar.

Te mostrate solo la parte que he modificado, bueno yo sustituiria los primeros xorlw de cada comparacion de la siguiente forma:

movlw B'00000001' para que en W quede el valor de 00000001 porque si ejecutamos un xorlw lo que queda en W es 11111110, y para q se vaya a MOVERDERECHA en PORTA tendria q estar 11111110, por eso lo cambie por un movlw, lo mismo para las siguientes comparaciones.

INICIO
*movlw B'00000001'*
XORWF PORTA,W
BTFSC STATUS,Z
GOTO MOVERDERECHA


*movlw B'00000010'*
XORWF PORTA,W
BTFSC STATUS,Z
GOTO MOVERIZQUIERDA


*movlw B'00000000'*
XORWF PORTA,W
BTFSC STATUS,Z
GOTO MOVERSINTRACCION


*movlw B'00000011'*
XORWF PORTA,W
BTFSC STATUS,Z
GOTO MOVERSINTRACCION
*goto	INICIO  *

en esta parte le agregue un goto INICIO para que sigua haciendo las comparacione porque de lo contrario en este punto se ejecutaria MOVERDERECHA.

bueno esas son las modificaciones que le he hecho espero te funcione, cualquier cosa aqui estamos.[/b]


----------



## karl (Abr 15, 2009)

un par de dudas:
1, ya lo probaste en una entrenadora?, de ser asi, puedes ver si tus pines de salida se energizan, con lo que descartarias un problema de programación (o si usas MPLAB configura el MP SIM pide la ventana de watch para el PORT D y los sensores, pide el watch del PORT en binario pa que sea mas facil entenderle)

2, usas el TRIS como un registro independiente al PORT, y a la hora de configurar el PORT, cambias el banco prendiendo el bit RP de STATUS, y haces el cambio en TRIS, ¿estas seguro de que cambias el TRIS con este procedimiento?, yo normalmente uso el mismo registro PORT, ya que al cambiar el registro el PORT direcciona al TRIS, Tal vez, (yo no he usado la serie 18 de PIC), estas direccionando un PORT por mover tu registro de banco.

3, ¿que control de motor usas?, Asumiendo que lo que dije antes no sea la causa, tal vez el error sea la forma en que controlas el motor, lo que quiero decir es que si tienes un L293 por ejemplo, y conectas MOVERSINTRACCION al pin Enable, apagas el driver cuando quieres que se mueva, lo cual no va a funcionar, en este caso tienes que revisar tu hardware para ver si no tienes que invertir el valor de esta bandera.


----------



## Alexdro7 (Abr 16, 2009)

Respuestas:
1) El puente H lo estamos usando con 2 senales digitales en 2 entradas y un motor de CD en la salida conectado por dos terminales de salidas,
2) Que cundo exista un 1 en alguna salida y un cero en la otra gira ya sea izquierda o derecha, y vicervesa.
3)El Proteus te permite usar todos los componentes que estoy usando para simularlo.


NOTA, hice mis correcciones de acuerdo al comentario de betosnake y no  me jalo.


----------



## karl (Abr 17, 2009)

las modificaciónes de betosnake no las entiendo, hacer un XOR solo apaga los bits que esten en 1 en ambos registros, y si hay un uno en uno y cero en el otro, el resultado tiene un 1 asi:
puerto       00001010
registro     00000011
resultado  00001001

lo mas sencillo es como tu lo tenias prender directamente los BITS en el registro.

una posible depuración es cambiar en tu simulación la salida del integrado por LEDs y ver si estos prenden (chance y el error esta en la configuración del puerto o el driver)

otra pregunta, ¿esto es correcto?

  ORG 0            ;Empieza desde resposo (aquí se pone el apuntador en el registro 0)
   GOTO   PRINCIPAL      ;Nos vamos a la funcion 'PRINCIPAL' (esta instrucción te manda a principal)

; Establecimiento de constantes (y creo que el programa no lee nada de esto)

STATUS   equ   0XFD8   ; Damos nombre al registro del stetus del PIC18
TRISA   equ   0XF92
PORTA   equ 0XF80
TRISD   equ   0XF95
PORTD   equ   0XF83

   SETF TRISA
   SETF TRISD
;
;/////////////////////////////////////////dECLARA sALIDAS Y eNTRADAS
PRINCIPAL (hasta aqui, saltandose las asignaciones del programa)

         bsf      STATUS,Z
         movlw   b'00000000'
         movwf   TRISD
         movlw   b'11111111'
         movwf   TRISA
         bcf      STATUS,Z

INICIO      

yo siempre pongo la etiqueta ORG despues de las declaraciónes, y el vector en el que inicio si no hay interrupciones es el 0x70 (las interrupciónes se encuentran en el 0x40 en los micros que he trabajado), si hay interrupciones pongo la etiqueta en 0x00 para que brinque a 0x70 (un goto inicio en 0x00 y la etiqueta inicio despues de un ORG 0x70)

Por otro lado, estas usando los INCLUDE, que te ahorran el definir un monton de campos, así que la configuración puede ser trivial.


----------



## pfreymuth (Mar 30, 2010)

no has iniciado bien el puerto A....  ADCON1


----------

