Celerone, já tomu nějak nerozumím. A jsem přesvědčen, že nejsem sám. Akorát většina to nepřizná. Asi z úcty k jednomu z největších tapetářů tohoto fóra. To prosím neber nijak zle a osobně, to je jen konstatování skutečnosti.
Takže:
Napíšeš, že máš hotovo (bez dalších podrobností) a přidáš fotku hotového reverzu, který údajně necuká. Fotka je pod textem o zapůjčeném továrním výrobku, což je přinejmenším matoucí. Jen o pár dní později už ale tvrdíš, že to s Attiny85 technicky nejde a vymejšlíš blbosti.
Píšeš cosi o verzi v assembleru, ale dáváš sem pořád zdrojáky v Céčku a ani neuvedeš čím to překládáš. Pokud to překládáš v Arduino IDE, tak nezapomeň, že překladač do kódu dodá aktivaci Timeru 0 a jeho obslužnou ISR kvůli funkcím millis a micros. Ty jsou pro servoreverz zbytečné a jen zdržují vykonávání programu. Pokud by se to psalo v opravdovém assembleru, tak si to tam člověk přece zbytečně nedá. A bůhví co ještě se tam automaticky přidává. On ten Arduino překladač vůbec umí "pěkný věci". Doporučuji přečíst třeba toto:
Arduino poťouchlost – funkce map(). Proto taky nepoužívám funkci MAP a vždy si přepočty dělám "ručně". Mimochodem, autor toho textu se prý ozval tvůrcům Arduino překladače, upozornil je na chybu a navrhl opravu. Dostal odpověď ve smyslu toho, že se o chybě ví, ale nelze přepisovat definice funkcní kvůli zpětné kompatibilitě. Podobně je třeba dávat bacha na
servoknihovnu a taky na
řetězce. A kdoví, jaké další chyby a "ďáblové" se v překladech zdrojáků vyskytují.
Zpočátku pořád uvádíš, že timer je taktován impulsy s periodou 1uS a také píšeš, že strojový cyklus při 8MHz trvá 1uS. Ten timer už tu byl vyvrácen. S prescalerem nastaveným na 1 mají vstupní impulsy timeru periodu 125nS. A co se týká jádra CPU, tak i to lze 8x zrychlit nastavením registru CLKPR, resp. shozením pojistky CLKDIV8 (z výroby je nastavena!). Pak bude i strojní takt 125nS. To se pak člověk nediví, když lidi, než aby si prostudovali datasheet, raději rovnou sáhnou po výkonnějším procesoru.
Pokud se to napíše opravdu efektivně a budou se vybírat primárně 1-cyklové instrukce, tak to chodit prostě musí. Já bych se držel toho algoritmu s odečítáním vstupního servopulsu od 3ms. A je jedno, jestli budou servopulsy 1-2mS, nebo 0,8-2,2mS nebo 0,6-2,4mS. Pokud to bude symetrické kolem středu 1,5mS, vždy je stačí odečíst od 3mS. Na celý program pak stačí jedna jediná proměnná typu byte, která bude suplovat horní byte časovače. Žádný wordy nebo dokonce longy. V mezidobí bude vždy nastavena na 0 a v ISR timeru pak inkrementována a v hlavní smyčce testována. Timer bude vždy spouštěn na náběžku servopulsu a bude nastaven na automatický HW autoreload po 240 taktech (30uS). Je úplně jedno, jak dlouho trvá obsluha přerušení (pokud nebude větší než těch 30uS, což asi nehrozí). V okamžiku jeho obsluhy už si timer pojede dál svým životem. Testování náběžky a sestupky servopulsu a testování dočítání 3mS bych dělal v hlavní smyčce. Viz. průběhy v mém předešlém příspěvku. Nějaká chyba tam bude vždy. Ale určitě ne 2uS a bude víceméně konstantní a je tak možno ji korigovat úpravami hodnot reload a prom. Zkoušel jsem si to napsat na papír v jakémsi "esperantoassembleru" x51 a je to na pár bajtů. Do 2KB Attiny25 se to musí vejít 20x. Snažil jsem se vybírat instrukce, které mají AVR ekvivalent. Bohužel nemám žádný vhodný (=jednoduchý, ideálně pro DOS) AVR assembler, jako je TASM. Nevíte o něčem?
Kód: Vybrat vše
;"x51 esperantoassembler"
;jedno z mnoha moznych reseni
Start:
clr servo_out
di
timer stop, CLKcpu = CLKosc/1
nastavení timeru, prescaler /1, autoreload (256-240 = 16)
timer Interrupt enable
init:
prom = #0 ;nastaveni pom. promenne (MOV, LDI apod.)
jnb servo_in, $ ;cekani na nabezku
timer start
jb servo_in, $ ;cekani na sestupku
setb servo_out ;inverzni servopuls start
cyk: ;cekani na dokonceni casovani 3 mS
mov a, prom ;lze resit mnoha zpusoby (AVR stejne nema akumulator)
cjne a, #100, ($+3)
jc cyk ;prom < 100, opakuj
clr servo_out ;inverzni servopuls stop
timer stop
;spousta casu na stourani se v uchu ci nose...
jmp init ;jdeme cekat na dalsi nabezku
ISR_tim: ;obsluha preruseni od timeru (ma autoreload)
inc prom
reti
Ještě mě napadlo pro sichr dát na ten servovýstup 1nF keramiku proti GND, jako se to doporučuje u výstupu 555 při vazbě na logické obvody. Ale asi (určitě) je to úplně zbytečné.