interrupt után honnan folytatjuk

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

interrupt után honnan folytatjuk

Hozzászólás Szerző: dckillman »

Sziasztok!

Megismertem a megszakításokat az Arduino rendszerben.

Tudom is őket használni de ezzel kapcsolatban is van kérdésem.

Szóval ha ezt nézzük akkor:

attachInterrupt(0,megszakitas,LOW);

Akkor ezek szerint folyamatos megszakitas van ha int0 azaz D2 lábon alacsony szint van.

Arra van-e megoldás hogy a megszakitás után egy adott sortól folytatódjon a kód tovább folytatása?

Kód: Egész kijelölése




   //KIMENETEK
int outPinLed0=22;   
int outPinLed1=26;   
int outPinLed2=28;   
int outPinLed3=24; 

void setup(){

pinMode(22,OUTPUT);
pinMode(26,OUTPUT);
pinMode(28,OUTPUT);
pinMode(24,OUTPUT);
Serial.begin(9600);
Serial.println("TESZT");
attachInterrupt(0,megszakitas,LOW);

}

void loop(){
villog();

}

void villog(){

//itt szeretném hogy folytatódjon a megszakitás után a végrehajtás****
   digitalWrite(22,HIGH);
   delay(3000);
   digitalWrite(26,HIGH);
   delay(3000);
   digitalWrite(28,HIGH);
   delay(3000);
   hatra=1;
   digitalWrite(24,HIGH);
   delay(3000);
 
   digitalWrite(22,LOW);

   digitalWrite(26,LOW);

   digitalWrite(28,LOW);

   digitalWrite(24,LOW);
   delay(300);
   hatra=0;
}

void megszakitas(){
  
   digitalWrite(22,LOW);

   digitalWrite(26,LOW);

   digitalWrite(28,LOW);

   digitalWrite(24,LOW);
  
}

Az alapprobléma az hogy van egy motoros mozgatású ajtó ezen van egy infrasorompó és ha a zárodás során belemegy pl egy kutya akkor azonnal ki kellene nyitni. Megszakítás(LOW) esetén letudom tiltani a nyitást de rögtön nem tudom nyitni ,pedig az ideális az lenne és így ha nincs akadály akkor be is csukódna.
A hozzászólást 1 alkalommal szerkesztették, utoljára dckillman 2013. november 24. vasárnap, 9:26-kor.
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: dckillman »

Talán még annyi szépítés érdekelne hogy a megszakítást külön lelehet valahogy tiltani?

Azaz van-e arra megoldás hogy a megszakítást letiltsam? Csak ott engedélyezzem ahol használni szeretném ezt a megszakítást.
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: dckillman »

Talán ez lenne az?
(Kipróbáltam és jónak tűnik)

detachInterrupt(0); //int0 megszakítás tiltása
attachInterrupt(0,megszakitas,CHANGE); //megszakítás engedélyezése

Honnan folytatjuk továbbra is kérdéses
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: Robert »

Adott sortól futtatás nem megoldott. külön részbe tedd be, és ebben kezelcd le a maradékot. Vagy hozz létre egy _globális_ változót, és abban jelezd, hogy INT volt... És a főprogramban: ha valtozo=1, akkor volt INT....
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: dckillman »

Kicsit bővebben leírod?

Az ajtó nyitás-zárodás vonatkozásában.

Köszönöm
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: Robert »

Kód: Egész kijelölése

byte valtozo;

setup(){
attachINT (ezazintrutin,....);
}

loop{
if valtozo=1 {
itt teszek valamit
valtozo=0;
}
}

ezazintrutin {
valtozo=1;
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: Robert »

Rajzolj egy folyamatábrát a feladatodra.... Sokminden látszik majd belőle...
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: dckillman »

megpróbálom leírni

Szóval a főprogramban van

if(inrerrupt=0);
{
nyitom az ajtót;
csukom az ajtót(itt bekapcsolom a megszakítást)
}
if(interrupt=1){
kinyitom a z ajtó
}

Ha a kutya beláll az infra érzékelőbe akkor hogyn lehet lekezelni hogy addig ne is próbáljon elindulni az ajtó míg a kutya benne van?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: Robert »

A láb folyamatos szintjét figyeled....
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: SzLacus »

Lehet, hogy nem jól gondolom, de egy kapu nyitás nem lehet olyan gyors folyamat, hogy pollozással lekésnél bármiről. De ha már a megszakítást választottad, akkor szerintem a következőt érdemes átgondolni. A megszakítást folyamatos "L"-re akkor célszerű alkalmazni, ha azzal valamit folyamatosan érzékelni kell. A kapuzárás folyamata nem ilyen. Ha belelép a fénysorompóba valami, akkor meg kell állni. vagyis a belépés pillanata az esemény, utána felesleges fenntartani a megszakítást. Én úgy csinálnám meg, hogy ha zárási folyamat megy, és a fénysorompó megszakítást generál, akkor megállítom a folyamatot, és jelzem, hogy megszakítás volt. Így a megszakítás rutinban csak néhány utasítás lesz, és a folyamat azonnal megáll. Utána a főprogramban a jelzés alapján, (amit az int-ben beállítottál) ott folytatod, ahol akarod, vagy olyan intézkedést teszel, amilyet akarsz. Gondolom nem fog magától újra indulni a zárás, ha egyszer vészleállítás történt. Azt is megteheted, hogy csak akkor élesíted a megszakítást, ha zárási folyamatot indítasz. Ha nagyon ki akarod hegyezni, akkor azt is megteheted, hogy a lefutóra kiteszed a jelzést, amiról a főprogram tudja, hogy most tilos mozgatni a kaput, és a megszakítást átproramozod felfutó élre. Amikor a fénysorompó felszabadul, jön a felfutó éled, ami a megszakítást fogja generálni. Ekkro törlőd a tiltó jelzést, és vissza programozod a megszakítást lefutóra. Így aztán minden azonnal elkapsz, de nem tenyerel rá a megszakítás a programodra. Ehhez persze a fénysorompónak határozott jelet kell szolgáltasson.
De mégegyszer mondom, hogy nem látom semmi előnyét a megszakítás alkalmazásának ebben a lassú folyamat vezérlésben. A főprogramban folyamatosan pollozhatod a sorompót, és ha tiltást olvasol róla, akkor megállsz. A programod egy körülfordulási ideje alatt a kapud nem tesz meg mérhető nagyságú utat, vagyis nem késel le semmiről. Gondold csak meg, hogy az 50 Hz (ami a motorodat hajtja) periódus ideje alatt a főprogramod hányszor fog körbeérni és ellenőrizni, hogy a sorompóban van-e akadály. Azt már csak poénból jegyzem meg, hogy a kutyát nem csak udacsukni nem érdemes, a nyitással a falnak préselt állat sem néz ki jól a kerítésen. :D És a befele nyíló kapu sem érdemes nyitni, ha a hatósugarában ott áll az autó.
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: dckillman »

Csak a zárási folyamatban fog a megszakítás "élni".
Tulajdonképpen azt szeretném ha a kutya beleszaladt akkor nyisson vissza és x idő után pedig újra próbálja meg a zárást.

Ezt a pár sort nem egészen értem:

Ha nagyon ki akarod hegyezni, akkor azt is megteheted, hogy a lefutóra kiteszed a jelzést, amiról a főprogram tudja, hogy most tilos mozgatni a kaput, és a megszakítást átproramozod felfutó élre. Amikor a fénysorompó felszabadul, jön a felfutó éled, ami a megszakítást fogja generálni. Ekkro törlőd a tiltó jelzést, és vissza programozod a megszakítást lefutóra. Így aztán minden azonnal elkapsz, de nem tenyerel rá a megszakítás a programodra. Ehhez persze a fénysorompónak határozott jelet kell szolgáltasson.

Köszi a hosszú és terjedelmes választ,sokat segített
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: dckillman »

SZlacus,ha folymatosan áll az akadály a sorompóban akkor azt hogyan kezeljem le ebben a helyzetben?


Az első interruptot le is tudtam kezelni így:
while(interrupt==0);

{
nyit;
zár;(itt bekapcsolom a megszakítást)
}
if(interrupt==1)
{
nyit;
zár;

(de ha itt interrupt van akkor már gond van) mert akkor onnan folytatja ahol abbahagyta az előbb

}



Így szeretném ha működne:
akadály van akkor nyit majd ha zár és akadály ment bele(LOW átmenet) akkor kinyit és ha továbbra is benne áll akkor a program nem indítja el a funkciót?

A szóban forgó megszakításos lábról lehet,szabad közben értéket beolvasni?
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: SzLacus »

Persze hogy szabad olvasnod a lábat amin megszakítást vársz. tételezzük fel, hogy a sorompód magasat ad ha szabad, és alacsonyat, ha akadály van benne. Amikor a rendszer indul, akkor meg kell nézned a láb állapotát, és annak megfelelően felhúznod a megszakítást. Ha fent van akkor lefutóra, ha lent akkor felfutóra állítód az aktivitást. Ez után elindul a megszakítás figyelésed, és nem késed le az eseményt. Ha szabad volt, akkor lefutót vársz, mert csak az jöhet. ha megjött a lefutó, beállítod a már említett jelződet, ami ezek után pont azt mutatja, hogy a bemeneted hogyan áll. Vagyis olvashatod a lábat, de a jelződ már mutatja mit fogsz látni a lábon. A megszakítás rutinban pedig átállítod felfutóra a megszakítás módot, mert most éppen lent van a láb, tehát csak feéfutó él jöhet. Kilépsz a megszakításból és várod, hogy az akadály elvonuljon a sorompóból. Megjön a felfutó, felszabadult a sorompó, mehet a zárás.
De továbbra is azt mondom, hogy ez a folyamat nem igényli a megszakítást, ezt pollinggal is meg tudod oldani. Nem azért írom ezt, mert le akarlak beszélni a megszakításról, csak itt nem hoz szerintem semmi előnyt. De ha már megszakítás, akkor a leg célra vezetőbb a még nem említett megszakítás mód, használata. Vagyis a "változásra" megszakítás a célra vezető megoldás. Ekkor nem kell váltogatnod a várt irányt, hanem akár fel, akár lefutó jön az neked megszakítás. Ha beüt, akkor megnézed, hogy mi az állapota a lábnak, és kilépsz a megszakításból, abba az irányba folytatva a folyamatot, amerre akarod.
De hogy a kapu mozgató motorról se feledkezzünk meg azt biztosan nem fogja szeretni, ha zárásból egyből nyitásba küldöd. A mozgatott tömegnek kell lehetőséget teremteni a megállásra, csak utána indíthatod visszafelé. Feltételezem, hogy egyfázisú motor, azt egy hirtelen váltással akár hamis üzembe is lehet küldeni, vagyis elő fordulhat, hogy nem tud álváltani megy tovább arra amerre előtte ment.
holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: holex »

Ha egy eljárásban letiltjuk a global interruptot, a végén pedig engedélyezzük, és közben beesik mondjuk 3 különböző megszakítás, akkor az engedélyezés után ezek automatikusan lefutnak prioritás szerinti sorrendben? Az azonos prioritásúak milyen sorrendben futnak le egymás után?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: interrupt után honnan folytatjuk

Hozzászólás Szerző: Robert »

A beeső INT-ek a prioritás sorrendjében és nem a beérkezés sorrendjében futnak le. erről lsd: chipek adatlapja.
Minden INT-nél csak a kell/nem kell billen be. A darabszámlálás nem.
Válasz küldése