Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Преобразуване на типове данни
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=4086
Страница 1 от 1

Автор:  Ки4о [ Съб Апр 21, 2007 11:53 pm ]
Заглавие:  Преобразуване на типове данни

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-то се инициализира правилно и работи и предполагам че не е там проблема.Някой може ли да даде съвет или да ми посочи грешката?

Автор:  ps66 [ Нед Апр 22, 2007 12:16 am ]
Заглавие: 

това pr1 не го виждам какво е !

но:

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

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

Автор:  juzisound [ Нед Апр 22, 2007 12:17 am ]
Заглавие: 

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:29 am ]
Заглавие: 

ps66 написа:
това pr1 не го виждам какво е !

но:

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

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


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

Автор:  HCL [ Нед Апр 22, 2007 4:04 am ]
Заглавие: 

В темата която пуснах, грешката льсна в асемблера. Добре е да гледаш какво излиза от компилатора, особено ако като мен нямаш много опит с С-то :)

Автор:  Ки4о [ Нед Апр 22, 2007 9:25 am ]
Заглавие: 

Работата стана както каза Рек - (float)pr1/(float)0x50 и резултата си заспа. Благодаря за съветите :)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/