www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Vrnitev iz prekinitve na točno določeno mesto

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
msmiha
Član
Član



Pridružen-a: Sob 26 Feb 2005 16:48
Prispevkov: 115
Aktiv.: 0.49
Kraj: Slovenske Konjice

PrispevekObjavljeno: Pon Feb 12, 2007 9:09 pm    Naslov sporočila: icon_question Vrnitev iz prekinitve na točno določeno mesto Odgovori s citatom

Gre za PICov mikrokontroler, zanima pa me sledeče:
Kako naj se vrnem iz prekinitve na točno določeno mesto in ne na tisto od koder je bila klicana? Recimo da je bila prekinitev klicana nekje pri koncu programa, jaz pa bi se rad po izvedeni prekinitvi vrnil na neko labelo, ki se nahaja na začetku programa.

_________________
Edini način da odkrijemo meje mogočega je da, jih prestopimo in se znajdemo v nemogočem!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
GJ
Član
Član



Pridružen-a: Čet 02 Nov 2006 15:51
Prispevkov: 946
Aktiv.: 4.17
Kraj: Ljubljana

PrispevekObjavljeno: Pon Feb 12, 2007 9:13 pm    Naslov sporočila: icon_sad Re: Vrnitev iz prekinitve na točno določeno mesto Odgovori s citatom

msmiha je napisal/a:
Kako naj se vrnem iz prekinitve na točno določeno mesto in ne na tisto od koder je bila klicana? Recimo da je bila prekinitev klicana nekje pri koncu programa, jaz pa bi se rad po izvedeni prekinitvi vrnil na neko labelo, ki se nahaja na začetku programa.


Daj pove zakaj to spoh rabiš.. Shocked

Drugače pa to v družini PIC16xxx ali pa PIC12xxx ne bo šlo. Gre pa v družini PIC18xxx, poglej ukaza push in pop.

LP GJ
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
msmiha
Član
Član



Pridružen-a: Sob 26 Feb 2005 16:48
Prispevkov: 115
Aktiv.: 0.49
Kraj: Slovenske Konjice

PrispevekObjavljeno: Pon Feb 12, 2007 10:36 pm    Naslov sporočila:   Odgovori s citatom

Rabil bi za spreminjanje razlčnih programov delovanja pri utripanju luči. Recimo ko pritisnem tipko, ki je priključena na prekinitveni pin, skoči program v prekinitev in števcu se poveča vrednost. Ko bi zapustil prekinitev pa bi moral program skočiti na tisti del, ki bi gledal katera sekvenca utripanja se mora izvest, npr. če se je števec povečal iz 2 na 3 se mora izvajati tretja sekvenca, ne pa da mora prit najprej 2 sekvenca do konca da se lahko izvede tretja. Vrjanta je da bi gledal, med utripanjnjem samih luči (recimo v pavzi), katera tipka je bila pritisnjena, samo sem upal na kakšno elegantnejšo rešitev.
_________________
Edini način da odkrijemo meje mogočega je da, jih prestopimo in se znajdemo v nemogočem!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.01

PrispevekObjavljeno: Pon Feb 12, 2007 11:09 pm    Naslov sporočila:   Odgovori s citatom

Pred ukazom "retfie" (return from interrupt) napiši "goto ...".
Če ti bo prevajalnik prebavil, bo delalo.
K sreči je utripanje lučk tako neškodljiva stvar, da ne bo strojeloma, če se PICu rahlo zmeša Very Happy .

Drugače se pri naključnih prekinitvah nastavi zastavice, ki se nato nekje preverijo, in spremenijo potek programa.
LP,
Igor

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
GJ
Član
Član



Pridružen-a: Čet 02 Nov 2006 15:51
Prispevkov: 946
Aktiv.: 4.17
Kraj: Ljubljana

PrispevekObjavljeno: Tor Feb 13, 2007 8:59 am    Naslov sporočila:   Odgovori s citatom

msmiha je napisal/a:
Recimo ko pritisnem tipko, ki je priključena na prekinitveni pin, skoči program v prekinitev in števcu se poveča vrednost. Ko bi zapustil prekinitev pa bi moral program skočiti na tisti del, ki bi gledal katera sekvenca utripanja se mora izvest, npr. če se je števec povečal iz 2 na 3 se mora izvajati tretja sekvenca, ne pa da mora prit najprej 2 sekvenca do konca da se lahko izvede tretja.


Saj ne rabiš čarati..
Vsaka sekvenca ima verjetno svojo zanko v kateri se vrši, lahko pa je ta zanka kar funkcija 'pause'. oziroma 'delay'.
Normalno je stvar rešena tako, da v sekvenci testiraš zastavico (njeno stanje ti določa prekinitev), ki ti pove, če moraš prekiniti sekvenco in iti na začetek!

LP GJ


Nazadnje urejal/a GJ Tor Feb 13, 2007 10:35 am; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jur
Član
Član



Pridružen-a: Pet 02 Dec 2005 14:45
Prispevkov: 5142
Aktiv.: 21.71
Kraj: [color=zelena]Ljubljana[/color]

PrispevekObjavljeno: Tor Feb 13, 2007 9:49 am    Naslov sporočila:   Odgovori s citatom

igo je napisal/a:
...Pred ukazom "retfie" (return from interrupt) napiši "goto ...".
Če ti bo prevajalnik prebavil, bo delalo...

Upam, da ne bo kdo tega resno vzel. Iz vsake procedure ali interrupta se lahko vrne izključno samo z returnom (ret, retlw, retfie,...). Zelo veliko napak pri delovanju programov izhaja zaradi neupoštevanja tega. Prevajalnik takih stvari ne odkrije, zato je odpravljanje takih napak težavno.

Jur
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.01

PrispevekObjavljeno: Tor Feb 13, 2007 12:45 pm    Naslov sporočila:   Odgovori s citatom

igo je napisal/a:
Pred ukazom "retfie" (return from interrupt) napiši "goto ...".
Če ti bo prevajalnik prebavil, bo delalo.
K sreči je utripanje lučk tako neškodljiva stvar, da ne bo strojeloma, če se PICu rahlo zmeša Very Happy .

Je že @jur napisal in še iz moje strani popravljam svojo "izjavo":

DA NE BI KDO RESNO TO NAPRAVIL !

Ob takšnem početju se programu zmeša. Dobesedno. Čeprav prevajalnik spregleda takšno zaporedje, bo program počel tisto, kar se od njega zahteva - torej zmedo. PIC bo izpolnil ukaz in skočil, zato mora biti pristanek dobro načrtovan. Sklad pa se bo napolnil, saj ukaza "return" in "retfie" skrbita tudi za praznjenje sklada. V vsakem primeru je potrebno Status in Work restavrirati pravočasno.

Če pa bo že kdo tvegal, je največ, kar lahko program počne, Izključno Utripanje Ledic (random generator Rolling Eyes ). Ali pa kot Šolski primer, kaj se zgodi, če so prekinitvene rutine NAPAČNO izvedene.

Za morebiten strojelom ali škodo NE odgovarjam!

LP,
Igor

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
jur
Član
Član



Pridružen-a: Pet 02 Dec 2005 14:45
Prispevkov: 5142
Aktiv.: 21.71
Kraj: [color=zelena]Ljubljana[/color]

PrispevekObjavljeno: Tor Feb 13, 2007 3:43 pm    Naslov sporočila:   Odgovori s citatom

Stack (sklad po slovensko): Stack je pomembna zadeva. Ko kličemo proceduro (call, gosub,...), se na stack zapiše, kje naj se program nadaljuje, ko je procedura končana. Return ukaz na koncu procedure iz stacka naloži v programski števec naslov, kjer naj se program nadaljuje. Glavni problem stacka je, da je omejen. Omejitev, ki se ji reče tudi globina (nivo) stacka (stack depth, stack level) je podana v datasheetu za posamezen procesor/mikrokontroler. Če je globina stacka na primer 2, to pomeni, da lahko kličemo dve proceduri eno v drugi.

Delovanje stacka globine 8 (osmica je izbrana naključno, brez posebnega pomena): Ko kličemo procedure eno v drugi od prve do osme, se stack polni od prvega do osmega naslova. Ko kličemo deveto proceduro stacku zmanjka prostora (dolžina je le osem). Program ne bo crknil, ampak bo povozil prvo (!) vrednost stacka. Ob naslednjem klicu returna program deluje po svoje...

Delujoč primer programa. Kontroler ima dva nivoja stacka. Procedura se kliče v proceduri:

Koda:
call prva_procedura //porabljen je prvi nivo stacka
call druga_procedura //porabljen je drugi nivo stacka
return //return iz druge procedure
return //return iz prve procedure

Napačen primer programa. Kontroler ima dva nivoja stacka:
Koda:
call prva_procedura //porabljen je prvi nivo stacka
call druga_procedura //porabljen je drugi nivo stacka
call tretja_procedura //POVOŽEN JE PRVI NIVO STACKA, ker si stack zapomni le dva naslova
return //return iz tretje procedure
return //return iz druge procedure
return //return iz prve procedure. Ker je stack povožen, se program nadaljuje NEDOLOČENO, oziroma nepravilno.

Prevajalnik bo program prevedel brez napake. Program bo morda bo deloval. Ampak ne vedno. Če se procedure izvajajo samo občasno... bo napaka neugotovljiva.

Vprašanje: zakaj ne bi stack naredili neomejen? Odgovor: če je napaka uporabi stacka, ne pomaga, če je še tako velik. Večina mikrokontrolerjev ima stack globine 8 zato, ker ima človek le deset prstov, ki jih zatakne v listing pri debugiranju stacka.

Druga napaka, ki tudi pokvari stack: Iz procedure (interrupta) se lahko vrnemo v glavni program le z return instrukcijo (return, ret, retlw, reti, retfie,...).
Primer napačnega programa:

Koda:
proc: <tu je neka koda>
goto start //na koncu procedure mora biti return. Goto instrukcija namesto returna bo sesula program.

start: call proc //glavni program
goto start

Še en primer napake:

Koda:
proc: <tu je neka koda>
goto start //Tukaj nepravilno zaključimo proceduro!!
<tu je neka koda>
return //na koncu je return, ampak procedura se dejansko konča z "goto start" nekaj vrstic prej...
start: call proc //glavni program
goto start

Ta dva primera programov bosta kljub hudi napaki delovala, ker je v njem klic le ene procedure (stack se povozi z vedno isto vrednostjo, ki je slučajno prava). Če bi bila dva klica, bi že prišlo do težave.

Težave z stackom se včasih vidijo tako, da program po resetu (pritisk reset tipke) deluje drugače, kot če mikrokontroler ugasnemo in prižgemo nazaj. Ob vklopu se običajno vrednosti pomnilnika/registrov na ničli (inicializacija registrov je opisana v datasheetu). Ko program deluje, se v pomnilniku nahajajo neke vrednosti. Ob resetu te vrednosti ostanejo take kot so (se ne postavijo na nič). V stacku tako dobimo neko naključno vrednost, ki je ostala od prej. Programski števec skoči na to (naključno) vrednost, programer pa debelo gleda, kaj se dogaja.

Napaka je lahko tudi v tem, če se v času izvajanja interruptne procedure zgodi interrupt. Ena od rešitev je, da med izvajanjem izključimo (disable) interrupte. Prava rešitev je v datasheetu.

Jur
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
kavelj22
Član
Član



Pridružen-a: Tor 23 Jan 2007 23:56
Prispevkov: 465
Aktiv.: 2.08
Kraj: Ljubljana

PrispevekObjavljeno: Sob Feb 17, 2007 8:11 pm    Naslov sporočila:   Odgovori s citatom

Mal izven teme pa vseeno. Ima kdo kak napisan program z katerim lahko z tipko prizgemo nato ugasnemo in spet prizgemo in spet ugasnemo...ledico-e. Se pravi izmenicno prizigamo in ugasamo al pa idejo kak to najlazje nardit.
sam sem napisal program s katerim lahko prizgem in ugasnem nikakor pa mi ne uspe ponovno prizgati...
hvala!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
s55m
Član
Član



Pridružen-a: Sob 06 Jan 2007 17:07
Prispevkov: 2696
Aktiv.: 12.01
Kraj: Plovdiv-Bolgarija

PrispevekObjavljeno: Sob Feb 17, 2007 8:21 pm    Naslov sporočila:   Odgovori s citatom

Če ni nujno potrebno, da je mikrokontroler...
http://ourworld.compuserve.com/homepages/Bill_Bowden/page9.htm
Lahko premaknete med smeh Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Ned Feb 18, 2007 12:18 am    Naslov sporočila:   Odgovori s citatom

kavelj22 je napisal/a:
Mal izven teme pa vseeno. Ima kdo kak napisan program z katerim lahko z tipko prizgemo nato ugasnemo in spet prizgemo in spet ugasnemo...ledico-e. Se pravi izmenicno prizigamo in ugasamo al pa idejo kak to najlazje nardit.
sam sem napisal program s katerim lahko prizgem in ugasnem nikakor pa mi ne uspe ponovno prizgati...
hvala!


Na hitro napisano.

Koda:

;---------------------------------
;vklop izklop z eno tipko
;---------------------------------

#define TIPKA PORTB,0
#define LED PORTB,1



   org 0x0
   goto GLAVNI
   org 0x05   
GLAVNI
   clrf PORTB
   bsf STATUS,RP0            ;bank1
   bcf OPTION_REG,NOT_RBPU    ;vklop pullup uporov portab
   bcf LED                  ;definiranje pina kot izhod
   bcf STATUS,RP0            ;bank0
G_ZANKA
   btfsc TIPKA               ;je tipka pritisnjena?
   goto G_ZANKA            ;ne
   btfss LED               ;led sveti?
   goto LED_ON               ;ne
   bcf LED                  ;izklop LEDICE
   goto $+2
LED_ON         
   bsf LED                  ;vklop LEDICE
   btfss TIPKA               ;je tipka spuscena?
   goto $-1               ;ne
   goto G_ZANKA
      
   end                     ;eof

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
kavelj22
Član
Član



Pridružen-a: Tor 23 Jan 2007 23:56
Prispevkov: 465
Aktiv.: 2.08
Kraj: Ljubljana

PrispevekObjavljeno: Ned Feb 18, 2007 1:42 pm    Naslov sporočila:   Odgovori s citatom

Mogoče sem zakompliciral zadevo u nulo, nevem, ker so to moji prvi programi ki sem jih kdajkoli napisal, ampak zadeva deluje.
Hotel pa sem narediti tocno to!
Imamo "display" ledic ki rotirajo v desno, lahko pa jih vklopimo in izklopimo kadarkoli.(tipka mora biti pritisnjena in spusčena za preklop ledice) Preveri se stanje tipke po vsaki ledici ki se prižge. Upam da sem zadel!
Bom vesel vsakega komentarja - pride prav za naprej!
hvala
Koda:
processor      16f917
   #include      p16f917.inc
   __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF)
   
   Cblock   0x20
   
   Zanka1
   Zanka2
   Display
   endc
   
T   equ      H'00'

   org      0x000
   goto   Start
   org      0x005
   
Start
   bsf      STATUS,RP0
   movlw   0x01
   movwf   TRISB            ;tipka je na RB0
   clrf   TRISD            ;izhodi
   bcf      STATUS,RP0
   clrf   PORTD            ;izkljucimo vse pine na PORTD
   
   movlw   B'10000000'         ; dolocimo s katero ledico bomo zaceli
   movwf   Display

Preveri
   call   Pritisnjena         ;preverimo tipko
      
MainLoop                  ;zanka za priziganje ledic
   movf   Display,w                  
   movwf   PORTD            
      
Delay1                     ; kako dolgo gori posamezna ledica
   decfsz   Zanka1,f
   goto   Delay1
   decfsz   Zanka2,f
   goto   Delay1
      
   btfsc   PORTB,T            ;preverimo ce je tipka pritisnjena/spuscena po vsaki ledici ki se prizge   
   goto   $+6
   call   Delay
   btfss   PORTB,T
   goto   $-1
   call   Delay
   goto   Ugasni         ;ce je gremo na ugasni
                        ;ce ni nadaljujemo
   bcf      STATUS,C
   rrf      Display,f         ;rotiramo v desno
   btfsc   STATUS,C
   bsf      Display,7
   goto   MainLoop
   
Ugasni   
   clrf   PORTD
   goto   Preveri   
            
Pritisnjena                  ;preverimo ce je pritisnjena
   btfsc   PORTB,T
   goto   $-1
   call   Delay
   
Spuscena                  ;preverimo ce je spuscena
   btfss   PORTB,T
   goto   $-1
   call   Delay
   
   return
      
Delay                     Delay za DEBOUNCE
   movlw   H'04'
   movwf   Zanka1
Cakaj
   decfsz   Zanka2,f
   goto   Cakaj
   decfsz   Zanka1
   goto   Cakaj
      
   end
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Ned Feb 18, 2007 2:00 pm    Naslov sporočila:   Odgovori s citatom

Malo si zadevo res zavozlal Wink Lahko bi uporabil prekinitev. Lahko bi tipke preverjal tudi v tisti časovni zakasnitvi, ter program napisal tako, da se bi tekel dalje, če tudi je tipka pritisnjena. (Sedaj se ti zanka dokler je tipka stisnjena) ...a važno je, da ti dela tako kot si želel Cool
_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 492 dni


Powered by phpBB © 2001, 2005 phpBB Group