| Микроконтролери и електроника 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 ] | |||||||||
| Заглавие: | ||||||||||
За по-сигурно (float)pr1/(float)0x50 |
||||||||||
| Автор: | 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/ |
|