|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 10:07 pm
|
Страница 1 от 1
|
[ 6 мнения ] |
|
Преобразуване на типове данни
| Автор |
Съобщение |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 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 |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
това pr1 не го виждам какво е !
но:
(pr1/0x50) си е целочислено деление т.е дава 11 а не 11.18 (чак после става float!)
промени го на
(pr1/(float)0x50) за да си го смята като флоат !
|
| Нед Апр 22, 2007 12:16 am |
|
 |
|
juzisound
Ранг: Почетен член
Регистриран на: Съб Май 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 |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
За по-сигурно (float)pr1/(float)0x50 
|
| Нед Апр 22, 2007 12:29 am |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
В темата която пуснах, грешката льсна в асемблера. Добре е да гледаш какво излиза от компилатора, особено ако като мен нямаш много опит с С-то 
|
| Нед Апр 22, 2007 4:04 am |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Работата стана както каза Рек - (float)pr1/(float)0x50 и резултата си заспа. Благодаря за съветите 
|
| Нед Апр 22, 2007 9:25 am |
|
|
|
Страница 1 от 1
|
[ 6 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|