To varování asi nejde odstranit, protože main má někde prototyp “int main(void)”.
Ale int main() u nových verzí Avr-gcc stejně nevyžaduje napsat návratovou hodnotu
“return(0)”
takže se chová stejně jako void.
To varování asi nejde odstranit, protože main má někde prototyp “int main(void)”.
Ale int main() u nových verzí Avr-gcc stejně nevyžaduje napsat návratovou hodnotu
“return(0)”
takže se chová stejně jako void.
A ještě by mi zajímalo:
Teď jsem stáhnul knihovnu a něco v ní funguje pouze při vyšších rychlostech procesoru. Jak ho mám nastavit např. na 2MHz ? Půjde to přes obyčejný LPT programátor (LPT a pár odporů) a avrdude ?
Díky za info
Vypnutím pojistky(nastavením na 1) CKDIV8 zvedneš frekvenci na 8MHz.
Pokud potřebuješ jinou a/nebo přesnou a stabilní frekvenci, je nutné připojit krystal a opět přeprogramovat fuses. Ovšem avrdude nepoužívám, tak buď se najde někdo jiný, nebo si v tom musíš pochodit sám .
Frekvenciu interneho osc. si nastavis pomocou kalibracnehoo bitu s krokom cca 1%. Citaj manual a najdi konfiguracny bajt pre interny oscilator. Malo by to ist hociakym programatorom s ktorym idu naprogramovat fuses.
Jo, CKDIV jsem už našel.
A ještě bych se zeptal - jak je to s maximální velikostí programu ? ATMega168 má 16kB Flash paměti. soubor .hex co nahrávám má cca 20 kB, při nahrávání to ale hlásí nějakých cca 8kB. Tak co je pravdivé ?
Skus si pozriet obsah suboru HEX.
Zistis, ze kazdy bajt je zakodovany ako dva ASCII znaky. Okrem toho su tam adresne “znacky”. Takze vysledny kod je urcite viac ako 2x mensi ako subor HEX
teďko tady zápasím s problémem: mám string s[11] plné znaků - nul a jedniček.
Potřeboval bych 0. znak vynásobit šestnáctinou, 1. znak osminou , 2. znak čtvrtinou až poslední znak vynásobit 64.
takto mi to pořád nějak nejde (vychází něco okolo 20000): Přetypovávám správně ?
Díky za pomoc
t=0.00625*(int)s[0]+0,125*(int)s[1]+0,25*(int)s[2] ...
To fungovat nebude. Buď musíš pracovat kompletně ve float, nebo najít jinej způsob. Jak jsi proboha přišel k binárnímu číslu uloženýmu jako string??? To je naprostý nesmysl. To číslo jistě půjde získat jako číslo a pak přepočítat na požadovaný rozsah.
Tak jsem to prokoumal,nějak jsem to špatně chápal.
upravuji knihovnu na měření teploty. Tam je string délky 8 jménem s[0] a ten má v sobě např. 10100010.
A já potřebuji první číslo (odzadu) vynásobit 0,0625 + druhé0,125 +třetí0,25 až + osmé vynásobit 8 a výsledek uložit do nějakého float (nebo lépe zaokrouhleně do int)
Půjde to nějak ? Díky za pomoc
Vyřešit to samozřejmě půjde. Otázka je, jesli by nebylo vhodnější z tý obsluhy teploměru vysát přímo to číslo místo řetězce. Není ten řetězec vytvořen nějakou formou itoa nebo podobnou funkcí?.
Když sem dáš zdroják obsluhy teploměru (nebo celej projek), tak to třeba najdem.
V tom intu to má být také jako předtím - tedy desetinásobek teploty?.
tady je v priloze stáhnuta knihovna i se vzorem
upravuji soubor ds18x20lib.c - až tam kde je napsáno začátek úpravy, zbytek vypadá že funguje dobře.
původní knihovna je pro teploměr ds18s20 (posílá data dle přiloženého 1.jpg)
já používám teploměr ds18b20 (posílá data dle přiloženého 2.jpg) - posílá data mírně jinak (běží na 12 bitů) a právě to potřebuji upravit a jde to tak nějak divně.
Vracet by to mělo nejlépe teplotu (kladnou i zápornou) v int vynásobenou deseti (takže přesnost na 1 desetinné místo).
1.zip (158 KB)
Teplotu ze scratchpadu stačí uložit do proměnné int, vynásobit 10, vydělit 16 a máš výsledek v žádaném formátu(10x°C). Je to tam totiž uloženo přímo jako int, jen 16x větší (znaménkové číslo s pevnou řádovou čárkou).
Tady nelze pro dělení použít prostý posun doprava - je to znaménkové číslo. Přesněji řečeno to lze, ale je nutné vědět na co si dát pozor. Zítra na to mrknu. Nebudeš potřebovat float vůbec.
tak jsem se inspiroval jinou knihovnou a podle ní jsem udělal:
Funguje to v kladných teplotách, záporné to neřeší
float digi = 0;//cela cast
float decci = 0;//desetinna cast
int8_t digit;//cela cast
uint16_t decimal;//desetinna cast
float celk = 0;//celkem
digit=scratchpad[0]>>4;
digit|=(scratchpad[1]&0x7)<<4;
decimal=scratchpad[0]&0xf;
decci = ((int) decimal)*625;
digi = (int) digit;
celk = temmp*10 + (float)decci/1000;
return celk;
a dle tvé rady jsem udělal mnohem jednodušší , funguje, pro záporné teploty dává 0
int tt=0;
tt = (int) scratchpad[0]; // low byte
tt |= (scratchpad[1] << 8);
tt=tt*10;
tt=tt/16;
return tt;
[/code]
Právě že jednoduchá varianta by měla fungovat i u záporných teplot. Jen tam máš malou chybku - scratchpad[0] v tomto případě nesmíš přetypovat na int. Pokud by totiž překladač ten byte považoval za signed, odtrhl by nejvyšší bit a hodnota by byla poloviční a stejně tak by z kladného čísla mohl udělat nějaký záporný nesmysl.
Zapiš to jako:
tt = (scratchpad[1] << 8 ) | scratchpad[0];
a mělo by to fachat. Zítra jsem se chtěl pokusit zoptimalizovat dělení, ale jesli ti toto vyhovuje, klidně to tak nech (ušetřil bych jen pár taktů, né tisíce jako předtím).
funguje, i pro záporné teploty
Díky moc
Nedávno jsem zkoušel zapojení s DS18B20, výstup zobrazení teploty na 2x16 znakový LCD.
DS18B20 + LCD_v2.zip (52.9 KB)
To je už několikátý nesprávně sestavený zdroják z více souborů. To by mě zajímalo, kdo vás to takhle učí. Nebo jesli zkoušíte, zkoušíte, zkoušíte… až to napodvacátý projde překladem tak to necháte, vážně nevim.
Samozřejmě snaha se cení, ale tohle přeci není nijak těžký.
Mimochodem ten johnnův projekt taky není sestaven úplně správně (ikdyž už se tomu hodně blíží). Navíc ta zbytečná vlastní delay.
OK, souhlasím s tím že to není správně sestaveno, ale dělá to co potřebuji.
Pokud by tedy někdo byl tak ochotný a napsal vzorový příklad, jak to má celé správně vypadat, tak by to hodně pomohlo dalším lidem zde na fóru.
Děkuji.
O jednoduchý příklad jsem se pokusil již tu:
http://forum.mcontrollers.com/t/avr-studio-projekt-s-vice-soubory-jak-includovat/1721/1
Ještě by mi prosím zajímalo jak udělat celkovou koncepci programu (zřejmě pomocí přerušení). Nikdy jsem s přerušeními nic nedělal. Vždycky to byly jednoduché programy s čekacími smyčkami, které se opakovaly dokolečka.
Teď potřebuji udělat - program stále běží, ale jednou za sekundu proběhne funkce1 (aktualizace teploty na displeji), jednou za sekundu jiná funkce2, při stisknutí tlačítka (je jich více) se provede další funkce3. Jak toto udělat ?
Díky za radu