Smazat příspěvek

 Chystáte se smazat zprávu (se všemi případnými odpověďmi) z kategorie Hlavní diskuze:


27.10.2016 (16:10:25)
bkralik (web) :
Nazdar,
mám menší hádanku pro místní zkušené AVRkaře
Mám následující kód:
http://bin.bkralik.cz/?b830d14e8ff48150#svdZvFEGRCmKEv0...

Taktovací frekvence procáku je 16 MHz. Zkoušel jsem to na Atmega 328p. Překládáno gcc.

Já jsem doufal, že z toho poleze obdelník o f = 61 Hz. (16 MHz / 16bit / 2 / 2). Bohužel, leze z toho humus (screen z osciloskopu hodím večer), aktuálně to vypadá, že to ten výstupní pin zatoggluje už při povolení nebo vypnutí toho flagu COM1A0. Netušíte někdo proč?
27.10.2016 (18:29:59)
RayeR (web) :
Nejak nechapu o co se snazis v te obsluze preruseni, a proc vlastne potrebujes vubec resit preruseni pri preteceni. Pokud ten timer pobezi volne, tak pretece a zacne pocitat zase od 0 a kdyz docita na komparacni hodnotu, tak zas se automaticky preklopi pin a tak se bude preklapet dokola. Nebo co ma bejt ucelem ?
27.10.2016 (19:16:21)
bkralik (web) :
<tady byl asi desetiřádkovej blok textu kde jsem se snažil vysvětlit problém>

Dík, už jsem si uvědomil kde je chyba - celej můj problém je, že se snažím generovat frekvenci nižší, než se vejde od přetečení k přetečení v těch 16 bitech. Moje myšlenka byla založená na tom, že Toggle-on-compare-match budu mít vypnutej až do tý chvíle, než nastane ta správná chvíle (a to se vždycky zkontroluje v tom overflow přerušení), jenže to celé naráží na problém, že u AVRka je ten OC1 pin připojenej přes multiplexer ovládanej flagem COM1Ax. Ten timer nehrabe do PORTx registru vůbec. Takže já jsem shodil COM1A0, protože jsem nechtěl toggle na příštím compare-match, ale v tu chvíli se mi odpojila speciální funkce pinu a připojil se mi na něj registr PORTB, kde byla uložená nula.

No, nevadí, alespoň už vím kde mám chybu a zkusím to napsat jinak **02
27.10.2016 (20:05:50)
milan obalka :
Tak si nastav bity CS10, 11 a 12 jinou předděličku.
Jinak pokud potřebuješ přesně 16MHz takt, tak si mužeš použít časovař, který umí brát signál z jiného krystalu, nebo pokud ti to neva, tak to udělej ručně takto:
1) čítač s přerušením od OC - porovnává načítanou hodnotu s tou, kam chceš načítat
2) v přerušení při shodě neguješ pin, kde chceš mít PWM, přičemž pin je konfigurován jako normální výstup
3) poté co neguješ pin, vynuluješ TCNT registr(y) aby čítání začlo od nuly.
Poté si nastavuješ frekvenci tak, že v OCR máš hodnotu poloviny periody. tudíž mužeš generovat dvakrát delší signál, oproti tomu použít přímo PWM mod.
nevýhoda je, že přerušení od časovače muženastat když se procesor sere s jiným přerušením... takže se to to muže zpozdit o něakou tu mikrosekundu. což u 61Hz asi problém nebude. **01
27.10.2016 (22:19:28)
VroutekB:
S jinou předděličkou půjde do prdele rozlišení kmitočtu a tu jde navíc o generování signálu od několika Hz do asi 800Hz nebo jak to bylo.
TImeru navíc nelze předřadit větší děličku, protože druhý kanál je ve režimu input capture použit pro měření kmitočtu na vstupu. (a ano, zvětšení děličky by opět přineslo prdelní rozlišení měření).
27.10.2016 (22:33:51)
milan obalka :
tak to sem nevěděl no. sem čekal, že potřebuje jen generovat jednu frekvenci, 61Hz.
A teda pokud to nepujde ručně, jakože nepujde, pač vynulovat si TCNT tak to je naprd když dle toho měří...
Ale tak když se v tom zdrojáku nastaví portB na hodnotu, která tam má být po vypnutí PWMM, tak to snad už bude dobrý.
27.10.2016 (23:40:17)
RayeR (web) :
Na neke jemne generovani ruznych frekvenci se asi vic hodi PLLka... To pred tim nebylo receno, ani ze to ma este nakou f nekde merit, to zas tahate z naky krystlboool...
27.10.2016 (23:48:56)
bkralik (web) :
No na co to je jsem neříkal, protože to není podstatný - všechno co jste tu navrhli jsem taky tušil, potřeboval jsem nakopnout s tím, proč mi nefunguje ten demonstrační příklad co jsem poslal...

Jinak mělo by to čítat frekvenci na vstupním pinu a na výstupu produkovat obdelník s K-krát větší frekvencí. To K ideálně spojitě nastavitelné potenciometrem tak od 1 do 4. A vstupní frekvence v rozsahu cca 10 Hz až 500 Hz **23


Přezdívka:*
Heslo:*

  █   ███   █ █   
 ██   █ █   █ █   
█ █   ███   ███   
  █     █     █   
  █   ███     █   
Opiš:*

Zde můžete smazat vlastní vlákno nebo kteroukoliv odpověď v něm. Můžete smazat vlastní odpověď v cizím vlákně, pokud na ni ještě nikdo jiný nereagoval. Mazat cizí vlákna a odpovědi v nich mohou pouze admini. Smazání příspěvku je nevratná operace! Smazáním vzkazu se smažou i odpovědi na něj.
Seznam uživatelů
Zpět na knihu