![Sad :(](./images/smilies/icon_sad.gif)
Ovladani osmi serv pomoci UARTu
Moderátor: Moderátoři
Tak si na to vyrob tabulku. Index bude 0..8 (číslo serva a doplňující mezera), hodnota bude výstup na dané porty (třeba 2 bajty). Stejně pochybuju, že ti ten překladač rozumně přeloží 1 << n. Já trochu znám PIC16F84, 6502, 8080 a tam taková instrukce není. Takže na Atmelu bych ji taky nečekal. Je třeba na 8086.
Já nevím, třeba ji Atmel má, já ho neznám. Ale na těch osmibitech, co znám, není. Tam se to musí řešit opakovaným posouváním o 1 bit, což by v tomhle případě mohlo pokazit časování a prodloužit tu obsluhu přerušení. Proto jsem na to upozorňoval.mihal píše:1<<n nebude to nahodou rotate n left? To musi poznat kazdy proc ako zakladnu instrukciu, preto to asi poznaju aj vsetky C kompilatory.
Instrukciu posunu napriklad o 3b som nevidel, ale kompilatory C to riesia nasobnym posunom - tu skutocne pride k roznym casom pri roznom posune. Napisat casovo kriticku rutinu v C je hovadina, treba to pisat v asm a posuny dorovnat dummy instrukciami.
Este k tym instrukciam, freescale od HC08 ma instrukciu nibble swap, co je 4-nasobny posun jednou instrukciou.
Este k tym instrukciam, freescale od HC08 ma instrukciu nibble swap, co je 4-nasobny posun jednou instrukciou.
Já si jenom tak "rýpnu"
http://avrhelp.mcselec.com/index.html
Kliknout na "Search" a zadat Config servos
![Smile :)](./images/smilies/icon_smile.gif)
http://avrhelp.mcselec.com/index.html
Kliknout na "Search" a zadat Config servos
Otázka je, jestli to zvládne krok 2us. Spíš tam píšou, že by to mělo být 10us. I kdyby to zvládlo míň, tak se změní frekvence výstupu (píšou to tak). Takže bych, řekl, že tohle rýpání je naprd.Anonym píše:Já si jenom tak "rýpnu"![]()
http://avrhelp.mcselec.com/index.html
Kliknout na "Search" a zadat Config servos
anonym:
klidne si rejpej, ale ja to chci cele postavit a naprogramovat sam. Kdybych na tom nechtel nic delat, koupim hotovy modul a vykaslu se i na knihovnu.
ostatni:
existuje nejaky dekadicky citac (jako 4017), ale obsahujici vstup na povoleni/zakazani vsech vystupu?
(4017 ma jen CLK, negCLK, reset a vystupy)
klidne si rejpej, ale ja to chci cele postavit a naprogramovat sam. Kdybych na tom nechtel nic delat, koupim hotovy modul a vykaslu se i na knihovnu.
ostatni:
existuje nejaky dekadicky citac (jako 4017), ale obsahujici vstup na povoleni/zakazani vsech vystupu?
(4017 ma jen CLK, negCLK, reset a vystupy)
Co tam dát 74HC238 a to čítání řešit sw v procesoru?K.Pavel píše:anonym:
klidne si rejpej, ale ja to chci cele postavit a naprogramovat sam. Kdybych na tom nechtel nic delat, koupim hotovy modul a vykaslu se i na knihovnu.
ostatni:
existuje nejaky dekadicky citac (jako 4017), ale obsahujici vstup na povoleni/zakazani vsech vystupu?
(4017 ma jen CLK, negCLK, reset a vystupy)
Jenže ono se může stát, že se ten čítač posune "sám", když se posunout neměl (rušení) a rázem budeš "mimo mísu" a procesor o tom nebude mít tuchy. Pro nějaké zatmívání nevidím důvod. Na adresní vstupy demuxu přivedeš adresu serva a na ENable přivedeš puls z čítače. Když puls skončí (demux se tím zablokuje), nastavíš další adresu a čítačem vygeneruješ další puls, a tak dál...K.Pavel píše:Andrea:
ten demux jsem myslel puvodne, pak me napadlo mozne zjednoduseni tim citacem (adresa by se posouvala sama, nemuselo by se nic "zatmivat").
Pristi tyden se dostanu domu, tak zacnu vyrabet HW. Ten demux snad bude stacit.
U 4017 bych reset ovladal SW, takze v pripade problemu by se odeslala jen jedna spatna davka.
Kdyz uz tam bude demux, tak na jeho enable vstup budu poustet automaticky generovany PWM. Perioda bude 2,6ms a budu menit stridu.
V preruseni vlozim novou hodnotu stridy a prepnu vystup demuxu.
Jsou tady ale dva problemy, OCR1A je v tomhle pripade doublebufferovany a nacita se hned po preteceni, takze pri preruseni uz musim vlozit hodnotu pro nasledujici servo.
Dalsi je, ze v okamziku preruseni vyskoci vystup na 1 a az chvilku potom zmenim vystup, coz se projevi kratkym impulsem na minulem servu. Ted me ale napadlo, ze by se to dalo odstranit invertovanim PWM, takze po preruseni bych byl minimalne 0.1ms na 0.
Pripadne opet pouzit CTC rezim a pri preteceni prepnout adresu a az pak nahodit 1 a hodnotu pro servo ukladat do OCR1B, pri preruseni od ORC1B comp. pak shodit vystup na 0.
To PWM mi prijde takovy cistsi, kazde servo bude dostavat impuls se stejnou periodou (zadnej slepenec a pak cekat) a i v pripade, ze bude preruseni od RX, nebude zadny zpozdeni vystupu.
Kdyz uz tam bude demux, tak na jeho enable vstup budu poustet automaticky generovany PWM. Perioda bude 2,6ms a budu menit stridu.
V preruseni vlozim novou hodnotu stridy a prepnu vystup demuxu.
Jsou tady ale dva problemy, OCR1A je v tomhle pripade doublebufferovany a nacita se hned po preteceni, takze pri preruseni uz musim vlozit hodnotu pro nasledujici servo.
Dalsi je, ze v okamziku preruseni vyskoci vystup na 1 a az chvilku potom zmenim vystup, coz se projevi kratkym impulsem na minulem servu. Ted me ale napadlo, ze by se to dalo odstranit invertovanim PWM, takze po preruseni bych byl minimalne 0.1ms na 0.
Pripadne opet pouzit CTC rezim a pri preteceni prepnout adresu a az pak nahodit 1 a hodnotu pro servo ukladat do OCR1B, pri preruseni od ORC1B comp. pak shodit vystup na 0.
To PWM mi prijde takovy cistsi, kazde servo bude dostavat impuls se stejnou periodou (zadnej slepenec a pak cekat) a i v pripade, ze bude preruseni od RX, nebude zadny zpozdeni vystupu.