Svetelektro.com

Svetelektro.com

Meno:
Heslo:
SVETELEKTRO • Výpis desetiných čísel

Výpis desetiných čísel

C,C++,C#

Moderátori: psichac, Moderátori

Výpis desetiných čísel

Odoslaťod 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?
2. ročník ŠSSI Tábor, Ubuntu, Rock Metal, Škoda Octavia RS TSI
DanielK
Nový člen
Nový člen
Príspevky: 71
Založený: 28.02.2015
Karma: 0

Re: Výpis desetiných čísel

Odoslaťod 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/
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.
daqq
Obrázok používateľa
Power user
Power user
Príspevky: 2345
Vek: 29.86
Založený: 10.06.2008
Bydlisko: Bratislava
Karma: 4

Re: Výpis desetiných čísel

Odoslaťod 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.
OM0XA
Stály člen
Stály člen
Príspevky: 198
Založený: 03.10.2012
Bydlisko: Poprad
Karma: 2

Re: Výpis desetiných čísel

Odoslaťod 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.
budvar10
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 362
Založený: 15.12.2014
Bydlisko: Košice
Karma: 7

Re: Výpis desetiných čísel

Odoslaťod 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 :-) :-)
dan21
Obrázok používateľa
Ultimate člen
Ultimate člen
Príspevky: 2185
Založený: 11.04.2007
Bydlisko: ZA
Karma: 16

Re: Výpis desetiných čísel

Odoslaťod 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...
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
Kado
Obrázok používateľa
Power user
Power user
Príspevky: 1578
Vek: 33.8
Založený: 02.09.2007
Bydlisko: PB
Karma: 3

Re: Výpis desetiných čísel

Odoslaťod 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 +-×÷
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1521
Vek: 50.98
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: Výpis desetiných čísel

Odoslaťod 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
ok2jnj
Okoloidúci
Okoloidúci
Príspevky: 15
Vek: 41.25
Založený: 07.12.2012
Bydlisko: olomoucko
Karma: 3

Re: Výpis desetiných čísel

Odoslaťod 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);
           }
}


2. ročník ŠSSI Tábor, Ubuntu, Rock Metal, Škoda Octavia RS TSI
DanielK
Nový člen
Nový člen
Príspevky: 71
Založený: 28.02.2015
Karma: 0

Re: Výpis desetiných čísel

Odoslaťod 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/saloun/kap03.htm
A tých x rovnakých ifov o tom ani nehovorím to je strašné.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1521
Vek: 50.98
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: Výpis desetiných čísel

Odoslaťod 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
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
Kado
Obrázok používateľa
Power user
Power user
Príspevky: 1578
Vek: 33.8
Založený: 02.09.2007
Bydlisko: PB
Karma: 3

Re: Výpis desetiných čísel

Odoslaťod 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
2. ročník ŠSSI Tábor, Ubuntu, Rock Metal, Škoda Octavia RS TSI
DanielK
Nový člen
Nový člen
Príspevky: 71
Založený: 28.02.2015
Karma: 0

Re: Výpis desetiných čísel

Odoslaťod 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
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1521
Vek: 50.98
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: Výpis desetiných čísel

Odoslaťod 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) Stiahnutá 6 krát
HD44780.h
(1.34 KiB) Stiahnutá 6 krát
ok2jnj
Okoloidúci
Okoloidúci
Príspevky: 15
Vek: 41.25
Založený: 07.12.2012
Bydlisko: olomoucko
Karma: 3


Naspäť na C,C++,C#

Kto je prítomný

Užívatelia prezerajúci si toto fórum: Žiadny registrovaný používateľ a 0 hostí.

Forums ©
Autor stránky je Ondrej Závodský(zawin), o graficky design sa stará Ľuboš Fabo(BUFU).

TOPlist

Powered by Copyright © UNITED-NUKE CMS. All Rights Reserved.
Čas potrebný k spracovaniu stránky 0.66 sekúnd