# Programa en assembler pic16f877a



## timh (Oct 12, 2011)

Hola buenos días, quisiera pedirles un poco de ayuda para hacer un programa en assembler para el pic16f877a que haga lo siguiente.
- Establecer una patita que sea una entrada y una que sea una salida.
- En la salida lleva un led el cual debe prender cuando la entrada este alta y apagarse cuando pase a baja.
- El alto y bajo en la entrada se controla por un dip switch

Ya le estuve intentando mucho tiempo pero la verdad no hago que me funcione el programa, el programa que hice es este:

```
__CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF
	LIST P=16F877A
	INCLUDE <P16F877A.INC>
	RADIX HEX
;************Programa principal****************;
RESETEO:	ORG 0x00
			GOTO INICIO
			GOTO 0x05
;***************INICIO**********************;
INICIO: BCF STATUS,RP0; USAMOS EL BANCO 1 DE LA MEMORIA
        BCF STATUS,RP1; ponemos a rp1 en cero
        CLRF PORTB; limpiamos el resgistro del puerto a para no tener basura
        BSF STATUS,RP0;accede al banco uno donde esta tris a
        MOVLW b'00000001'; 
        MOVWF TRISB;configuramos a ra0-ra1 como entrada y ra2-ra5 como salidas
        BCF STATUS,RP0;ACCEDE BANCO 0
        CALL PREGUNTA
		goto INICIO

PREGUNTA: BTFSS PORTB,0; ES 0?
		  goto LED_APAGADO
		  GOTO LED_ENCENDIDO
		  goto PREGUNTA

LED_ENCENDIDO: BSF PORTB,1

LED_APAGADO: BCF PORTB,1           
END
```

Pero no se porque razón no funcione, recien empiezo mi curso de microcontroladores y apenas le voy agarrando ganas a esto del ensamblador .

Les dejo también mi simulación en el proteus para que se den mas o menos una idea de lo que estoy realizando-


----------



## Trev (Oct 12, 2011)

Hola..esta bastante bien tu programita (las etiquetas deben estar tal cual)..yo lo dejaria asi:


```
LIST P=16F877A
	INCLUDE <P16F877A.INC>
             __CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF
	
;************Programa principal****************;
RESETEO:	ORG 0
	             GOTO INICIO
	             GOTO 5
;***************INICIO**********************;
INICIO                 BSF STATUS,RP0   ;USAMOS EL BANCO 1 DE LA MEMORIA
                          MOVLW b'00000001' 
                          MOVWF TRISB      ;configuramos a rb0 entrada y rb1 como salida..
                          BCF STATUS,RP0  ; ACCEDE BANCO 0

LOOP                   CALL PREGUNTA
		goto LOOP

PREGUNTA            BTFSS PORTB,0    ; ES 0?
		goto LED_APAGADO
		goto LED_ENCENDIDO
                          return
		

LED_ENCENDIDO    BSF PORTB,1
GOTO                  LOOP
return
LED_APAGADO      BCF PORTB,1
return
```

Pruebalo asi igualmente yo hace mucho que no uso asembler uso C sino funciona lo pruebo en asm..salu2


----------



## timh (Oct 12, 2011)

Orales man funciona a la perfección muchas gracias por tu ayuda , sino es mucha molestia me podrias decir donde la estaba regando? o algunos consejos que me puedas dar sobre mi programa en lo que pueda mejorar?


----------



## Trev (Oct 12, 2011)

Hola..faltaban los return o cualquier otra instruccion que cargue el PC (contador de programa) con la dirección de memoria de programa a la que "apuntaba" justo antes de hacer la llamada a determinada subrutina, recuerda que esta dirección se memoriza en el stack o pila que le sirve de "mapa" al pic para "recordar" que instruccion ejecutaba justo antes de hacerse la llamada..salu2 me alegro que te haya servido..


----------



## timh (Oct 13, 2011)

Muchas gracias por su ayuda le estoy muy agradecido .


----------



## Zankoku (Oct 28, 2011)

un poco tarde pero aca te mando unos tips, para cambiar al banco uno debes hacerlo de la siguiente manera bsf STATUS,RP0 , en tu caso usaste un bcf en lugar de bsf, por eso nunca se direccionó al banco 1, otra cosa el registro tris te sirve para configurar los puertos como i/o, mientras que el registro portb te sirve para configurar el estado inicial de los puertos.
como recomendación, te diria que separes tu configuración de puertos de tu programa principal, bueno eso me ayuda a mi para no tener confusiones con mis puertos de i/o.


----------



## juan47 (Oct 28, 2011)

Hola buenos dias 
Perdonar mi intromision, el programa funcionaria si en las etiquetas siguientes se pusiera un 
RETURN para volver a la etiqueta PREGUNTA.
En este caso se efectua un salto de programa y como no se pone un RETURN el programa llega al END y se detiene.

LED_ENCENDIDO: BSF PORTB,1

LED_APAGADO: BCF PORTB,1  
END

Deberias de poner

LED_ENCENDIDO: BSF PORTB,1
                          RETURN

LED_APAGADO: BCF PORTB,1 
                      RETURN

             END

Si que se efectua el cambio de banco y la configuracion de TRISB

  BSF STATUS,RP0;accede al banco uno donde esta tris a
        MOVLW b'00000001'; 
        MOVWF TRISB

Espero ser de ayuda y no entorpecer en demasia 

Un saludo 
             Juan


----------



## Gudino Roberto duberlin (Oct 28, 2011)

Hola Amigo timh, bueno no puedo abrir el documento que subiste, pero usas el pin RESET del Pic?, o desactiva la funcion con MCLR_OFF


----------

