interrupt

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

interrupt

#1 Příspěvek od Le_Ze »

Zdravím.
Mam na arduino připojene pohybove čidlo.
Při pohybu se mi přes knihovnu spustí časovač (Timer.h) a rožne na 2 munuty světlo.

Toto jsem dělal před par lety a časem přidaval kod a už to nestiha.
Bych to chtěl překopat a použit interrupt.
Na jednom foru psali, že do interruptu timer nepatři.
Je to pravda?
Jak to pořešit?
Je to na mega, takže přimo na tom pinu 3 je interrupt.

Něco takoveho

Kód: Vybrat vše

if (digitalRead(3) == HIGH)
  { 
   //--------------------------- 
  if (analogRead(0) < 80)
     {
     digitalWrite(22, LOW);
       if( eventID != -1 )
       t.stop(eventID);
       eventID = t.after(40000, zhasni);     
     }
V proceduře zhasní je jen digitalWrite(22, HIGH);

Uživatelský avatar
passion
Příspěvky: 890
Registrován: 22 črc 2005, 02:00
Bydliště: Žilina

#2 Příspěvek od passion »

V prerušení nečasujem. A ak náhodou áno tak s vedomím, že tam ostávam napríklad s delay(xx). Je to asi neprofesionálne, ale ak to nevadí danej aplikácii, tak to neriešiem. Štandartne ale skočím do prerušenia, vykonám čo treba a vrátim sa s príznakom do hlavnej slučky a časujem tam.
V tvojom prípade to môžeš vyriešiť tak, že pri pohybe skočíš do prerušenia, tam zapneš svetlo, zapneš príznak pohybu, a vrátiš sa do hlavnej slučky spolu s príznakom pohybu. V hlavnej slučke budeš kontrolovať, či je aktívny príznak pohybu. Ak áno, zapneš časovač a spolu s ním príznak vypneš. Po pretečení časovača vypneš svetlo. Ak počas svietenia nastane znovu pohyb, zas ti to skočí do prerušenia, nastaví príznak pohybu, a vráti sa do slučky, kde začneš časovať od znova. Svetlo vypneš po odčasovaní v hlavnej slučke.

Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

#3 Příspěvek od Le_Ze »

Myslím, že jsem to blbě pochopil.
attachInterrupt(1,rozni, RISING);

do procedury rozni dam to

Kód: Vybrat vše

if (analogRead(0) < 80)
     {
     digitalWrite(22, LOW);
       if( eventID != -1 )
       t.stop(eventID);
       eventID = t.after(40000, zhasni);     
     }
Tim padem nepouživám žadný timer.
Jen v přerušení vyresetují časovač (Timer.h) a znova spustím a vratim se zpět do hlavní smičky.
Tim padem by to mělo byt ok.

Uživatelský avatar
passion
Příspěvky: 890
Registrován: 22 črc 2005, 02:00
Bydliště: Žilina

#4 Příspěvek od passion »

:friday: Ešte jednoduchšie, ako môj návrh. Po načítaní času funkcie z timer.h skočíš na podprogram vypni svetlo? Nebude ti tam cyklicky skákať aj bez nulovania v prerušení? Len sa pýtam, nepoužívam timer.h, tak neviem, čo všetko dokáže.

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“