Arduino a servo

Dneska se procesory objevují všude, pokud máte nějaký nápad, či udělát, tak se neváhejte pochlubit.
Odpovědět
Zpráva
Autor
Uživatelský avatar
YenyaKas
Příspěvky: 1335
Registrován: úte 17.01.2017 10:48
Bydliště: Brno
Kontaktovat uživatele:

Re: Arduino a servo

#76 Příspěvek od YenyaKas »

jyrry píše:To už je vyšší dívčí, já mám jen strojárnu. Plavu už jen v tom zápisu, samý znaky... :?


Co konkrétně?

Kód: Vybrat vše

_BV(x)
je nějaké makro ("bit value") z avr-libc, značí x-tý bit v bajtu, čili totéž jako 2 na x-tou nebo céčkovsky 1<<x.

Kód: Vybrat vše

něco &= ~_BV(x)
je vynulování x-tého bitu v něco, podobně

Kód: Vybrat vše

něco |= _BV(x)
je nastavení x-tého bitu v něco.

avr-libc pro každý cílový procesor definuje globální proměnné pojmenované stejně jako registry v datasheetu (třeba TCCR1B je timer/counter control register B pro časovač/čítač 1) a pokud má registr pojmenované nějaké bity, tak definuje ještě konstanty pro ty bity. Význam těch registrů a bitů je vždycky v datasheetu konkrétního procesoru. Programuje se s tím trochu těžkopádněji než když ty registry "nějak" obalí Arduino IDE tou svou nadstavbou, ale zase člověk vidí co přesně za tím je přesně podle datasheetu. Zatímco když by používal nějaké micros(), tak by mohl jen hádat, jak je to asi implementované, a který časovač tím zabere, nebo u Serial.print tipovat, kdo a na jak dlouho zakáže někde přerušení.

Třeba

Kód: Vybrat vše

TCCR1B &= ~_BV(ICES1);
znamená shození bitu ICES1 v registru TCCR1B, což nastavuje input capture tak, že příště budeme chtít zachytit čas sestupné hrany a dostat o tom přerušení.

Kód: Vybrat vše

ISR(něco)
definuje funkci, která je ovladač přerušení něco. Tohle zase záleží na konkrétním procesoru, jaká přerušení podporuje. Třeba tady TIMER1_CAPT_vect je přerušení od input capture unit časovače/čítače 1.

No však kdyžtak se ptej.
Sky Surfer; HK Paraglide; DYI: samokřídlo Ita, elektrovětroň Kaze, delta Quasar3D; FlySky i6
Uživatelský avatar
YenyaKas
Příspěvky: 1335
Registrován: úte 17.01.2017 10:48
Bydliště: Brno
Kontaktovat uživatele:

Re: Arduino a servo

#77 Příspěvek od YenyaKas »

BoŠ píše:Jj, u Megy je Input Capture Unit dobrá volba, u Tiny se to musí ošetřit jinak.

Asi jak která Tiny, třeba moje oblíbená ATtiny861a na T/C0 má input capture unit.
Sky Surfer; HK Paraglide; DYI: samokřídlo Ita, elektrovětroň Kaze, delta Quasar3D; FlySky i6
Uživatelský avatar
YenyaKas
Příspěvky: 1335
Registrován: úte 17.01.2017 10:48
Bydliště: Brno
Kontaktovat uživatele:

Re: Arduino a servo

#78 Příspěvek od YenyaKas »

BoŠ píše:Btw, bity se počítají zleva, 0 až 7.

Já si teda i v reálném životě pletu pojem levá a pravá, ale tady jsem si docela jistý, že je to přesně naopak - vlevo je bit 7 (0b10000000) a vpravo je bit 0 (0b00000001).
Sky Surfer; HK Paraglide; DYI: samokřídlo Ita, elektrovětroň Kaze, delta Quasar3D; FlySky i6
Uživatelský avatar
ellet
Příspěvky: 2401
Registrován: pát 12.02.2016 11:37
Bydliště: Vysočina, ČR

Re: Arduino a servo

#79 Příspěvek od ellet »

jyrry píše:To už je vyšší dívčí, ....
Ale těchto pár řádků se ti možná bube víc líbit. Načte to délku pulsu do proměnné.....

Kód: Vybrat vše

volatile unsigned int Ticks;     
int icpPin = 8;         // Arduino pin 8

ISR(TIMER1_CAPT_vect){
   if( bit_is_set(TCCR1B ,ICES1)){
    TCNT1 = 0;            
   }
   else {               
     Ticks = ICR1;
   }
   TCCR1B ^= _BV(ICES1);         
}

void setup()         
{
  //Serial.begin(9600);
  pinMode(icpPin,INPUT);
  TCCR1A = 0x00;      
  TCCR1B = 0x02;      
  Ticks = 0;      
  TIMSK1 = _BV(ICIE1);   
}

int getTick() {
  int akaTick;   
  cli();      
  akaTick = Ticks;
  sei();      
  return akaTick;
}

void loop()      
{
//......
}

Padlo mně to náhodou do oka....
Uživatelský avatar
YenyaKas
Příspěvky: 1335
Registrován: úte 17.01.2017 10:48
Bydliště: Brno
Kontaktovat uživatele:

Re: Arduino a servo

#80 Příspěvek od YenyaKas »

Tady se podle mě připravuješ o část přesnosti tím, že u vzestupné hrany nuluješ čítač, což v případě že v systému běží i jiné věci zakazující občas přerušení (třeba ten Serial) může znamenat, že se k vynulování dostaneš až dlouho po začátku toho pulzu. Podle mě je lepší nechat čítač plynout furt pryč, a sledovat rozdíl mezi časem náběžné a sestupné hrany, v obou případech zaznamenaným přes input capture unit. V céčku je u unsigned datových typů definováno přetečení standardním způsobem, čili rozdíl čas_sestupné - čas_náběžné dá délku pulzu bez ohledu na to, jestli ten časovač mezitím přetekl a začal znovu od nuly nebo ne.

Jo a ještě tiše předpokládáš, že getTicks() bude voláno s povoleným přerušením. Lepší než cli() a sei() je uložit aktuální stav, cli(), vrátit uložený stav. V AVR-libc se to dělá nějak jako

Kód: Vybrat vše

#include <util/atomic.h>
...
      ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
           akaTicks = ticks;
     }
...


A všude je lepší používat unsigned typy, u nich je dobře definováno přetečení. Ostatně délka pulzu i tak nemůže být záporná. A nejlépe se netajit tím, s jak velkým typem pracujeme. Takže já bych vracel uint16_t místo prostého int.
Naposledy upravil(a) YenyaKas dne úte 20.03.2018 23:10, celkem upraveno 1 x.
Sky Surfer; HK Paraglide; DYI: samokřídlo Ita, elektrovětroň Kaze, delta Quasar3D; FlySky i6
Uživatelský avatar
ellet
Příspěvky: 2401
Registrován: pát 12.02.2016 11:37
Bydliště: Vysočina, ČR

Re: Arduino a servo

#81 Příspěvek od ellet »

Máš pravdu, diskutovat se o tom dá. Beru to ale jako jednoduchý názorný příklad pro Arduino a měl by tady být víc Wiring než C.
Uživatelský avatar
YenyaKas
Příspěvky: 1335
Registrován: úte 17.01.2017 10:48
Bydliště: Brno
Kontaktovat uživatele:

Re: Arduino a servo

#82 Příspěvek od YenyaKas »

Jo, jasně. Ale máš bod za použití přímo bitu z HW registru tam, kde já si držím zvlášť proměnnou edge. A taky žes to narouboval na prostředí Arduino IDE.
Sky Surfer; HK Paraglide; DYI: samokřídlo Ita, elektrovětroň Kaze, delta Quasar3D; FlySky i6
Uživatelský avatar
jyrry
Příspěvky: 22016
Registrován: pon 28.02.2005 0:00
Bydliště: Rakovník
Kontaktovat uživatele:

Re: Arduino a servo

#83 Příspěvek od jyrry »

Pánové, díky ale asi zůstanu při zemi a přece jen tu knihovnu servo.h zbaběle :mrgreen: využiju. Pak se cvičně pokusím do Arduina dostat tohle:
pumovnice_V06.txt
(3.07 KiB) Staženo 240 x

To mi na PICu uspokojivě (číst "stačí mi to") funguje a jsem na to hrdý :lol:
jyrry.webnode.cz
Uživatelský avatar
ellet
Příspěvky: 2401
Registrován: pát 12.02.2016 11:37
Bydliště: Vysočina, ČR

Re: Arduino a servo

#84 Příspěvek od ellet »

jyrry píše:Pánové, díky ale asi zůstanu při zemi a přece jen tu knihovnu servo.h zbaběle :mrgreen: využiju....
Když aplikaci vyhovuje není důvod ji nepoužít, obyčejně to nepíšou začátečnící.(U mě se začátečnické období objevuje periodicky po několika letech :) ).
Uživatelský avatar
jyrry
Příspěvky: 22016
Registrován: pon 28.02.2005 0:00
Bydliště: Rakovník
Kontaktovat uživatele:

Re: Arduino a servo

#85 Příspěvek od jyrry »

ellet píše:... obyčejně to nepíšou začátečnící....

No... tohle jsem stvořil předloni já ... :oops:
Řídí to pumovnici (1 servo dveře a 2 serva nezávislé odhozy) jediným kanálem. Pravda, neřeším ±4us vstupního signálu, tak přesně to není zapotřebí. To samé výstupní rámec není zrovna 20ms ale těm servům to nevadí.
jyrry.webnode.cz
Uživatelský avatar
ellet
Příspěvky: 2401
Registrován: pát 12.02.2016 11:37
Bydliště: Vysočina, ČR

Re: Arduino a servo

#86 Příspěvek od ellet »

jyrry píše: Pravda, neřeším ±4us vstupního signálu, tak přesně to není zapotřebí. To samé výstupní rámec není zrovna 20ms ale těm servům to nevadí.
No právě tak to myslím, když něco vyhovuje tak proč to nepoužít. Dívám se na tvoji pomovnici a říkám si, jestli je opravdu nutné při každým spuštění zapisovat do eprom. (Nestačil by prvně test, jestli to tam už není?)
Uživatelský avatar
jyrry
Příspěvky: 22016
Registrován: pon 28.02.2005 0:00
Bydliště: Rakovník
Kontaktovat uživatele:

Re: Arduino a servo

#87 Příspěvek od jyrry »

Do EEPROM to zapisuje jen při programování, to je direktiva pro ten programátor. Při startu programu se to jen z EEPROM načte.
Když to pak dolaďuju, nahrávám jen čísla do EEPROM, ne celý program.
jyrry.webnode.cz
Uživatelský avatar
ellet
Příspěvky: 2401
Registrován: pát 12.02.2016 11:37
Bydliště: Vysočina, ČR

Re: Arduino a servo

#88 Příspěvek od ellet »

Už to vidím (EEPROM, READ, WRITE), tak to jo a co máš za programátor?
Uživatelský avatar
BoŠ
Příspěvky: 1539
Registrován: ned 26.05.2013 11:06
Bydliště: Brno

Re: Arduino a servo

#89 Příspěvek od BoŠ »

YenyaKas píše:Já si teda i v reálném životě pletu pojem levá a pravá, ale tady jsem si docela jistý, že je to přesně naopak - vlevo je bit 7 (0b10000000) a vpravo je bit 0 (0b00000001).
Pravda, zpráva doleva...
MC-20HOTT,DS-16,X10S,14SG,S-trino MkII,SpeedFire, Extra 102",MiniCorado,LOGO550SE,Goblin570
Uživatelský avatar
jyrry
Příspěvky: 22016
Registrován: pon 28.02.2005 0:00
Bydliště: Rakovník
Kontaktovat uživatele:

Re: Arduino a servo

#90 Příspěvek od jyrry »

ellet píše:Už to vidím (EEPROM, READ, WRITE), tak to jo a co máš za programátor?

PICkit II
jyrry.webnode.cz
Odpovědět

Zpět na „Procesory a jiné vychytávky“