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

Temas similares

27/04/2007 #1


Sumador/ restador con 16f84
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
27/04/2007 #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
27/04/2007 #3


sumador restador
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.
27/04/2007 #4


pasame lo que llevas hecho de programa....

Saludos
27/04/2007 #5


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.
27/04/2007 #6


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

Saludos,
Archivos Adjuntos
Tipo de Archivo: txt sumaresta_587.txt (1,7 KB (Kilobytes), 734 visitas)
27/04/2007 #7


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

Saludos
Archivos Adjuntos
Tipo de Archivo: doc sumaresta_133.doc (27,0 KB (Kilobytes), 479 visitas)
27/04/2007 #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.......
02/05/2007 #9


pic 16f84 suma/resta
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
02/05/2007 #10


correcion
pendon el garabato que se muestra arriba, aqui les envio el programa para que lo vean mejor
Archivos Adjuntos
Tipo de Archivo: doc sumaresta_642.doc (23,0 KB (Kilobytes), 359 visitas)
02/05/2007 #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
02/05/2007 #12


conclusion
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
24/03/2011 #13

Avatar de snakewather

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!!!!

Curso tutorial del PIC16F877
13/03/2015 #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.
13/03/2015 #15
Moderador

Avatar de D@rkbytes

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.
15/03/2015 #16


D@rkbytes dijo: Ver Mensaje
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
15/03/2015 #17
Moderador

Avatar de D@rkbytes

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.
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.