Autor |
Zpráva |
YenyaKas
|
Napsal: úte 20.03.2018 23:22 |
|
Mazák
|
|
|
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 |
|
|
|
|
|
YenyaKas
|
Napsal: úte 20.03.2018 23:28 |
|
Mazák
|
|
|
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 |
|
|
YenyaKas
|
Napsal: úte 20.03.2018 23:36 |
|
Mazák
|
|
|
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 |
|
|
ellet
|
Napsal: úte 20.03.2018 23:38 |
|
Mazák
|
|
|
Registrován: 12.2.2016 Příspěvky: 1986 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 |
|
|
YenyaKas
|
Napsal: úte 20.03.2018 23:52 |
|
Mazák
|
|
|
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 stř 21.03.2018 0:10, celkově upraveno 1
|
|
Nahoru |
|
|
ellet
|
Napsal: stř 21.03.2018 0:07 |
|
Mazák
|
|
|
Registrován: 12.2.2016 Příspěvky: 1986 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 |
|
|
YenyaKas
|
Napsal: stř 21.03.2018 0:14 |
|
Mazák
|
|
|
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 |
|
|
jyrry
|
Napsal: stř 21.03.2018 5:18 |
|
Moderátor serveru
|
|
|
Registrován: 28.2.2005 Příspěvky: 20846 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 využiju. Pak se cvičně pokusím do Arduina dostat tohle: Příloha:
pumovnice_V06.txt [3.07 KiB]
221 krát
To mi na PICu uspokojivě (číst "stačí mi to") funguje a jsem na to hrdý
_________________ jyrry.webnode.cz
|
|
Nahoru |
|
|
ellet
|
Napsal: stř 21.03.2018 9:24 |
|
Mazák
|
|
|
Registrován: 12.2.2016 Příspěvky: 1986 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 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 |
|
|
jyrry
|
Napsal: stř 21.03.2018 12:36 |
|
Moderátor serveru
|
|
|
Registrován: 28.2.2005 Příspěvky: 20846 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á ... Ří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 |
|
|
ellet
|
Napsal: stř 21.03.2018 13:10 |
|
Mazák
|
|
|
Registrován: 12.2.2016 Příspěvky: 1986 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 |
|
|
jyrry
|
Napsal: stř 21.03.2018 13:15 |
|
Moderátor serveru
|
|
|
Registrován: 28.2.2005 Příspěvky: 20846 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 |
|
|
ellet
|
Napsal: stř 21.03.2018 13:25 |
|
Mazák
|
|
|
Registrován: 12.2.2016 Příspěvky: 1986 Bydliště: Vysočina, ČR
|
Už to vidím (EEPROM, READ, WRITE), tak to jo a co máš za programátor?
|
|
Nahoru |
|
|
BoŠ
|
Napsal: stř 21.03.2018 14:40 |
|
Mazák
|
|
|
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 |
|
|
jyrry
|
Napsal: stř 21.03.2018 15:25 |
|
Moderátor serveru
|
|
|
Registrován: 28.2.2005 Příspěvky: 20846 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 |
|
|
Kdo je online |
Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 14 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
|
|
|