Na Atmegu jsem pripojil servo a cekal ze bude nejak reagovat ale nic se nestalo, zajimalo by me kde je chyba. Mam Atmega16, bezi na 16Mhz a servo mam HS311. Prosim poradte, rad bych to servo rozchodil
nevím jak jsi na tom s programováním AVR, jestli je to první co zkoušíš a tak - bez urážky - víš jestli ti vůbec ta Mega jede? Podle programu neděláš nic jiného, než že po 10ti ms plníš registr OCR1A, ale zkus jen tak pro kontrolu blikat ledkou na jiném výstupu. Dále nevím o jaké servo se to jedná, ale pkud ho máš na přímo na výstup OC1 tak pamatuj že má proudové omezení 40 mA- abys ho neodpálil.
Když napíšeš ICR1=0x4e20; namísto rozdělování do H a L registru tak si s tim překladač poradí, stejně tak tam může být dekadická hodnota.
To je jen takový detail.
Používej u souvisejících registrů (např. ICR1 a OCR1) stejnou číselonou soustavu.
Při konfiguraci nepoužívej všelijaký šílený čísla, ale názvy bitů.
např. TCCR1B |= (1<<nazevbitu) | (1<<nazevjinehobitu); // nastaví jmenované bity do 1, ostatní nechá
Potom se možná bude někdo obtěžovat zkontrolovat nastavení, případně přepočítat pwm
servo mam HS311 pisu to uz v prvnim prispevku. Samozrejme to neni muj prvni pokus s AtMegou, diodu v pohode rozblikam s tim nemam problem, na 16MHz sem taky prepnul fuse sam.
Takze jestli to chapu spravne, tak jsem si mohl odpalit vyvod na portu, zkusim to overit ale nemyslim si to.
A ten pogram by mel fungovat tak ze naplnim ten registr OCR1A a pak pockam 1s. mel to byt jen pokus jestli to servo vubec rozjedu, ale vubec nic. serva jsem zkousel 2.
Lou asi to servo nehledal, jinak by věděl, že na portu nemáš přímo cívky jeho motoru, ale signálovej vstup.
Na ten pwm výstup můžeš přidat ledku. Pokud je změna pwm dostatečná a pwm jede, měla by měnit jas. Víc ti k tomu neřeknu, protože se mi nechce luštit ty haluz čísla, co tam všude máš.
Pokud jde servem ve vypnutém stavu pohnout, tak s ním pootoč, po zapnutí bez signálu by se mohlo vrátit do základní polohy.
servo jsem opravdu nehledal
a k těm “haluz číslům”- ty mu tam generuje wizard compilleru (taky ho používám) takže fridlikova práce je jen to v nekonečné smyčce
Program by měl chodit.
Na zkoušku bych nastavil předdělič 1024 a sledoval výstup ledkou.
Při zkoušení serva ho napájím zvlášť třemi suchými články.
Proud serva při rozběhu je i několik ampér a při napájení z jednoho zdroje může resetovat procesor.
Používat tvrdý zdroj pro servo při testování je nebezpečné,
při najetí na doraz může očesat ozubené kolečka.
nevrati , bez ovladaciho signalu se ani nehne , pokud de zatim jenom o to hnout servem nebo ho vyskouset tak bych doporucil obycejnou cekaci smycku, impuls 1 - 2 mS impuls kazdejch 18 mS, 1.5 mS je stred, neprekracovat hodnoty impulzu (1 - 2 mS)
To jsem ani tak na mysli neměl - myslel jsem spíš na to abys měl nějakou kontrolu jestli ti vůbec procesor pracuje - třeba blikáním v tom 1 sec intervalu.
Jelikož fridlik nezkopíroval celý kód vytvořený wizardem tak tam není vidět, že poslední sl. závorka uzavírá fci “main”.
ale chyba tam přeci jen je : za sl. závorkou uzavírajíci smyčku while chybí středník - překladač ji proto bere jako konec fce “main” a while prakticky ignoruje.
Tohle je nepravděpodobné, tady žádný středník nechybí. Za úplným, ale ani částečným ozávorkovaným if se ; nepíše. Výjimka je jednořádkový if s příkazem, tam ale nepatří středník k ifu, ale k příkazu.
Neuvěřím, zkoušel jsem v CV.
Ostatně v tak elementární věci jako je použití středníku se nemohou překladače lišit.
Středník za příkazem znamená ukončení příkazu.
Jinde znamená středník prázdný příkaz.
if(x==0)
{
PORTB=1;
PORTD=2;
};
else
{
PORTD=3;
}
}
Toto je chyba syntaxe, kterou nestráví žádný překladač.
Před else nemůže být žádný příkaz, a středník je příkaz, i když prázdný.
Naopak
if(x==0)
{
PORTB=1;
PORTD=2;
}
else
{
PORTD=3;
};;;;;;;;
Tady může být středníků kolik libo, nemají na nic vliv.
Tato chyba se objeví když chybí středník za některým příkazem.
Když např chybí za příkazem neco3, tak CV ukazuje na složenou závorku za tímto příkazem.
To může vést k omylu, že středník chybí za závorkou.