Fórum témák

» Több friss téma
Fórum » Folyamatábrás mikrokontroller programozás Flowcode-dal
Lapozás: OK   112 / 360
(#) watt válasza Kovabe hozzászólására (») Dec 18, 2012 /
 
Ez nem C, de ki lehet belőle indulni. Persze flow-ban nem fog menni...
(#) Kovabe válasza watt hozzászólására (») Dec 18, 2012 /
 
Hát ettöl féltem, de azért köszönöm
(#) djusee hozzászólása Dec 19, 2012 /
 
Hello. Ismerkedek a Flowcode al, amit egyszer szeretnék összehozni vele, egy 2 hengeres kistraktor henger hömérsékleteit kijelezni 2x2 darab 7 szegmenses kijelzön pl 0 tol 99 fokig. Mi a járhatobb ut, 2xDS1820 vagy 2xLM35 (1wire vagy analog) ?
Köszönöm
(#) pjg válasza djusee hozzászólására (») Dec 19, 2012 /
 
Bármelyik jó. DS1820 már nem nagyon kapható. Helyette DS18S20, vagy DS18B20.
(#) kaqkk válasza djusee hozzászólására (») Dec 19, 2012 / 1
 
Kezdőnek egyszerűbb az lm 35- az csak egy ADC beolvasás , és ebben az alkalmazásban nem is fontos a tizedfokos pontosság .
(#) watt hozzászólása Dec 19, 2012 /
 
Sziasztok!
Mai aktuális találós kérdésem az lenne, hogy hogyan lehet digitekre bontani egy 10 elemű(ULONG) számot a legrövidebb kóddal, a legkevesebb számítással? Nem a blokkok száma a lényeges, hanem a valós programsorok száma, amit a C forrásban fogok majd megnézni.

Ha a szimulációhoz a végére szükséges egy blokk a törésponthoz, az nem számit bele a hosszba és a változók kezdő értékkel való feltöltéséhez szükséges blokk sem az elején, csak a számításhoz szükséges programsorok.
A változóknak ne adjunk alapértéket a létrehozásnál, mert úgy is fel kell őket tölteni a programban, így tárhelyet spórolunk (Ha a létrehozásnál alapértéket adunk, ahhoz is fel lesz haszálva egy-két programsor, tehát duplán és feleslegesen foglalunk program memóriát, a C kódban ez látható, ha belenézünk!).
Csak Flowcode megoldást küldjetek légyszíves!

Határidő ma este. Jó fejtörést!
A hozzászólás módosítva: Dec 19, 2012
(#) Hp41C válasza watt hozzászólására (») Dec 19, 2012 /
 
Szia!
Ez a léptetős, korrigálós módszer nem működne FlowCode -ban. Sajnos nem tudom próbálni...
(#) watt válasza Hp41C hozzászólására (») Dec 19, 2012 /
 
Annyira már nem akartam belemenni, hogy a végleges gépi kód legyen a legkisebb, bár igazából a helykihasználás miatt ez lenne a lényeg. Itt elsősorban logikai feladatot szerettem volna megfogalmazni, amin jól lehet törni a fejünket.

Az is egy jó kérdés, hogy amit Flow-ban, vagy C-ben megírunk, az végül is mire fordul. A fordítókba be van-e építve az a sok finesz, amit ilyen asm kódok formájában találhatunk a neten, mint követendő példák. A gyanúm az, hogy az univerzális követelmények miatt nincsenek.

Szóval itt inkább az eddig használt digitekre bontástól eltérő, kevesebb számítással elvégezhető rutin lenne a feladat. Eddig a 10 digithez legalább 20 MOD , osztás és kivonás művelet lett felhasználva(korábban fel is lett téve pár db megoldás). Én most arra lennék kíváncsi, hogy hogyan oldanátok meg ezt programhatékonyabban. Az biztos, hogy a C kód is kevesebb sort tartalmaz, ami a folyamatábrából fordítódik. Az asm-ot még nem néztem, de mindjárt meglesem, hogy a két megoldás között mekkora a lefordított kódméretbeni különbség...
(#) kokozo válasza watt hozzászólására (») Dec 19, 2012 /
 
Szia! Nem tudom hogy ilyenre gondoltál e.

szambonto.fcf
    
(#) Hp41C válasza watt hozzászólására (») Dec 19, 2012 /
 
Ebben a kódban egyetlen osztás vagy modulo sincs! Mindegy milyen nyelen írjuk meg. Bitenként átforgatja a számot, ha egy BCD digiten a msb 1, akkor a digithez 3 -at hozzáad.
32 bites számra csak 33 assembly utasítás a return -nak együtt.
A hozzászólás módosítva: Dec 19, 2012
(#) watt válasza Hp41C hozzászólására (») Dec 19, 2012 /
 
Ezzel szemben a Flowcode a csatolt számítással 70bájt RAM-ot és 1126bájt program memóriát foglal.
A feladat referenciájáúl szolgáló kódom pedig 63bájt RAM-ot és 396byte RAM-ot, ami kb. 198 assemly utasításnál kevesebbnek felel meg egy 18F-ben.
Láthatod, hogy nem lehet összemérni az általad példának felhozott kóddal, nem is ez a cél most itt, ez túlhaladná a flow-t választók érdeklődési körét.

Az eddig itt használt számítás menetét beillesztem ide szövegesen is, ha nem tudnád megnyitni a forrást:
  1. milliardok = szam / 1000000000
  2. szam = szam MOD 1000000000
  3. szazmilliok = szam / 100000000
  4. szam = szam MOD 100000000
  5. tizmilliok = szam / 10000000
  6. szam = szam MOD 10000000
  7. milliok = szam / 1000000
  8. szam = szam MOD 1000000
  9. szazezrek = szam / 100000
  10. szam = szam MOD 100000
  11. tizezrek = szam / 10000
  12. szam = szam MOD 10000
  13. ezrek = szam / 1000
  14. szam = szam MOD 1000
  15. szazak = szam / 100
  16. szam = szam MOD 100
  17. tizek = szam / 10
  18. egyek = szam MOD 10
(#) watt válasza kokozo hozzászólására (») Dec 19, 2012 /
 
Szia!
Igen, ez egy jó megközelítés!
A szimulátor hibáját én észre se vettem, de valóban hibázik nálam is.

A megoldásodon lehetne még finomítani, mert 86bájt RAM-ot és 550bájt program memóriát fogyaszt. Ennek oka a lehetséges minimumtól több művelet.
Ennek ellenére ügyes, hogy felismerted, hogy ciklusba lehet szervezni a feladatot és alulról lehet bontogatni a számot és tömbbe rakhatod az eredményt, bár én nem string tömbre számítottam, méretét tekintve mindegy, mert bájtokat foglal az elemszám szerint. Az eredeti megoldáshoz képest ez máris a fele memóriát használja csak!
A hozzászólás módosítva: Dec 19, 2012
(#) watt válasza watt hozzászólására (») Dec 19, 2012 /
 
Az előbb elírtam, 396bájt flash akart lenni...
(#) watt válasza watt hozzászólására (») Dec 19, 2012 /
 
Egyébként az az érdekes, hogy a C kód sorszáma nem tér el az én verziómtól, még is nagyobb kódot fordít!

Ha még töröd a fejed a méret csökkentésen, akkor vedd ki az LCD-s részeket és 18F252-be fordítsd, hogy össze tudd hasonlítani a memóriaigényeket. 16F-re egyébként 257szót írt ki...

Még annyit, hogy a szimulátor 9digittel még jól elboldogul!
A hozzászólás módosítva: Dec 19, 2012
(#) kokozo válasza watt hozzászólására (») Dec 19, 2012 /
 
Ram:81bytes
Rom:524bytes
10-el is elboldogul egészen addig amíg az első digit 1-es utána ront.
(#) watt válasza kokozo hozzászólására (») Dec 19, 2012 /
 
Tetszik az X>0 húzás! Az ember mindig tanul! A flowcode rejteget még titkokat!

Viszont a ram:63, rom:396 még távol van, máshol kell keresni a megodlás. Segíteni nem akarok, másoknak is legyen lehetősége.

szerk:
Az x>0 megoldással(nálam cik<10), ram:62, rom:392.
A hozzászólás módosítva: Dec 19, 2012
(#) kokozo válasza watt hozzászólására (») Dec 19, 2012 /
 
Akkor csak jó volt valamire az én progim is
(#) watt válasza kokozo hozzászólására (») Dec 19, 2012 /
 
Abszolút! Írtam, hogy az eredetihez képest jelentősen jobb a megközelítése a feladatnak, kis módosítással megtalálnád a megoldást is!
A kicsi megoldások pedig hasznosak lehetnek azoknak, akik kevesebb flowcode forrást láttak, azaz új a fejlesztői környezet.

Annyit hozzátennék, hogy amikor a ciklus blokkban beállítjuk a ciklusok számát, akkor a fordító létre hoz egy ciklus számlálót a C kódban, de nem lehet hozzáférni blokk oldalról. Kár, hogy nem lehet, mert egy változóval és néhány művelettel (x=x-1), kevesebbet kellene kódolni, miután a for ciklus ezt megteszi eleve. Ez sem túl hatékony megoldás a Flow fejlesztőitől...
A hozzászólás módosítva: Dec 19, 2012
(#) watt válasza kokozo hozzászólására (») Dec 19, 2012 /
 
ram:72
rom:358
Nem semmi! Több sorba bontott alap műveletekkel, sokkal kisebb lett a kód! Ez tanulságos!
Kisebb lett 38bájttal, mint az enyém, gratulálok!
A RAM is csökkent az első verziódhoz képest, de még magasabb, mint a én verziómban. Kérdés, hogy mi a fontosabb!? Alkalomtól függ, hogy a RAM-al vagy a ROM-al van gondunk.
(#) kokozo válasza watt hozzászólására (») Dec 19, 2012 /
 
Kár hogy hibás volt ugyanis a szam2 rossz hosszúságúra volt beállítva és ha ulongnak állítom be akkor már nem jó, ezért töröltem.
A hozzászólás módosítva: Dec 19, 2012
(#) djusee válasza kaqkk hozzászólására (») Dec 19, 2012 /
 
Köszönöm mindkettötöknek. Tehát akkor ingujját feltürni és neki esni az ADC net.Esetleg van valahol arra már példa hogy hogyan oldjam meg hogy a kiolvasott értéket hogyan jelenitsem meg a kijelzön(nemtudom megfogalmazni magyarul, pl. 10 foknál az elsö kijelzön az 1 es jelenjen meg, másodikon a 0 jelenjen meg.)? Elöbb linkeltek egy véletlenszám generálot ami 7segmenses kijelzön jeleniti meg a számokat.Használható ehhez is? Köszönöm
(#) watt válasza kokozo hozzászólására (») Dec 19, 2012 /
 
Aha! Kis turpisság! A rövidebb változóhoz tartozó műveletek kevesebb kódot kérnek!
Egyébként valamivel kevesebb RAM-ot hazsnál, ram:75 de több flash-t, rom:528.

Akkor még kellene valami csavar, hogy csökkenjen a méret!
(#) kokozo válasza watt hozzászólására (») Dec 19, 2012 /
 
És ez?
(#) watt válasza (Felhasználó 15355) hozzászólására (») Dec 19, 2012 /
 
Hát elég nagy lett ez igaz, viszont ez is egy különleges megközelítés, nekem eszembe se jutott volna a string művelet. Az jó kérdés, hogy igazából az ASCII kódokat tartalmazza a változó, ami bizonyos műveleteknél jobb, másoknál egyáltalán nem jó azaz további feldolgozást igényel. A C kód, amire fordul elég nagy és a kód is nagyra fordul(ram:94, rom:1296), ezért nem igazán teljesíti a feladat méretbeli részét.
Mindenesetre ismét egy érdekes gondolatmenetet láthattunk! Köszi!
(#) watt válasza kokozo hozzászólására (») Dec 19, 2012 /
 
ram:86, rom:710. Visszafejlődés.
Vigyázz, 16F-eknél nem a bájtokat írja ki, hanem a szavakat(word)! Ezért kértem, hogy 18F252-re fordítsunk!
(#) watt hozzászólása Dec 19, 2012 /
 
Elnézést kérek, engem is megtréfált az egyik változó ezért hibás méreteket írtam le eddig. A pontosan működő verzió adatai a következők:
ram:72
rom:458
Ezek szerint kokozo nem nagy az eltérés a két program között...
(#) Kovabe hozzászólása Dec 19, 2012 /
 
Mi az: egy doboz PIC?
(#) kaqkk válasza Kovabe hozzászólására (») Dec 19, 2012 /
 
Talán ez ?
(#) Kovabe válasza kaqkk hozzászólására (») Dec 19, 2012 /
 
pik-pak
(#) Kovabe hozzászólása Dec 19, 2012 /
 
Valakinek megvannak a mintaprogramok??
Következő: »»   112 / 360
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem