# Sumador/ restador con 16f84



## darkngel (Abr 27, 2007)

Sera que alguien me puede ayudar con este problema?

Necesito realizar un circuito sumador/restador de 4 bits cada uno de la siguiente manera:
->los pines del puerto A seran la salida y visualizacion del acarreo/signo(en el caso del restador).
->los pies del puerto B selan los dos numeros de cuatro bits.
->un pin que determine si se suma o resta.
el problema es que ya ocupe los 13 pines y no se donde colocar el selector suma/resta
 Alguien me puede ayudar


----------



## Francisco Valdez (Abr 27, 2007)

Hola darkngel, si ya tienes definido que tu puerto A van a ser salidas y tu puerto B van a ser entradas, selecciona un bit del puerto A (por ejemplo, RA4), te recomendaría hacer una subrutina donde hagas solamente la revisión del estado del pin, deberás al inicio de la subrutina configurar ese bit como entrada, lo lees y luego lo regresas a configuración como salida. 

Espero te haya servido de algo,
cuida el RA4 ya que es de colector abierto....

Saludos


----------



## darkngel (Abr 27, 2007)

Gracias por la ayuda, pero necesito saber como hacer esa sub rutina ya que no tengo mucha idea para hacerlo, este es mi primer proyecto con este tipo de circuitos, si alguien tiene el codigo, se lo agradeceria mucho.


----------



## Francisco Valdez (Abr 27, 2007)

pasame lo que llevas hecho de programa....

Saludos


----------



## darkngel (Abr 27, 2007)

lo que pasa es que no se por donde empezar, no se como configurar el pin de seleccion, es mi primer proyecto, nunca he programado un pic.


----------



## Francisco Valdez (Abr 27, 2007)

darkngel te paso un programa, estudialo, le han de faltar algunos detalles, checalo y si tienes alguna pregunta no dudes en postear.

Saludos,


----------



## Francisco Valdez (Abr 27, 2007)

Te lo anexo en .doc porque en txt no guarda el formato y no se le entiende....

Saludos


----------



## Francisco Valdez (Abr 27, 2007)

darkngel, hay que corregir la subrutina de carga, le tienes que agregar la linea swapf NUMER,f después de cargarla en la variable, ahi te adjunto la subrutina como debe quedar....

carga		movf	PORTB,w		;Carga los dos números del puerto B
		andlw	0xF0		;Separa los 4 bit mas significativos
		movwf	NUMER		;los carga en DENOM=denominador
		swapf	NUMER,f
		movf	PORTB,w		
		andlw	0x0F		;Separa los 4 bits menos significativos
		movwf	DENOM		;los carga en NUMER=numerador
		return

pequeño detalle.......


----------



## darkngel (May 2, 2007)

Gracias, ademas aparte trate por mi cuenta de realizar este programa y me salio esto; quiza sea algo diferente, y largo, pero me siento bien de haber hecho mi primer programa, cualquier "pulidita" sera bien atendida:

;*********************************************************
;*	Programa aritmético de suma y resta	         *
;*	Configuración:                                   *
;*	->rb0-rb7 = entradas de los números num1 y num2  *			
;*	->ra0-ra4 = salidas/entradas divididas en dos formas:*
;*	  +->ra0 se utiliza para determinar si es resta  *
;*	  +->ra1 se utiliza para determinar si es suma   *
;*	  +->pero también serán las salidas de los leds  *
;*	Realizado por:                                   *
;*	          walter Rodriguez 20041078100    	 *
;*	                                                 *
;*********************************************************


listp=16f84
;declaración de variables
num1	equ	0x0c	
num2	equ	0x0d
aux	equ	0x0e
resu	equ	0x0f

		org   0x00
		goto inicio
		org   0x05

inicio		bsf   0x03,5    ;selección banco 1
		movlw 0xff	;11111111->W
		movwf 0x06	;configura puerto B como entrada

;configuración del puerto A
confi		movlw 0x1f	;11111->W
		movwf 0x05	;configura puerto A también como entrada temporal
		bcf   0x03,5    ;selección banco 0

;carga de los números a sumar o restar
carga		movf 0x06,0	;puertoB->W
		andlw 0x0f	;extraer primer numero
		movwf num1	;numero->num1
		movf 0x06,0	;puertoB->W
		andlw 0xf0	;extraer segundo numero
		movwf num2	;numero->num2
		swapf num2,1	;corregir nibbles
		movf 0x05,0	;puertoA->W
		movwf aux	;W->aux
		btfsc aux,0	;si el primer bit de aux = 1
		goto resta	;entonces vaya a resta
		btfsc aux,1	;sino, si el segundo bit de aux = 1
		goto suma	;entonces vaya a suma ,sino,
		goto carga	;vaya a carga y espere operación a realizar

;aqui se realiza la operación suma
suma		movf num1,0	;num1->W
		addwf num2,0    ;(W + num2)->W
		movwf resu	;W->resul
		goto resulta	;salte a resultado

;aqui se realiza la operación resta
resta		movf num1,0	;num1->W
		subwf num2,0	;(W - num2)->W
		movwf resu	;W->resul
		goto resulta	;salte a resulta

;aqui se configura el puerto a como salida para mostrar el resultado
;en los leds y se espera un cambio de bit de menor peso del primer numero para
;realizar una nueva operación.
resulta 	bsf 0x03,5	;selección del banco 1
		movlw 0x00	;00000->W
		movwf 0x05	;configura puerto A como salida
		bcf  0x03,5     ;selección banco 0
		movf resu,0	;res->W
		movwf 0x05	;salida a los leds

;Aqui se espera a que el usuario active el switch correspondiente al bit de
; menor peso del primer numero para poder realizar una nueva operación.
; Debe moverlo no importa si esta en 1 o 0, el objetivo es que cambie de estado 
; para que salga del bucle de espera,se raliza para dar una demora en la visualizacion 
;de los leds
espera		movf 0x06,0	;puertoB->W
		movwf aux	;se realiza para no cambiar
		movf num1,0	;la variable original
		xorwf aux,1 	;la xor es para determinar si cambio de estado el 1º bit
		btfss aux,0	 ;si =0 no hay cambio :: si =1 hubo cambio
		goto espera
		bsf  0x03,5     ;selección banco 1 para volver a configurar
		goto confi      ;el puerto a como entrada temporal
		end


----------



## darkngel (May 2, 2007)

pendon el garabato que se muestra arriba, aqui les envio el programa para que lo vean mejor


----------



## Francisco Valdez (May 2, 2007)

Felicidades darkngel, esta muy bien tu programa,

Si me permites hacerte solo 2 comentarios.

1. No es necesario incluir el org 0x05 en este programa, ya que no tienes ninguna subrutina escrita en ese espacio para inicializarla en esa posición.

2. Estas configurando todo el puerto A como entrada al inicio del programa y sabes, cuando declaras un bit como entrada forzosamente deberas conectarlo a 0V o Vcc, además solo el bit 0 es entrada b'00001'.

Saludos, y felicidades nuevamente


----------



## darkngel (May 2, 2007)

Francisco muchas gracias, y acerca de configurar todo el puerto A como entrada era solo para evitar que los leds de los otros 3 puertos no estuvieran encendidos en el momento de ingreso de los datos, pero creo que se puede evitar, gracias por hacerme caer en cuenta en ese pequeño error


----------



## snakewather (Mar 24, 2011)

Hola en mi post un colega compartio un programa que les puede servir todo esta en leer y checarlo bien es para 16F877 pero se puede migrar a 16F84 no es dificil.

El curso tambien aplica para el 16F84 solo recuerden las bases son las mismas los registros del pic son lo que cambian.

SALUDOS!!!!

https://www.forosdeelectronica.com/f24/curso-tutorial-pic16f877-12890/index5.html


----------



## SaulOmega (Mar 13, 2015)

Hola compañeros. Quiero, si es posible, que me ayuden a resolver el problema que tengo con este código que se supone sumará con una entrada en el puerto A y lo representará en el puerto B con LEDS, pero no sé qué hacer.
Ya intenté hacer el código pero me marca error y como soy nuevo en esto de mplab, no sé como resolverlos.

```
list p=16F84A
#include P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
equ 0x10 
org 0x00 
goto Inicio
org 0x05 
Inicio bsf STATUS,5
movlw 00h
movwf TRISB
bcf STATUS,5
movlw 0 
sublw 0x0F 
movwf ,Resultado 
movf ,Resultado,w
movwf PORTB
Stop nop 
nop
end
```
No sé que podría tener. Me dice en una parte que le hace falta un símbolo, pero no sé a que símbolo se refiere.

Por favor, ayúdenme.


----------



## D@rkbytes (Mar 13, 2015)

No tienes declarada la variable "Resultado", la puedes colocar en donde pusiste equ 0x10
Así: Resultado equ 0x10, y en el 16F84A puedes iniciar las variables desde 0x0C.
Entonces lo dejas así: Resultado equ 0x0C

También quita las primeras comas donde usas la variable "Resultado"
Y en ese programa estás realizando una resta, no una suma.
Puedes hacer por ejemplo:
movlw .5
addlw .10
Y por el puerto B debes obtener el número 15 en binario."00001111"

Como no estás usando la variable "Resultado" para otra cosa, puedes omitirla al igual que las instrucciones que la usan y mover el resultado que estará en el registro W, directamente al puerto B.


----------



## SaulOmega (Mar 15, 2015)

D@rkbytes dijo:


> No tienes declarada la variable "Resultado", la puedes colocar en donde pusiste equ 0x10
> Así: Resultado equ 0x10, y en el 16F84A puedes iniciar las variables desde 0x0C.
> Entonces lo dejas así: Resultado equ 0x0C
> 
> ...



entonces me va a sumar una variable 15 ejemplo pongo en el interruptor 1 se tiene que prender unos leds que indiquen que son 16 por que le suma 15


----------



## D@rkbytes (Mar 15, 2015)

Si. Y si ese PIC tuviera completo el puerto A, podrías sumar los 4 bits menos significativos con los 4 bits más significativos y mostrar el resultado por el puerto B.
Así ya no tendrías un valor constante para realizar la suma.

Otra opción sería guardar en una variable un primer valor MSB del puerto A, luego un segundo valor y después realizar la suma.


----------

