Externé prerušenie

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa peterple » 21 Júl 2016, 22:54

Principiálne to nie je vymyslené dobre. Len na úvod - máš premennú znak zadefinovanú ako volatile? Ak nie to je prvý prúser. Ak nerátam to úplne od veci pomenovanie. V tej premennej žiadny znak nesídli.

Teraz k tomu nápadu meniť v prerušení iba príznak a stav časovača čítať až v hlavnom programe. Tento nápad nie je vôbec dobrý. Ty predsa chceš čo najpresnejšie zmerať čas medzi tými dvomi prerušeniami. Lenže ak si len nastavíš príznak tak v vyčítaniu časovača môže dôjsť bohviekedy. V hlavnej slučke totiž robíš časovo náročné veci ako výpočet na double (alebo už možno float) a potom písanie po displeji. Takže kedy sa ten kód dostane k vyčítaniu časovača je úplná náhoda.

Posledná vlna kritiky bude k tomu nápadu spúšťať a zastavovať časovač. To je tiež zlý nápad.

Ako sa takéto veci robia?

1. Nejakému časovaču sa nastaví vhodne preddelič a nechá sa počítať stále.
2. Ak je to trochu lepší procesor tak má niektorý časovač funkciu capture. To je taká funkcia že na nejakú hranu, nejakého vstupu sa obsah časovača odchytí do nejakých registrov. Zároveň sa zvykne aktivovať prerušenie že toto nastalo.
3. Ak taký dobrý procesor nemáš (čo pochybujem) tak sa toto odchytenie robí v obsluhe prerušenia od externého vstupu, samozrejme na nejakú hranu.
4. Ako sa zistí čas medzi impulzami? Veľmi ľahko. Treba na to iba mať zapamätanú hodnotu čítača pri predchádzajúcom prerušení. Doba sa vypočíta ako rozdiel medzi aktuálnou hodnotou teraz a v predchádzajúcom prerušení. Netreba sa báť ani toho že časovač pretečie. Celočíselná aritmetika si s tým poradí.
5. Treba sa báť iba toho že časovať pretečie viackrát než raz. To sa dá minimalizovať pomocou vhodného nastavenia preddeliča. Samozrejme že sa to ale stane ak žiadny impulz nepríde. Takže to treba mať vyriešené aj programom.

Na záver len dodám že to nie je jednoduché ak sa nevie ako pracuje CPU, ako pracujú prerušenia. Ako pracujú časovače. Toto všetko vyžaduje dosť hlboké znalosti z číslicovej techniky a samozrejme programovania v C.

Kedže neholdujem PIC tak je to odo mňa všetko iba v abstraktnej rovine, ktorá platí na každú architektúru.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12407
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa boraicho » 03 Aug 2016, 12:13

perteple diky.

zaujima ma že či sa v tych malych 8-bit procakov, možu navzajom ovplyvnovať prerušenia.
Pretože ak použivam prerušenie na vstupe IOC a použivam aj prerušenie na timer2 100mS , tak ten timer 2 tych 100mS nedáva ale vždy to nejak pobehuje všelijako, raz je večši a raz je menši čas toho timera. ako keby bol problem s tym že veľmi často sa prerušuje na IOC. diky.
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

Používateľov profilový obrázok
rudko
Power user
Power user
Príspevky: 2340
Dátum registrácie: 28 Dec 2012, 08:33
Vek: 37

Re: Externé prerušenie

Príspevok od používateľa rudko » 03 Aug 2016, 12:32

jasne. prerusenia sa ovplyvnuju. treba pozriet v DS k danemu obvodu ktore ma aku prioritu, pripadne ci sa daju priority nastavit
Tu sa hodi pamatna veta mojho ucitela jednocipakov zo strednej: "Prerusenie s nizsou prioritou moze byt prerusene prerusenim s vyssou prioritou, avsak prerusenie s vyssou prioritou nemoze byt prerusene prerusenim s nizsou prioritou" :-)
0
Drink coffee. Do stupid things faster with more energy...

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12407
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa boraicho » 03 Aug 2016, 13:02

hej, mal som v ruke raz 16bit procak, a ten tieto nastavenia má, ale tento 16F1939 taketo nastavenia nema.
takže potom ostáva len logicky napisať program.
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa peterple » 03 Aug 2016, 14:23

Nerozumiem tvojej otázke. Čo to je ovplyvňovať? Z logiky veci mi príde že tieto dve prerušenia sú na sebe nezávislé. Prerušenie od časovača a prerušenie od externého vstupu sú nezávislé a to znamená že treba počítať so všetkými možnosťami. V prípade ak ich obsluhy píše človek neznalý veci, ktorý ani nevie ako často sa prerušenie objavuje a ako dlho trvá jeho obsluha sa ľahko dostane do situácie že jeho výtvor trpí náhodnými chybami.

Ako príklad som v tomto vlákne uvádzal použitie prerušenia od externého signálu na úroveň. Ale ani prerušenie na hranu nieje bez rizika. Zaleží na tom ako často tá hrana príde.

Ďalšie problémy sú spojené s viacvláknovosťou takýchto sw konštrukcí. Pre jednoduché MCU sa jedná iba o dvojvláknové behy, ale problémy ako atomicita operácií, reentrantnosť funkcií, dead lock to tu všetko funguje a treba to mať na pamäti.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12407
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa boraicho » 03 Aug 2016, 14:58

perteple.

No ako som pisal skor, robil som ten snimač otačok ktory už funguje. funguje tak že vždy na nabežnu hranu sa zapne prerušenie a zapne časovač a na dalšiu nabežnu hranu sa v prerušeni vypne časovač a tak dokolečka. Lenže teraz som tam zapol timer2 ktory je nastaveny na 100mS a po pretečeni sa zapne prerušenie a momentalne len neguje vystup na ktorom je LEDka a snimam to skopom.

ak je externe prerušenie vypnute, tak ten timer2 ide pekne, každa hrana rovnaky čas, ale ak zapnem externe prerušenie ktore sa vyskytuje častejšie od jednotiek po 10tok milisekund, tak vtedy ten timer 2 jaksi sa sprava nekorektne
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa peterple » 03 Aug 2016, 15:52

Aká dlhá je obsluha externého prerušenia? Nemáš to náhodou tak že pri nejakej hrane zablokuješ prerušenia? Si si vedomý toho že si zablokoval aj prerušenie od toho TIMER2? Tu si to treba nakresliť a rozmyšlať s tým že koľko čo trvá. Keď beží jedno prerušenie nemôže bežať druhé. Ale prerušovacie udalosti sa zapamätávajú, takže sa vedia aktivovať po ukončení obsluhy predchádzajúceho prerušenia.

To iste platí ak je prerušenie zakázané a potom sa povolí. Môžu byť kludne zapamätané aj dve žiadosti o prerušenie, ktorá bude obslúžená ako prvá záleží od toho ako prioritne sa vyvolávaju pre ten PIC. Všetko je určite popísané v DS. Ja sa PIC nevenujem takže ani keby si ukázal kód tak sa analýzy nedočkáš.

Teoreticky platí že dĺžka toho úseku generovaného pomocou TIMER2 môže kolísať o +- dobu obsluhy prerušenia toho externého. S tým sa nedá nič robiť. Ak je to viac tak potom je tam nejaká chyba.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12407
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa boraicho » 03 Aug 2016, 16:50

hej , asi to spravim tak ako si to pisal najprv, jeden timer si nastavim na 100mS a potom budem všetky vstupy počitať do druhych čitačov. a po každých 100mS vyhodnocovať, určite to pojde. Vďaka.
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa peterple » 03 Aug 2016, 17:59

Neviem či sa chápeme. Ale to je normálne že každý si predstaví v reči toho druhého práve to čo potrebuje. Ak ide o meranie času medzi dvoma impulzami tak som to myslel úplne inak.
Ak chceš merať otáčky tak že budeš počítať impulzy po dobu 0,1 sekundy tak sa priprav na dosť biedne rozlíšenie. a to 600ot/min (1 * 10 * 60)
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12407
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa boraicho » 03 Aug 2016, 21:08

ja ťa chapem, ale nemožem na ostrom krose predsa merať otačky raz za sekundu alebo raz za minutu. +-500 otáčiek hore dole čo už.
možno by som to dal ešte na bud 150 alebo a to už fakt asi maximalne 200mS kedže aj tak schopnosť LCD rýchlo vypisovať čísla tiež nieje bohvieaka a tým by sa mi aj spresnilo meranie na +-300 a to už by bolo v pohode.

ak by mi to všetko pekne fungovalo tak to tam chcem ešte zakomponovať aj motomerač a aj kmh, odvodenej od zadnej rozety. čiže na honde to mame 9tisc * 60 = 540tisic = 1 motohodina.
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa peterple » 03 Aug 2016, 21:16

preto som ti napísal ako sa to meria. Kedže si pustil čo máš za MCU toto sa píše na strane 3 DS
Two Capture, Compare, PWM Modules (CCP)
- 16-bit Capture, max. resolution 125 ns
- 16-bit Compare, max. resolution 125 ns
Takže nemusiš ani prstom pohnúť a hw ti zmeria periodu medzi dvoma impulzmi a rozlíšením na 125ns.
Samozrejme že tam treba aj troška sw. A hlavne naštudovať ako to funguje.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12407
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa boraicho » 03 Aug 2016, 21:38

vdaka, hej je to tam pekne popisane, hned ako sa k tomu dostanem to vyskušam. Vďaka za dobrý tip
Prílohy
ccpaspacutper.png
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

amater-sc
Nový člen
Nový člen
Príspevky: 86
Dátum registrácie: 27 Mar 2012, 16:23
Bydlisko: Senec

Re: Externé prerušenie

Príspevok od používateľa amater-sc » 04 Aug 2016, 09:32

Mam pocit ze to co potrebujes vediet je tu:
Datasheet PIC16F193X/LF193X, strana 95:

The firmware within the Interrupt Service Routine (ISR)
should determine the source of the interrupt by polling
the interrupt flag bits. The interrupt flag bits must be
cleared before exiting the ISR to avoid repeated
interrupts. Because the GIE bit is cleared, any interrupt
that occurs while executing the ISR will be recorded
through its interrupt flag, but will not cause the
processor to redirect to the interrupt vector.


V skratke po slovensky, ked vojdes do ISR musis overit ktory zdroj prerusenia
vyvolal prerusenie - to zistis pomocou interrupt flag bitu danej periferie.
Samozrejmym prepokladom pre uspech je co najkratsia obsluha ISR a nulovanie flag bitu
ktory prerusenie vyvolal.
0

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12407
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa boraicho » 04 Aug 2016, 13:01

no hej, vždy ked vojdem do interuptu mam tam if(flag_prerušenia) ktore prerušenie interupt vyvolalo a v tom ife je napisany program, a samozrejme sa snažim o čo najmenši kod vnutri.
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

Používateľov profilový obrázok
misocko
Ultimate člen
Ultimate člen
Príspevky: 4319
Dátum registrácie: 14 Jún 2009, 00:00
Vek: 47

Re: Externé prerušenie

Príspevok od používateľa misocko » 16 Júl 2019, 12:17

ahojte
skusam arduinom UNO merat skutocny vykon AC prudu. Robim to tak ze si nasamplujem napetie a prud jednej komplet sinusovky, nasledne prevediem vyppocet a vypisem. Na spravny start samplu pouzivam prerusenie-jasne islo by to aj bez neho ale mne sa to takto paci. V preruseni iba davam pomocnu premennu do 1, na zaklade toho spustim samplovanie , vypocet a odoslanie. A tu nastal problem s ktorym som vcera bojoval skoro cely den kym som to vyriesil velmi elegantne a 100% postacujuce pre moju potrebu.
ale najprv k problemu: vsetko by bolo super , keby procak stihol spravit vypocet a zapis (aktualne si cele pole hodnot prenasam na serial monitor) do dalsieho prerusenia, co samozrejme nema sancu. Takze skonci loop a pomocna premenna uz je v 1 lebo prerusenie uz nastalo pocas behu loopu. Teraz uz samplovanie nezacne na zaciatku sinusovky ale kdekolvek sa v tom case ten sinus nachadza. Skusal som na zaciatku loopu vypnut prerusenie , na konci loopu opet zapnut a na moje pocudovanie, vysledok podobny. Studovanim netu a tuto fora som sa dozvedel ze prerusenie aj tak nabehne hned po zapnuti kedze aj ked bolo vypnute tak reagovalo na akciu (naco mi je kurna take vypnutie prerusenia, sedliacky rozum mi vravel ze ked je nieco vypnute , tak to skratka nefunguje; programatori to maju zjavne inac a ovela tazsie).
Ja som to nakoniec vyriesil tak ze v preruseni inkrementujem premennu az na hodnotu o ktorej viem ze loop urcite skoncil, program v loope potom startuje az ked je premenna v mojom pripade vecsia ako 300.
Existuje nejaka moznost reagovat na najblizsiu udalost (ktora spusta prerusenie) ktora nasleduje hned po skonceni loopu?
(prosim nerieste to na co to pouzivam a ze netreba...., pytam sa obecne ak by som to na nieco v buducnosti potreboval :lol: :lol: )
Ďakujem
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa peterple » 16 Júl 2019, 12:57

Nuž vo svete MCU nie je miesto na sedliacky rozum. Respektíve sedliacky rozum je fajn (logika), ale nesmie byť pokrivený nesprávnymi dojmami. Ten hlavný tu sa volá vypnuté prerušenie. Nič také totiž neexistuje. Namiesto fóra a internetu si stačí prečítať DS príslušného procesora. Prerušovací system je pri AVR popísaný na pár stránkach lebo je trapne jednoduchý.
Tomu čo ty hovoríš vypnutie prerušenia je v skutočnosti jeho blokovanie (a povolovanie). To je operácia ktorou si programátor na určitú dobu zablokuje prerušovací systém aby nebol určite prerušený a potom urobí nejakú akciu ktorá by v prípade že by bola prerušená dopadla za určitých vzácnych podmienok špatne. Volá sa to atomickosť operácií a je to pre neskúsených programátorov zabijak.
Ak chceš nejaké prerušenie vypnúť tak nie je nič jednoduchšie. Každé prerušenie sa dá povoliť/blokovať. Čo je blokované nemôže vzniknúť. Ak ale niečo povolíš a ono sa aktivuje tak sa tá informácia nuluje dvomi spôsobmi. Prvý je že sa spustí jeho obsluha. Druhý je že sa vynuluje zápisom nuly alebo jednotky do nejakého registra kde sa drží info že nastalo. Kedže nič konkrétnejšieho si nepustil len že máš arduino tak si to nájdi v DS sám.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
misocko
Ultimate člen
Ultimate člen
Príspevky: 4319
Dátum registrácie: 14 Jún 2009, 00:00
Vek: 47

Re: Externé prerušenie

Príspevok od používateľa misocko » 16 Júl 2019, 13:51

Kód: Vybrať všetko

int poleNapetie[50];
int polePrud[50];
volatile byte x=0;

void setup()
{
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0, zapni, FALLING);

  Serial.begin(9600);
  while (!Serial) {;
                  }
}

void loop()
{

if (x>0)
  {
    x=0;
    for (int i = 0; i < 49; i = i + 1)
    {
      poleNapetie[i] = analogRead(A0);
      polePrud[i] = analogRead(A1); 
    }
    Serial.println("A");
    for (int i = 0; i < 49; i = i + 1)
    {
      Serial.print(poleNapetie[i]);
      Serial.print(";");
      Serial.println(polePrud[i]);
    }
  }
}

void zapni()
{
x=1;
}
pustam moj program, neviem co viac potrebujete. Myslel som nieco jednoduche, liezt do registrov - to by som musel skutocne potrebovat. Ked vidim cislo zapisane v inom ako desiatkovom tvare a k tomu nejake PORTB &= ~((1 << PB4) | (1 << PB2)); tak sa mi jezia chlpy. len zapis 1/0 na jeden z pinou bez pouzitia digitalWrite mi trval asi dva dni kym som na chvilu pochopil, takze programator zo mna uz nikdz nebude.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Externé prerušenie

Príspevok od používateľa peterple » 16 Júl 2019, 16:13

takže INT0 reaguje na dobežnú hranu.
http://ww1.microchip.com/downloads/en/D ... df#page=55
Tak si prečítaj kapitolu 12.2.3. a podľa toho sa zariaď. Ak nechceš používať tie zaklínadlá čo sa ti ježia vlasy, tak si pohľadaj knižnicu čo to rieši volaním nejakej úžasnej funkcie. Tie ja nepoznám.
Ale zakazovať prerušenia vlastne ani nemôžeš. Prestali by ti fungovať tie veci okolo Serial.

Ale tebe by úplne stačilo nulovať tú premennú x na konci toho if namiesto na začiatku a prerušenie zakazovať a povoľovať ani nepotrebuješ.

Inak to má akože 50x navzorkovať sietové napätie a prúd počas jednej sínusovky? Asi z teba programátor MCU naozaj nebude. Doporučujem nájsť si hotové meranie výkonu ktoré urobil niekto kto tomu naozaj rozumie. Bez znalostí ako to vo vnútri fičí to nejde.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
misocko
Ultimate člen
Ultimate člen
Príspevky: 4319
Dátum registrácie: 14 Jún 2009, 00:00
Vek: 47

Re: Externé prerušenie

Príspevok od používateľa misocko » 16 Júl 2019, 16:38

Vidis to s tym x na konci loopu ma vobec nenapadlo a urcite bude fungovat.
Co sa tyka samplovania, stihne to ulozit 90 vzoriek napetia a 90 vzoriek prudu pocas jednej sinusovky.
Stihlo by aj viac ale to by som musel zmenit preddelicku pre AD prevodnik aby stihol viac samplov.
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok