Fórum témák
» Több friss téma |
Ha a processzor 10 bites ADC-vel rendelkezik, akkor sehogy, ugyanis a 3,22 V éppen két mérhető érték közé esik.
1/(1023/5) = 0,00489 (kerekítve) Tehát egy egység megközelítőleg 4,89 mV, ez a 10 bit legjobb felbontása az elméleti értékekkel számolva. 3,22/0,00489 = 658,49 Innen már csak az a kérdés, hogy az ADC merre kerekít és merre téved (658 v. 659). Nem ismerem a C programozási nyelvet de ha jól értelmezem a Flowcode makró parancsait, az is lebegőpontos számításokkal operál amennyiben az ADC mérés eredményét feszültségként vagy szövegként kéred, tehát kerülendő.
A helyzet az, hogy floatban olvassa be, ezen nem lehet változtatni. De a voltban méréstől függetlenül szüksége lehet az embernek lebegőpontos számításokra ezért érdekel, hogyan is van ez.
Igen ezt jól benéztem. Viszont a probléma ettől függetlenül áll számokkal is.
Átírtam a programot. Az első a hibás a második pedig egy működő kód. A képeken látható az eredmény.
Attól függ, mit csinálsz, úgy kell alakítani a számításokat, hogy lehetőleg ne legyen benne lebegőpontos számítás. Pl. menet közben csak egész számok legyenek. Ezt a legegyszerűbben úgy lehet elérni, hogy az értékeket egészként kezeled, számolsz velük és a végén, a kijelzésnél külön kiszámolod mennyi az egész és mennyi a tört.
Az előző hozzászólásomban már írtam, hogy egy egység kb. 4,89 mV. Ha a folyamatban 489-cel számolsz, akkor a legvégén csak vissza kell osztani 100-zal, kicsit trükkösen. Legyen a példában a beolvasott érték 658. Tehát: 658 * 489 = 321 762 (x) y = x mod 100 (y változóban lesznek a tizedes értékek) x = (x - y)/100 (x változóban pedig az egész értékek) z = x + "." + y (z szöveges változóba kerül: 3217.62 [mV]) Mindezen művelet 1023-ra számolva 5002.47 mV-ot ad. Természetesen nem olyan pontos, mint egy számológép de az esetek nagytöbbségében ilyen pontosság elég, és felesleges is elvárni ettől jobbat egy "buta" MCU-tól. Legalábbis a gyakorlat ezt mutatja. Ha pedig pontosabb mérés kell, más eszközökhöz kell nyúlni. A fenti számítási műveletben a legnagyobb érték: 1023 x 489 = 500247. Ez pedig egy Uint változóba bőven elfér, az pedig sokkal kevesebbet kér, mint egy Float. A hozzászólás módosítva: Feb 21, 2013
Jól mondod, de nem kell osztani 100-al, mert az megint lebegőpontosat ad. Korábban egy "tucat" megoldást felraktunk a kijelzésre, átalakításra, csak vissza kéne olvasni és alkalmazni(a kérdezőnek).
A másik, hogy nem értek egyet a "buta" ADC-vel. Az ADC annyira buta, amennyire bármelyik másik 10bites. De van 12bites is, ami, ahogy írod elegendő kell legyen a legtöbb alkalmazásban, de a 10-es is. Lehet 3,22V is, csak olyan referenciát kell használni. Persze semmi értelme, csak megemlítettem. A hozzászólás módosítva: Feb 21, 2013
Teljesen igazatok van, ezzel én nem is vitatkozom. Én a konkrét problémára keresem a választ, ami alapvetően nem programozási, hanem flowcode probléma, ezért is itt kérdeztem és nem valamelyik programozós témában. A legjobban az zavar, hogy biztos vagyok benne, hogy működnie kell csak én rontok el valamit, de egyszerűen nem tudok rájönni, hogy mit.
Nem is kell vitatkozni, hanem úgy kellene csinálni, ahogy írjuk és jó lesz...
Ha x változó Uint, akkor abba nem kerülhet tizedes érték, plusz előtte az osztandó számból kivonok annyit, hogy tutira maradék nélküli legyen az osztás (x mod 100 eredménye).
A "butát" természetesen arra értettem, hogy a számítógépre írt programoknál kb. semmit sem jelent plusz 10-20-50-100 KB, addig egy MCU-nál, főleg a kicsiknél nagyon is számít.
Csak PIC-et ismerő Flowcode-om van. Nem lehet, hogy a Flowcode-od demo és a limitációk miatt nem fordul le a teljes program? Bár igazság szerint nem tudom, ezt hogyen viszi véghez a program. Részlegesen fordít vagy figyelmeztet, hogy nem fog menni a dolog...
Nem, a demo csak annyiban korlátozott, hogy csak néhány controllert ismer.
Azt írtad osztani kell. A mod nem sima osztás, illetve negy ugyanarról van szó. Ha mod ot írtál volna, nem reagáltam volna rá.
A hozzászólás módosítva: Feb 21, 2013
x = 658 * 489
y = x mod 100 (y változóban lesznek a tizedes értékek) x = (x - y)/100 (x változóban pedig az egész értékek) z = x + "." + y (z szöveges változóba kerül: 3217.62) x-ben nem lehet tizedes, pláne akkor, ha x típusa Int, Uint vagy ilyesmi.
Említettem, hogy feltettünk erre komplett megodásokat(ADC mérés, 32bites szám kijelzés, fixpontos kezelés)...
A hozzászólás módosítva: Feb 21, 2013
Linket tudsz adni? Keresem de nem találom, kíváncsi vagyok nagyon minden megoldásra.
digitekre bontás
freki_periódus_impulzus mérő Mindkettő tartalmazza a megoldást egy szám digitekre bontására. A tizedes pont kirakása értelemszerű. A keresővel lehet felhasználóra keresni: pl: *user:watt A hozzászólás módosítva: Feb 22, 2013
Szerintem ezt a program megoldja, különben szólna. Mindenesetre kipróbáltam és nem lett jobb. A proci az megy csak a kijelző bolondul meg, a fene sem érti.
Ha egészeket használva jó a kijelzés, ahogy írtad, akkor egyértelmű, hogy a float kezelésénél, kijelzésénél van gond(lehet, hogy fordító hiba). Leírtuk, hogy kerülni kell a float műveleteket, ezért nincs sok értelme ez irányba keresni a hibát, válts fixpontos megoldásra a javaslatok szerint és működni fog.
A fejlesztői környezet egyébként nem szól minden hibáról, sőt, a legfontosabbakról sem mindig! Annyit még megjegyeznék, hogy sem a PIC, sem az AVR nem proci... A hozzászólás módosítva: Feb 22, 2013
Nem. Egyszerűen nem úgy hívják ezt a struktúrát!
picmicrocontrollers avrmicrocontrollers A hozzászólás módosítva: Feb 22, 2013
Sziasztok, havertól megkaptam az új flowcodeot, de semmit nem akar lefordítani, ha még egy üres projectet akarok, azt sem.
Itt a fordító hibája: Idézet: „File name: C:\Flowcode\Dani_PWM.c Fordító indítása... C:\Program Files (x86)\Flowcode\v5\Tools\boostc\boostc_pic16_flowcode.exe -v -t PIC12C508 "Dani_PWM.c" BoostC Optimizing C Compiler Version 7.04 (for PIC16 architecture) http://www.sourceboost.com Copyright(C) 2004-2011 Pavel Baranov Copyright(C) 2004-2011 David Hobday Licensed to FlowCode User under Single user Pro License for 1 node(s) Limitations: PIC12,PIC16 max code size:Unlimited, max RAM banks:Unlimited error: could not open input file 'C:\PROGRA~2\Flowcode\v5\Tools\boostc\config\PIC12C508.tdf' Dani_PWM.c Starting preprocessor: C:\PROGRA~2\Flowcode\v5\Tools\boostc\pp.exe Dani_PWM.c -i C:\PROGRA~2\Flowcode\v5\Tools\boostc\include -d _PIC12C508 -la -c2 -o Dani_PWM.pp -v -d _BOOSTC -d _PIC16 -d _CHAR_INDEX .... Dani_PWM.c success success Visszatérési érték = d Liker/assembler indítása… C:\Program Files (x86)\Flowcode\v5\Tools\boostc\boostlink_pic.exe -ld "C:\Program Files\Matrix Multimedia\Flowcode V5\Tools\BoostC\lib" libc.pic16.lib "Dani_PWM.obj" -t PIC12C508 -d "C:\Flowcode" -p "Dani_PWM" BoostLink Optimizing Linker Version 7.03 http://www.sourceboost.com Copyright(C) 2004-2011 Pavel Baranov Copyright(C) 2004-2011 David Hobday could not open input file 'C:/PROGRA~2/Flowcode/v5/Tools/boostc/config/PIC12C508.TDF' Error: Failed to open:libc.pic16.lib or C:\Program Files\Matrix Multimedia\Flowcode V5\Tools\BoostC\lib/libc.pic16.lib failure Visszatérési érték = d A Flowcode nem tudja lefordítani az ASM fájl a következő hiba miatt: VÉGE ” Sajna én ebből nem vettem ki mi a hiba (mámrint, hogy nem tudja megnyitni ezt -azt , azt tudom, csak nemtudom miért ) Üdv!
Azért mert
Igazad van, ilyen sajna tényleg nincs, de például kipróbáltam egy PIC18f2550 el, itt már nem ez a hiba jelentkezik, de ígysem fordítja le.
Idézet: „Error: Failed to open:libc.pic18.lib or C:\Program Files\Matrix Multimedia\Flowcode V5\Tools\BoostC\lib/libc.pic18.lib ” Viszont ez ott van ahol kéne lennie. Nemértem mi lehet a baj, a régi verziós flowcodeal semmi bajom nem volt. Idézet: „régi verziós flowcodeal semmi bajom nem volt.” Abban sem fordítottad az 508-at hex-re az tutti PIC18f2550 hibához meg tedd fel a forrást ami nem megy.
Lényegében üres a fájl, nem tudom miért nem csinálja...
Milyen op. rendszered van, és hány bites?
Szia, Windows 7 és 64 bites (régen 32-es volt , remélem nem az a baj)
Pedig de.. Az útvonal nem ott van a 32 és a 64 bites rendszernél. Be kell újra állítani az elérési útvonalat...
Szia, most átálítottam az elérési útvonalat, az asembler számára, mostmár nem írja ki, hogy nem telálja, most viszont kiír vagy 30-50 hibát, ehhez hasonlókat:
Idézet: „Error: Unresolved external function:'float32_to_int32(float)' ” És hasonlókat.
Minden elérési útvonalat átírtál x86-ra, vagy csak a fordítóét?
|
Bejelentkezés
Hirdetés |