Ovladani serva pomoci AtMega 16 nefunguje

ahoj zkusil sem si vygenerovat nasledny pokusny program.

[code]PORTD=0x00;
DDRD=0x20;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2000,000 kHz
// Mode: Ph. & fr. cor. PWM top=ICR1
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x80;
TCCR1B=0x12;

TCNT1H=0x00;
TCNT1L=0x00;

ICR1H=0x4e;
ICR1L=0x20;

OCR1A = 1500;

OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

ACSR=0x80;
SFIOR=0x00;

while (1)
{

int i;

for(i=0; i < 100; i++)
_delay_ms(10);
OCR1A = 1000;

for(i=0; i < 100; i++)
_delay_ms(10);
OCR1A = 2000;
}
}
[/code]

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 :wink:

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)

Nevím jestli je to ono, ale nějak nejsou spárovány složené závorky. V některých případech překladač nenahlásí chybu a přeloží to blbě.[/code]

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.

Zajímavý postřeh, bohužel nesprávný.
Možná nějaký atavismus z Pascalu?

strednik za slozenou zavorkou za while byt nemusi, myslim ze jazyk C znam dost dobre.

Servo pracuje v poradku, overeno pomoci diody.

fnc main je uzavrena zavorkou, vsechny zavorky jsou v poradku, nekopiroval jsem to cely kvuli uspore mista.

Se vším respektem, možná bude příště lepší zkopírovat celý program, kvůli úspoře našeho času.

ta úspora byla asi 10 řádků (pokusně jsem si to nechal vygenerovat)

to - se přiznám jsem nevěděl, jenom vím, že právě Codevision třeba při if-else chybějící, nebo přebývající středník hlásí jako chybu:

if(x==0)
{
neco;
neco;
neco;
};

else
{
neco jineho;
};

hodí error NO MATCHING “IF”

a naopak,když středníky vynechám

if(x==0)
{
neco;
neco;
neco;
}

else
{
neco jineho;
}

error MISSING “;”

proto se moje úvahy ubíraly timto směrem

To znamená, žes to rozchodil (tak to vyznívá), nebo jenom že servo je funkční?

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.

to je realita a nevěříš-li tak stáhni (cvavr evaulation je zadarmo), nainstaluj a zkus, pak mi třeba uvěříš :smiley:

Potom bych tedy asi popřemýšlel, jesli chci tu věc, která nedodržuje ani naprosté základy, dál používat…

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.

Ještě doplním

[code]a naopak,když středníky vynechám

if(x==0)
{
neco1;
neco2;
neco3;
}

else
{
neco jineho;
}

error MISSING “;” [/code]

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.

Bývá zvykem popsat řešení problému, aby se ostatní mohli poučit.
Fridlik nechce ve své skromnosti nikoho poučovat, proto zkusím hádat.

V prvním příspěvku je

A v kódu

// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 2000,000 kHz
Tady mohla být příčina neúspěchu.