fulda píše: ↑08 dub 2021, 13:50
Tak a teď dva otevřené body:
- Při vnitřním oscilátoru máme navíc dva vstup/výstupy, které lze použít. Otázka je, jak je arduino označí? (to snad časem dohledám v knihovnách)
Nijak. Ale můžeš si udělat vlastní definici, vzor viz např. Arduino\hardware\arduino\avr\variants\standard\pins_arduino.h
fulda píše: ↑08 dub 2021, 13:50
- Knihovny počítají výhradně s kmitočtem 16MHz, což je pro arduino běžné, ale není to jediná možnost. Dovedu si představit situaci, že zvětším počet "procesorů" a ke každé si nastavím jinou pracovní frekvenci (něco jako je u arduina pro). Pak si upravím vkládaný "main", který nastavuje příslušnou frekvenci. V definici procesoru bude zadaná rychlost, takže mi budou sedět přepočty pro "milis" a nebo pro sériový port
Frekvence je nastavená jako konstanta, takže už při kompilaci se "zafixuje" a všechny knihovny, které ji nějak používají, prostě mají tuhle hodnotu, ať děláš za běhu, co chceš. Tj. při kompilaci je možné to nastavit, za běhu ne.
Je to (přinejmenším) ve dvou konstantách F_CPU a AVR_FREQ, které se používají typicky pro nastavení periferií, zejména pro nastavení předděličky toho, co svou pracovní frekvenci odvozuje od hlavních hodin. Aby ti ta změna za běhu fungovala správně i pro knihovny, musel bys ty knihovny přepsat a místo konstant (vznikly přes #define v kódu nebo přes přiřazení v Makefile) to přinejmenším předělat na proměnné, ale ani to by nestačilo, bylo by potřeba udělat si mechanismus, který při každé změně správně přenastaví, co je potřeba. Good luck.
Jo a týká se to samozřejmě jak uživatelského kódu, tak bootloaderu.
fulda píše: ↑08 dub 2021, 13:50
Otázka je, jestli je to správný směr? Jestli v arduino světě neexistuje nějaký magický příkaz pro změnu rychlosti "za běhu"?
Jednoduché
abrakadabra(4000000);
tam není. Za běhu je možné hodiny měnit podle toho, co konkrétní mikrokontroler dovolí, ale knihovny ani jiný kód v Arduinu nejsou napsané tak, aby to bez ztráty kytičky správně pobraly. Tj. změníš frekvenci, ale kód o tom neví a funguje jakoby se nic nezměnilo. Protože se všechno časování (až na Watchdog) odvíjí od základní frekvence, tak pak po změně taky všechno pojede příslušně jinak rychle (z hlediska pohledu zvenku), např. komunikace - když někdo napíše Serial.begin(9600) a pak změní frekvenci na čtvrtinovou, tak pro správnou komunikaci zvenku je tam venku (třeba Serial Monitor v PC) nastavit 2400. To je zjevně případ, cos popsal - pro kompatibilitu s Arduino knihovnama se nastavuje na 16MHz, ale defaultně má 4MHz, takže bez správného nastavení prostě jede 4x pomaleji.
ATmega328P i PB mají možnost změny pracovní frekvence změnou prescaleru (registr CLKPR). U toho LGT8F328P to je podle toho co píšeš udělané stejně, a to jak hodnoty prescaleru v dolních 4 bitech registru, které určují mocninu dvojky pro dělení frekvence, tak co se týče přepnutí frekvence dvěma kroky,
CLKPR=0x80;
a do 4 taktů
CLKPR=tocochci;
. To je ostatně standardní postup pro změnu citlivých věcí, k vidění třeba u přepínání Watchdogu nebo zápisu do EEPROM.
Abych tak řekl - jestli chceš používat Arduino a jeho filozofii, na hodiny nesahej. Jestli chceš na hodiny sahat, tak nemůžeš použít Arduino tak, jak je udělané.