Odeslat nové téma Odpovědět na téma  [ Příspěvků: 104 ]  Přejít na stránku Předchozí  1 ... 3, 4, 5, 6, 7  Další
Autor Zpráva
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 20.03.2018 22:22 
Mazák
Mazák
Uživatelský avatar

Registrován: 17.1.2017
Příspěvky: 1339
Bydliště: Brno
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:
_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:
něco &= ~_BV(x)
je vynulování x-tého bitu v něco, podobně
Kód:
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:
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:
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


Nahoru
 Profil  
 
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 20.03.2018 22:28 
Mazák
Mazák
Uživatelský avatar

Registrován: 17.1.2017
Příspěvky: 1339
Bydliště: Brno
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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 20.03.2018 22:36 
Mazák
Mazák
Uživatelský avatar

Registrován: 17.1.2017
Příspěvky: 1339
Bydliště: Brno
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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 20.03.2018 22:38 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 1975
Bydliště: Vysočina, ČR
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:
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....


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 20.03.2018 22:52 
Mazák
Mazák
Uživatelský avatar

Registrován: 17.1.2017
Příspěvky: 1339
Bydliště: Brno
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:
#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.

_________________
Sky Surfer; HK Paraglide; DYI: samokřídlo Ita, elektrovětroň Kaze, delta Quasar3D; FlySky i6


Naposledy upravil YenyaKas dne úte 20.03.2018 23:10, celkově upraveno 1

Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 20.03.2018 23:07 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 1975
Bydliště: Vysočina, ČR
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.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 20.03.2018 23:14 
Mazák
Mazák
Uživatelský avatar

Registrován: 17.1.2017
Příspěvky: 1339
Bydliště: Brno
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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: stř 21.03.2018 4:18 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

Registrován: 28.2.2005
Příspěvky: 20822
Bydliště: Rakovník, CZ
Obrázky: 0
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:
Příloha:
pumovnice_V06.txt [3.07 KiB]
219 krát

To mi na PICu uspokojivě (číst "stačí mi to") funguje a jsem na to hrdý :lol:

_________________
jyrry.webnode.cz


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: stř 21.03.2018 8:24 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 1975
Bydliště: Vysočina, ČR
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 :) ).


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: stř 21.03.2018 11:36 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

Registrován: 28.2.2005
Příspěvky: 20822
Bydliště: Rakovník, CZ
Obrázky: 0
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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: stř 21.03.2018 12:10 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 1975
Bydliště: Vysočina, ČR
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í?)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: stř 21.03.2018 12:15 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

Registrován: 28.2.2005
Příspěvky: 20822
Bydliště: Rakovník, CZ
Obrázky: 0
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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: stř 21.03.2018 12:25 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 1975
Bydliště: Vysočina, ČR
Už to vidím (EEPROM, READ, WRITE), tak to jo a co máš za programátor?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: stř 21.03.2018 13:40 
Mazák
Mazák
Uživatelský avatar

Registrován: 26.5.2013
Příspěvky: 1538
Bydliště: Brno
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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: stř 21.03.2018 14:25 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

Registrován: 28.2.2005
Příspěvky: 20822
Bydliště: Rakovník, CZ
Obrázky: 0
ellet píše:
Už to vidím (EEPROM, READ, WRITE), tak to jo a co máš za programátor?

PICkit II

_________________
jyrry.webnode.cz


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 104 ]  Přejít na stránku Předchozí  1 ... 3, 4, 5, 6, 7  Další

 


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 7 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  

 

  Powered by phpBB® Forum Software © phpBB Group  Český překlad – phpBB.cz 

 

NAVRCHOLU.cz