Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

12/10/2011 #1


Programa en assembler pic16f877a
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:
Código:
	__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 xD.

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


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

Código:
	
	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
12/10/2011 #3


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?
12/10/2011 #4


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..
13/10/2011 #5


Muchas gracias por su ayuda le estoy muy agradecido .
28/10/2011 #6


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.
28/10/2011 #7


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
28/10/2011 #8

Avatar de Gudino Roberto duberlin

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
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.