Отговори на тема  [ 6 мнения ] 
Преобразуване на типове данни 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение Преобразуване на типове данни
HCL преди време пусна подобна тема,но питането ми е в друга насока и за това отварям нова.Кода на програмата е следния:

#define XTAL_FREQ 36MHZ
#define _MAIN_C
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stddef.h>
#include <pic18.h>
#include "delay.h"
__CONFIG(1,HS & FCMDIS & IESODIS);
__CONFIG(2,VREGDIS & PWRTDIS & BORDIS & WDTDIS & WDTPS32K);
__CONFIG(3,CCP2RC1 & PBADDIS & LPT1DIS & MCLREN);
__CONFIG(4,STVREN & LVPDIS & XINSTDIS & DEBUGDIS & ICPORTDIS);
__CONFIG(5,UNPROTECT);
__CONFIG(6,UNPROTECT);
__CONFIG(7,UNPROTECT);
static bit LED0 @ ((unsigned)&PORTE*8+0);
static bit LCD_RS @ ((unsigned)&PORTB*8+4); // Register select
static bit LCD_RW @ ((unsigned)&PORTB*8+5); // Register select
static bit LCD_EN @ ((unsigned)&PORTB*8+6); // Enable


void LCD_STROBE(void){
LCD_EN = 1;
asm("nop");
asm("nop");
LCD_EN = 0;
}

void lcd_init(void)
{
int pr;
LCD_RW=0;
LCD_RS = 0; // write control bytes
DelayUs(20); // power on delay
pr=0x30;
//--------------------------------------------------
PORTB=(0x0f&(pr>>4));
LCD_STROBE();
PORTB=(0x0f&(pr));
LCD_STROBE();
DelayMs(5);
//--------------------------------------------------
pr=0x30;
PORTB=(0x0f&(pr>>4));
LCD_STROBE();
PORTB=(0x0f&(pr));
LCD_STROBE();
DelayUs(150);
//--------------------------------------------------
pr=0x30;
PORTB=(0x0f&(pr>>4));
LCD_STROBE();
PORTB=(0x0f&(pr));
LCD_STROBE();
DelayUs(50);
//--------------------------------------------------
pr=0x20;
PORTB=(0x0f&(pr>>4));
LCD_STROBE();
PORTB=(0x0f&(pr));
LCD_STROBE();
DelayUs(50);
//---------------------------------------------------
pr=0x28;
PORTB=(0x0f&(pr>>4));
LCD_STROBE();
PORTB=(0x0f&(pr));
LCD_STROBE();
DelayUs(50);
//----------------------------------------------------
pr=0x0C;
PORTB=(0x0f&(pr>>4));
LCD_STROBE();
PORTB=(0x0f&(pr));
LCD_STROBE();
DelayUs(50);
//----------------------------------------------------
pr=0x01;
PORTB=(0x0f&(pr>>4));
LCD_STROBE();
PORTB=(0x0f&(pr));
LCD_STROBE();
DelayUs(50);
//----------------------------------------------------
pr=0x06;
PORTB=(0x0f&(pr>>4));
LCD_STROBE();
PORTB=(0x0f&(pr));
LCD_STROBE();
DelayMs(5);
//----------------------------------------------------
pr=0x80;
PORTB=(0x0f&(pr>>4));
LCD_STROBE();
PORTB=(0x0f&(pr));
LCD_STROBE();
DelayUs(50);
}


void lcd_write(unsigned char c)
{

LCD_RW=0;
PORTB=(0x0f&(c>>4));
LCD_RS=1;
LCD_STROBE();
PORTB=(0x0f&(c));
LCD_RS=1;
LCD_STROBE();
DelayUs(40);
}
void lcd_poz(unsigned char c)
{

LCD_RW=0;
LCD_RS=0;
PORTB=(0x0f&(c>>4));
LCD_STROBE();
PORTB=(0x0f&(c));
LCD_STROBE();
DelayUs(40);
}

void lcd_puts(const char * s)
{
LCD_RW=0;
LCD_RS = 1;
while(*s)
lcd_write(*s++);
}

void lcd_clear(void)
{
LCD_RW=0;
LCD_RS = 0;
lcd_write(0x1);
DelayMs(2);
}

void main(void)
{
char outString[4];
int count;
float d;

lcd_init();
lcd_clear();
lcd_poz(0xC1);


count=2;

pr1=0x037f; //895:80=11.18

d = (pr1/0x50);
sprintf(outString,"%4.2f",d);
lcd_puts(outString);


while(count>1){
asm("nop");
}
}


Това което е с червен цвят ми прави проблема ,а именно:би трябвало резултата изписван на LCD то да е 11.18,но се изписва само 11.00.Не мога да си открия грешката.LCD-то се инициализира правилно и работи и предполагам че не е там проблема.Някой може ли да даде съвет или да ми посочи грешката?


Съб Апр 21, 2007 11:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
това pr1 не го виждам какво е !

но:

(pr1/0x50) си е целочислено деление т.е дава 11 а не 11.18 (чак после става float!)

промени го на
(pr1/(float)0x50) за да си го смята като флоат !


Нед Апр 22, 2007 12:16 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Май 27, 2006 12:37 pm
Мнения: 647
Местоположение: с. Згалево
Мнение 
void main(void)
{
char outString[4];
int count;
float d;

lcd_init();
lcd_clear();
lcd_poz(0xC1);


count=2;

pr1=0x037f; //895:80=11.18

d = (pr1/0x50);
sprintf(outString,"%4.2f",d);
lcd_puts(outString);

while(count>1){
asm("nop");
}
}

На пръв погллед виждам 1 сигурна грешка и една евентуална:
Грешката:
Големината на масива outString не е достатъчна да събереш такъв стринг. Трябват ти поне 4 места за цифрите + точката + още 1 за нулата на края. Значи в твоя случай поне 6 - outString[6]. Ако се гледа какво си написал в sprintf, най добре направи масива да е с големина 8.
Не е ясно какво е pr1. Ако е декларирано като float не би трябвало да има проблеми - ама ако не е...

Пробвай да присвоиш направо на d някаква float стойност и да видиш дали изпива правилно.


Нед Апр 22, 2007 12:17 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
ps66 написа:
това pr1 не го виждам какво е !

но:

(pr1/0x50) си е целочислено деление т.е дава 11 а не 11.18 (чак после става float!)

промени го на
(pr1/(float)0x50) за да си го смята като флоат !


За по-сигурно (float)pr1/(float)0x50 :D


Нед Апр 22, 2007 12:29 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение 
В темата която пуснах, грешката льсна в асемблера. Добре е да гледаш какво излиза от компилатора, особено ако като мен нямаш много опит с С-то :)


Нед Апр 22, 2007 4:04 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Работата стана както каза Рек - (float)pr1/(float)0x50 и резултата си заспа. Благодаря за съветите :)


Нед Апр 22, 2007 9:25 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 10 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни