Dobrý den, prosím o vysvětlení principu spoždění v delay.h.
Mám nastaveno F_CPU 16000000UL (atmega644p)
a když dám v programu _delay_us(480)
vykoná mi to spoždění 480us? nezávisle na F_CPU.
Zde je kus kodu z knihovny delay.h a delay_basic.h, nějak se nemůžu dopočítat jak to opravdu vychází,v komentáři jsou uvedené moje vypočítané hodnoty, díky za pomoc.
Jistěže rutina je závislá na F_CPU.
Vykoná pro určité zpoždění určitý počet cyklů.
A tento počet se liší podle kmitočtu oscilátoru.
Proto výsledné zpoždění na F_CPU nezávisí.
Kdyby to na F_CPU nezáviselo, tak by to počítalo správně bez ohledu na hodnotu F_CPU, což je samozřejmě nesmysl. Závislé na F_CPU to je a to tak, že zásadně. F_CPU musí být shodná s frekvencí mcu, jinak nebude zpoždění souhlasit. To AB samozřejmě ví, ale napsané je to… řekněme zvláštně.
Jestliže F_CPU je 1MHz a kmitočet oscilátoru je 1 MHz, pak _delay_us(100) trvá 100 us.
Jestliže F_CPU je 8MHz a kmitočet oscilátoru je 8 MHz, pak _delay_us(100) trvá 100 us.
Jestliže F_CPU je 16MHz a kmitočet oscilátoru je 16 MHz, pak _delay_us(100) trvá 100 us.
Pokud F_CPU a kmitočet oscilátoru nesouhlasí, pak _delay_us(100) netrvá 100 us.
Správnost tohoto tvrzení AB jsem si nedobrovolně vyzkoušel při svém prvním pokusu, kdy celý cyklus trval místo 8 sekund 1 sekundu. Důvod byl právě v nesprávně určené frekvenci v programu. Mcu měl 8MHz a do programu jsem uvedl nesprávně, že má 1MHz. Proto celý cyklus trval 1/8.
Díky všem za rady,udělal jsem simulaci jak radil AB kde jsem vynululoval Cycle counter a spoždění jsem nastavil na 500us a při simulaci vychází cca 125us,Je to 4x méně než požadované spoždění.
Tak jsem zkontroloval frekvence F_CPU a frekvenci asi oscilátoru nebo co to je a F_CPU = 16MHz a frekcence osc = 4MHz to je asi ten rozdíl 4x.
Bohužel s programováním začínám takže mi toto není moc jasné, kdyby to někdo mohl vysvětlit,jestli mám v programu zadávat 4x vetší spoždění než požaduji, případně upravit soubor delay.h pro jednotlivé frekvence F_CPU.Díky
frekvencia v simulatore sa dost “od veci” nastavuje v menu debug. Dlho mi trvalo, kym som to nasiel. Tam to niekde najdes. Je to v podmenu, kde sa da nastavit aj stimuly subor pre imitovanie vplyvyu okolia. Pre niektore typy mcu nepomoze ani toto nastavenie frekvencie. Ale tusim sa s tym stretol iba raz.
Mikroprocesor má uvnitř zabudovaný oscilátor (Internal RC oscillator). Ten je z továrny nastavený na 1 MHz.
Pokud ho takto použijeme, uvedeme v kódu:
#define F_CPU 1000000UL
Tím říkáme překladači:
"Oscilátor v našem mikroprocesoru kmitá na frekvenci 1 MHz. Nastav podle toho funkce delay() ".
Pokud chceme použít krystal, musíme pomocí programátoru ve fuse bitech změnit typ oscilátoru na krystalový (Ext. crystal nebo full swing) a připojit krystal.
Řekněme že nastavíme a připojíme krystal 16 MHz.
Oscilátor v mikroprocesoru teď bude kmitat na frekvenci krystalu.
A v kódu uvedeme #define F_CPU 16000000UL.
Tím opět informujeme překladač o skutečném kmitočtu oscilátoru v mikroprocesoru. Zpoždění budou fungovat jak mají.
Takže nic nenásobíme a žádné soubory neupravujeme.
Stačí když v definici F_CPU bude skutečný kmitočet oscilátoru v mikroprocesoru. Pak fungují zpoždění správně.
Ostatně, proč to nevyzkoušíš v reálu s blikající Ledkou?
Díky všem za objasnění,
tak v reálu mi spoždění funguje správně, zkoušel jsem to na vyčtení teploty z DS18B20 tam hodnoty spoždění fungují dle datasheetu. Jen jsem chtěl pochopit na jakém principu to spoždění funguje, když už to používám. Už jsem nastavil i frekvenci simulátoru a vše ok, díky všem za pomoc.