Sháním: Knihovna pro AVR FloatingPoint (BSD / LGPL licence)

Už jsme to ukrad z nížky Assembler a ZX Spectrum :smiley:

Tak , sčítání , odčítání mi funguje, do násobení se pustím za chvíli. Uvidíme , jak se tak inspiruju ZX spectrem tak zjišťuju , že na AVR je všecko jinak :slight_smile:

Ještě jeden dotaz , je lepší komunikovat s podprogramem přes registry, zásobník, nebo paměť ?

Pouze tvoje volba :slight_smile: Je to úplně jedno. Jak si to napíšeš, tak to budeš mít. Pokud nejsou proměnné přímo vnuceny do paměti (globální nebo volatile) a není dat moc, tak překladač GCC předává parametry přes registry.

Dobrá, násobení funguje , teda aspoň doufám , jestli dobře tuším , tak při 2 bytech potřebuju na výsledek 4 a pri 3 bytech 6 ?

Když chceš výsledek celej, tak ano. Většinou se ovšem ořezává/zaokrouhluje na šířku vstupujících operandů.

Nu abych to upočítal tak musím počítat dohromady v 9ti registrech :slight_smile:
takže to spočítám a jak si to tu tak simuluju na AVR a na kalkulače, tak pokud budu počítat jen s 10bit AD převodníkem , můžu uříznout nejvyšší 2 bajty a jeden nejnižší a měl bych se vejít. Souhlas ?

Těžko říct. To záleží, co budeš počítat a co s výsledkem.

Budu počítat napětí na vstupu DA převodníku,
takže budu násobit číslo 0 až 1023 * 2.56 (nebo 5, nebo i jinak, podle děliče , ale určitě to nebude víc, než 20 ) a takže mi podle kalkulačky vychází vždycky 2 spodní bajty prázdný , daší dva by měla bejt celá část a další 2 bajty by měly bejt za desetinou čárkou , aspoň speedcrunch to tvrdí (počítáno v hexa):slight_smile:

Když už, tak napětí=ADC*Vref/1024. Není mi ovšem jasný, proč si to komplikuješ desetinnejma číslama. Každopádně během výpočtu budeš potřebovat 2B pro celou část, výsledek se pak vždy vejde do 1B. Desetinná část bude dle libosti.

Když by sis Vref dosadil v mV, výsledek bude taky v mV a nepotřebuješ žádný zlomky. Výpočet bude:
temp=ADC*Vref[mv]; temp: 4B, ADC: 2B, Vref: 2B
U[mV]=temp>>10; U: 2B (spodní 2B výsledku posunu temp o 10b doprava), temp: 4B.

Komplikuju to , ani nevím proč , takže tady mám momentálně ADC * 2.56 *10/1024, vypadá to zatim, že to funguje , hází mi to na port stejný výsledky s multimetrem, co u mám.

Jinak ten desítkovej základ jsi mi rozmluvil na začátku , tak jsem to vzal v rámci učení se binárně :smiley: :smiley:

Jestli se chceš zasmát, tak ten výtvor přikládám.
zázrak.asm (4.19 KB)

Zápisy typu “(0<<MUX4)” jsou tam zbytečné :wink: Význam mají pouze shifty jedniček nebo jiných nenulových čísel.
Jinak ti k tomu ovšem moc neřeknu, asm není můj šálek kávy :slight_smile:
Máš tam komentář “nastavit AD převodník , jedeme freerun , cca 90 kHz” - krystal máš 11.0592 MHz? Pokud ano, tak dělička pro uart má být 11 (nikoli 12).

Vím o tom , lyže sejmout , to tam mám, abych to viděl a nemusel to znovu hledat v datasheetu, když budu chtít něco změnit , ještě si hardware nepamatuju. těch 90 je tam od oka , ono je to asi 94 :smiley: , krystal je 12 MHz.
Na kolika to opravdu kmitá nevím, když připojím blokovací kondíky, tak to kmitat přestane.
Můj šálek kávy to taky není, ale víc, než C :slight_smile:
Každopádně od PC to příkazy bere a výsledky to taky posílá, zdá se , že i správný .

Jen to nemuselo trvat 48 hodin čistýho času , těch 384 bytů kódu pro AVR :slight_smile:

Zatěžovací kondiky krystalu dávám 12pF a běhá to vpoho. Na 12MHz máš ten uart dobře.
V C je to práce na půl hoďky, max. na jednu když se budeš flákat. :smiley:

Nevím , měl jsem tam 22 , asi mám moc velkou parazitu na plošňáku.
Tak ono v tom ASM , pokud tomu člověk hoví to vyjde asi tak na stejno, pokud nemáš nějaký knihovny , napsat cca 160 instrukcí nemůže trvat o moc dýl , než tu hodinu hodinu :slight_smile: Těch 47 zabralo vymejšlení přemejšlení a zkoumání hardware přecijen s tim začínám a už nejsem nejmladší, tak mi to hlava odmítá :slight_smile: