Napsal: 19 lis 2008, 08:43
Mega8 má jenom 1k paměti, ale nápad je to dobrej a šel by i použít, musela by se použít nějaká mega s větší pamětí.
Vše, co potřebujete vědět o elektronice :-)
http://www.ebastlirna.tech/
Nechápu co tu vymýšlíte za šílenosti, celé to jde udělat pomocí dvou přerušení, od UARTu a od Timeru a zvládne to i tina2313.Ragnol píše:Mega8 má jenom 1k paměti, ale nápad je to dobrej a šel by i použít, musela by se použít nějaká mega s větší pamětí.
viz konec 1. stranycelé to jde udìlat pomocí dvou pøerušení, od UARTu a od Timeru a zvládne to i tina2313
Myslela jsem generovat je softwarově, všech 8 najednou. Samotné generování bez nějaké brutální optimalizace spolkne 35% času procesoru, 65% zbývá na komunikaci, což je až až (v assembleru, ne v C).Anonym píše:viz konec 1. stranycelé to jde udělat pomocí dvou přerušení, od UARTu a od Timeru a zvládne to i tina2313
Krásně se tam vejdou teoreticky, bez režie. Není nutné aby začínaly nastejně, jen musí začínat vždy ve stejný okamžik, což na předchozí stránce uvedené řešení nesplňuje. Šly by použít dva čítače, jeden bude generovat přerušení po 2.5ms a druhým se bude měřit délka impulsu. Ale 8x 12.5% střída se tam nenacpe, možná 12.4%piitr píše:A je vážně nutné, aby ty pulzy začínaly nastejně? Když je budu generovat po sobě, tak těch 8 pulzů po 2,5ms se mi do těch 20ms krásně vejde. A v každé chvíli hlídám jen jeden puls, na což mi 2us krásně stačí.
Ale to je, když dovolíte, omyl.jen musí zaèínat vždy ve stejný okamžik
To jsme si asi nerozumněli. Impuls pro jedno servo musí začínat vždy ve stejný okamžik, jinak by se měnila střída.AA píše:Ale to je, když dovolíte, omyl.jen musí začínat vždy ve stejný okamžik
Postupné posílání impulsů do serv je běžně používáno u modelářských RC souprav.
Pro servo je důležité, aby každých cca 20 ms dostalo řídící impuls. Celkem ho nezajímá, jestli vedlejší servo dostává svůj impuls současně s ním, nebo jindy.
Kód: Vybrat vše
int vstup[8];
int vystup[9];
unsigned char adresa,prijem[16],prijmout,buff,servo;
//adresa - nastavena adresa tohoto ovladace
//prijem - prijate byte
//prijmout - pocet byte k prijeti
//buff - SW buffer pro RX buffer, ten se myslim po prvnim precteni smaze
//servo - index serva, servo[8] je doplnek do 2ms bez vystupu
Preruseni od UART RX:
{
buff=prijaty byte; //presunuti hodnoty z RX bufferu
if(buff>127) prijmout=0; //prisla nejaka adresa
if(buff==adresa) prijmout=15; //prisla moje adresa
if(prijmout>0) //prijem pozic
{
prijem[15-prijmout]=buff;
prijmout--;
}
}
Preruseni citace1 CTC:
{
PORTA=0;
OCR1A=vystup[servo]; //nastaveni nove hodnoty do citace
if (servo<8) //servo existuje - yapnout vystup
{
PORTA=1<<servo;
servo++;
}
else servo=0; //doplnek, vynulovat index
}
Main:
{
for (int i=0;i<=7;i++) //slepeni 3+7 bitu na 10b
{
vstup[i]=0;
vstup[i]=prijem[2*i]<<7;
vstup[i]=vstup[i]+prijem[2*i+1];
}
Prepocitat hodnoty z "vstup" do "vystup"
vystup[8]=40000-vystup[0]-...-vystup[7]; //doplnek do 2ms
}
Kód: Vybrat vše
natahni casovac na vystup[servo]+cas posledniho preruseni;
if ( servo < 8 )
{
PORTA = 1 << servo;
servo++;
}
else
{
PORTA = 0;
servo = 0;
}