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

Temas similares

14/04/2014 #1


Manejo de bits en CCS con PIC16F877A
Bueno, gente de Foros de Electrónica. ¿Qué tal?

La cosa es así.
Lo que pasa es que estoy realizando un programa en ccs de un sumador de datos.

El ejercicio es este:
Lea un dato por el puerto C y otro dato por el puerto B.
Realice la suma de los 8 bits (tomados como números con signo) y visualice el resultado en una LCD solamente cuando se presione un pulsador conectado en A1.
En el LCD se muestra el mensaje “Sumador PIC” centrado en el segundo renglón, mientras que el primer renglón muestra la operación matemática con los signos adecuados, por ejemplo “45 + 134 = 179” ó “-23 + 40 = 17”, considerando que cada dato puede ser positivo ó negativo.

El programa que he realizado es este:

Código:
#include <16f877A.h>
#use delay (clock=4Mhz)
#fuses XT,NOWDT
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#include <lcd.c>  //DISPLAY EN PUERTO D

void main(){

lcd_init();
set_tris_c(0xff); //DATOS 1
set_tris_b(0xff); //DATOS 2
set_tris_a(0x02); //ENTRADA PULSADOR

while(true){

int dato_1 = input_c();
int dato_2 = input_b();
int pulsador=input(pin_a1);

if(pulsador==1){
lcd_gotoxy(4,2);
printf(lcd_putc,"Sumador PIC");
lcd_gotoxy(2,1);
printf(lcd_putc,"%4d",dato_1);
lcd_gotoxy(6,1);
printf(lcd_putc,"+",);
lcd_gotoxy(7,1);
printf(lcd_putc,"%4d",dato_2);
lcd_gotoxy(11,1);
printf(lcd_putc,"=");
lcd_gotoxy(12,1);
printf(lcd_putc, "%4d",(dato_1+dato_2));
}
}
}
El hecho es que, %d va con un rango desde -128 hasta 127 y como son dos datos, si quiero sumar -128+(-96) da un error porque sobrepasa el rango de datos en %d, igualmente pasa si quiero sumar positivos 127+8= da un número que no es.

Una solución que me dieron fue esta:
En los casos de sobrepasar el limite de un entero sin signo o con signo, el resultado debe guardarse en una variable de mayor cantidad de bits int16 por ejemplo (el rango es mucho más amplio) y para mostrar el resultado se usa %lu (entero largo sin signo) ó %ld (entero largo con signo).

Lo que pasa es que no sé como hacer la variable int16 y si escribo %ld en ccs me aparece error.
Adjunto dos imágenes de la simulación con error tanto negativo como positivo.

Ojala que me hayan entendido y me puedan ayudar.
Gracias.
15/04/2014 #2

Avatar de JoaquinFerrero

Antes debes decidir qué debe pasar cuando el resultado sobrepasa los 8 bits.

Los dos resultados que muestras son debidos precisamente a eso.

-128 + -128 = 0b1000 0000 + 0b1000 0000 =
-256 = 0b1 0000 0000

Como el resultado debe entrar en 8 bits, al final queda 0.

De la otra:
64 + 80 = 0b0100 0000 + 0b0101 0000 =
144 = 0b1001 0000

Pero como es superior a 127, pasa al terreno de los negativos, así que 0b1001 0000 = -112

Según lo que decidas, declararás las variables como int8 o int16. O decidir qué hacer en caso de llegar a los extremos -127+128.
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.