Sumador/ restador con 16f84

#1
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
 
#2
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
 
#3
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.
 
#8
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.......
 
#9
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
 
#11
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
 
#12
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
 
#14
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.
Código:
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.
 
Última edición por un moderador:
#15
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.
 
#16
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.
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
 
#17
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.
 

Temas similares

Arriba