Výpis desetiných čísel

C,C++,C#

Moderátori: psichac, Moderátori

DanielK
Stály člen
Stály člen
Príspevky: 282
Dátum registrácie: 28 Feb 2015, 14:55

Výpis desetiných čísel

Príspevok od používateľa DanielK » 29 Aug 2017, 13:55

Ahoj,
nedaří se mi vypsat na displayhttps://www.gme.cz/dem16217syh-py desetinné číslo
nakonec jsem vyzkušel kod z knihy avr, kapitola o lcd a výsledek je stejný, místo čísla se vypíše "?"

knihovny lcd.c a lcd.h používám od Peter Fleury

OS: Ubuntu 14.04
překladač: avr-gcc

výspis vypadá takto

Kód: Vybrať všetko

Cele cislo:1234
desatinne:?
kod z knihy avr

Kód: Vybrať všetko

#include <avr/io.h>
#include <stdlib.h>
#include <stdio.h>
#include "lcd.h"
int main(){
float pi = 3.14;
int cele = 1234;
char text[32]; //pole znakov pre vypis na displej
lcd_init(LCD_DISP_ON); // inicializacia displeja
sprintf(text,"Cele cislo:%d\nDesatinne:%.2f ",cele,pi);
                lcd_puts(text);
                while(1);
return 0;
}
Nevíte, kde by mohla být chyba?
0

Používateľov profilový obrázok
daqq
Power user
Power user
Príspevky: 2528
Dátum registrácie: 10 Jún 2008, 00:00
Bydlisko: Bratislava
Vek: 36
Kontaktovať používateľa:

Re: Výpis desetiných čísel

Príspevok od používateľa daqq » 29 Aug 2017, 14:53

Je mozne ze pouzivas zly (obmedzeny) sprintf - je viacero variant, niektore su kvoli setreniu pamatou osekane. Treba prilinkovat spravnu variantu: https://startingelectronics.org/article ... -studio-7/
0
Outsource your thinking: Get religious!
Zistenie: Ked robite sucasne v C, C++, C#, Matlabe, trocha pokukujete po VHDL, sialenstvo nemoze byt daleko...este stastie, ze som lietadlo a nemam tieto problemy.

OM0XA
Stály člen
Stály člen
Príspevky: 235
Dátum registrácie: 03 Okt 2012, 23:18
Bydlisko: Poprad

Re: Výpis desetiných čísel

Príspevok od používateľa OM0XA » 04 Okt 2017, 09:37

Ja to robim takisto:

Kód: Vybrať všetko

sprintf( string_buffer, "%3.0fV  %3.0fV  %3.0fV", vysledne_napatie[0], vysledne_napatie[1], vysledne_napatie[2] );
lcd_gotoxy(0,0);
lcd_puts(string_buffer);
nezabudni si v Makefile enablovat:

Kód: Vybrať všetko

# Floating point printf version (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
Mne to ide bez problemov, lcd kniznicu pouzivam tu istu.
0

Používateľov profilový obrázok
budvar10
Pokročilý člen
Pokročilý člen
Príspevky: 982
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Výpis desetiných čísel

Príspevok od používateľa budvar10 » 04 Okt 2017, 11:03

Funkcionalita printf pre float nie je povolená by default. Nastaviť sa dá, tak ako píše OM0XA. Popis k tomu je priamo v stdio.h.
0

dan21
Ultimate člen
Ultimate člen
Príspevky: 3016
Dátum registrácie: 11 Apr 2007, 00:00
Bydlisko: ZA

Re: Výpis desetiných čísel

Príspevok od používateľa dan21 » 04 Okt 2017, 12:18

Alebo pozri v knihe od zawina Programujeme AVR v jazyku C, kapitola Praca so znakovym LCD disp, strana 35 :-) :-)
0

Používateľov profilový obrázok
Kado
Power user
Power user
Príspevky: 1625
Dátum registrácie: 02 Sep 2007, 00:00
Bydlisko: PB
Vek: 40

Re: Výpis desetiných čísel

Príspevok od používateľa Kado » 04 Okt 2017, 16:30

ja ked vidim ako trapite 8bit mcu tymi floatmi, tak neviem co od radosti...
ja napriklad interne reprezentujem cisla celeciselne 8bit, 16bit,32bit a navonok sa tvaria (napr pri vypise na disp) ako desatinne, casovo menej narocne vypocty, menej pamati...
0
Návrh zapojení s jednočipovými mikropočítačmi, tvorba programového vybavenia pre mikropočítače
http://www.jk-elektronika.info/index.html

predaj !!
http://svetelektro.com/modules.php?name ... 54#p549154

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Výpis desetiných čísel

Príspevok od používateľa peterple » 04 Okt 2017, 18:05

Na druhej strane reálne čísla mal aj ZX spectrum, PMD-85 a tam ten 8 bitový procesor bol tak 30x menej výkonný ako AVR. Ale súhlasím. netreba používať float na jednoduché veci. Ale ani nevidím dôvod ho nepoužiť ak výpočet prebieha raz za 1ms a naozaj treba aj niečo iné ako +-×÷
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

ok2jnj
Okoloidúci
Okoloidúci
Príspevky: 20
Dátum registrácie: 07 Dec 2012, 08:48
Bydlisko: olomoucko
Vek: 47
Kontaktovať používateľa:

Re: Výpis desetiných čísel

Príspevok od používateľa ok2jnj » 04 Okt 2017, 20:05

float je číslo s pohyblivou desetinnou čárkou a jeho použití má smysl pouze tam, kde se čárka opravdu pohybuje, např. kalkulačka. Na AVR obvykle provádíme výpočty s čísly získanými z nějakého měření, nějakého AD převodníku. Tam je desetinná čárka pevná, je jednodušší a rychlejší celý výpočet provést v množině celých čísel a desetinnou čárku do čísla vložit až při výpisu na displej. Při počítání s celými čísly je na AVR možné výpočet výrazně zrychlit, když se místo dělení použije bitová rotace. Popsáno např. tady: https://svetelektro.com/clanky/laborato ... t-813.html
0

DanielK
Stály člen
Stály člen
Príspevky: 282
Dátum registrácie: 28 Feb 2015, 14:55

Re: Výpis desetiných čísel

Príspevok od používateľa DanielK » 09 Okt 2017, 19:13

Omlouvám se, že reaguji tak pozdě. Každopádně děkuji všem za rady.

Nakonec jsem to vyřešil takovým způsobem, který asi není moc efektivní, ale zdá se, že funguje

Kód: Vybrať všetko

// převod celého čísla z mV na V s desetinou čárkou a výpisem na display

char text[32] = {0,};

long int jednotky;
long int desetiny;
long int setiny;

int napeti_v_mV;

napeti_v_mV = 96; //hodnota napětí v mV

if (napeti_v_mV <= 94)
  {
   
   jednotky = 0;
   desetiny = 0;
   setiny = (napeti_v_mV + 5)/10;
   
   sprintf(text,"U = %lu,%lu%luV",jednotky,desetiny,setiny); 
  }

else
{

	jednotky = napeti_v_mV /1000;
	napeti_v_mV = ((napeti_v_mV+5) - jednotky * 1000)/10;
	desetiny= napeti_v_mV;
				
	 if 	 (desetiny == 0) {sprintf(text,"U = %lu,0%luV",jednotky,desetiny);}
	 else if (desetiny == 1) {sprintf(text,"U = %lu,0%luV",jednotky,desetiny);}
	 else if (desetiny == 2) {sprintf(text,"U = %lu,0%luV",jednotky,desetiny);}
	 else if (desetiny == 3) {sprintf(text,"U = %lu,0%luV",jednotky,desetiny);}
	 else if (desetiny == 4) {sprintf(text,"U = %lu,0%luV",jednotky,desetiny);}
	 else if (desetiny == 5) {sprintf(text,"U = %lu,0%luV",jednotky,desetiny);}
	 else if (desetiny == 6) {sprintf(text,"U = %lu,0%luV",jednotky,desetiny);}
	 else if (desetiny == 7) {sprintf(text,"U = %lu,0%luV",jednotky,desetiny);}
	 else if (desetiny == 8) {sprintf(text,"U = %lu,0%luV",jednotky,desetiny);}
	 else if (desetiny == 9) {sprintf(text,"U = %lu,0%luV",jednotky,desetiny);}
	 else if (desetiny == 100) 
	   {
		jednotky += 1;
             	desetiny = 00;
				 
		 sprintf(text,"U = %lu,0%luV",jednotky,desetiny);
	  }
	else                   
           {
             sprintf(text,"U = %lu,%luV",jednotky,desetiny);
           }
}


0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Výpis desetiných čísel

Príspevok od používateľa peterple » 09 Okt 2017, 19:45

Naozaj veľmi neefektívne. Hlavne preto že ešte nepoznáš prostriedky a vyjadrovacie schopnosti jazyka. Ale najviac sa mi nepáči posledná veta. Tak z teba dobrý programátor nebude.
Skús sa pozrieť na operátor modulo %
https://www.smnd.sk/anino/programming/c ... /kap03.htm
A tých x rovnakých ifov o tom ani nehovorím to je strašné.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
Kado
Power user
Power user
Príspevky: 1625
Dátum registrácie: 02 Sep 2007, 00:00
Bydlisko: PB
Vek: 40

Re: Výpis desetiných čísel

Príspevok od používateľa Kado » 09 Okt 2017, 20:24

zaujimavy kod :rolleyes:
a keby si si napisal svoju funkciu na prevod cisla na display a nepouzival sprintf, niekedy je to aj z hladiska vyuzitia flash aj ram pamate lepsie, lebo sprintf a spol. zozerie tiez nemalo kodu flash pamate
0
Návrh zapojení s jednočipovými mikropočítačmi, tvorba programového vybavenia pre mikropočítače
http://www.jk-elektronika.info/index.html

predaj !!
http://svetelektro.com/modules.php?name ... 54#p549154

DanielK
Stály člen
Stály člen
Príspevky: 282
Dátum registrácie: 28 Feb 2015, 14:55

Re: Výpis desetiných čísel

Príspevok od používateľa DanielK » 09 Okt 2017, 21:22

Ano ty if jsem původně chtěl zapsat s operátorem || ,ale ten překladač https://www.tutorialspoint.com/compile_c_online.php to nějak nechtěl překousat. jestli si to myslel takhle.

a asi je zbytečné zapisovat promněnou do long int a stačilo by char.

u modula jsem nepochopil jak se da využít
anie nevím jestli správně chápu jak funguje:

120 % 7 = 1
protože:
120 / 7 = 17 zbytek neřeší, 17 * 7 = 119, 120 - 199 = 1
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Výpis desetiných čísel

Príspevok od používateľa peterple » 09 Okt 2017, 21:37

no a niečo podobného tam robíš keď chceš desatiny, stotiny a neviem aké ďalšie digity.
modulo je zvyšok po delení. A čo je zvyšok po delení desiatimi?

Or? <= >= by nebolo lepšie?

Kód: Vybrať všetko

< > <= >= && || ! ~ & |
V tomto musíš mať bezpodmienečne jasno. Inak budeš ťažko stavať podmienky.

toto ide naprieč všetkými jazykami
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

ok2jnj
Okoloidúci
Okoloidúci
Príspevky: 20
Dátum registrácie: 07 Dec 2012, 08:48
Bydlisko: olomoucko
Vek: 47
Kontaktovať používateľa:

Re: Výpis desetiných čísel

Príspevok od používateľa ok2jnj » 10 Okt 2017, 05:54

V příloze je pár funkcí, kterými lze ovládat diaplej. Doporučuji přečíst, spolu s popisem klíčových slov a operátorů jazyka C pochopit, nakreslit si na papír, jak to funguje. Dobrý tutoriál je např. tady https://svetelektro.com/clanky/programu ... t-443.html.
Prílohy
HD44780.c
(5.06 KiB) 54 stiahnutí
HD44780.h
(1.34 KiB) 49 stiahnutí
0

Napísať odpoveď