 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
msmiha Član

Pridružen-a: Sob 26 Feb 2005 16:48 Prispevkov: 115 Aktiv.: 0.49 Kraj: Slovenske Konjice
|
Objavljeno: Pon Feb 12, 2007 9:09 pm Naslov sporočila: Vrnitev iz prekinitve na točno določeno mesto |
|
|
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 |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.17 Kraj: Ljubljana
|
Objavljeno: Pon Feb 12, 2007 9:13 pm Naslov sporočila: Re: Vrnitev iz prekinitve na točno določeno mesto |
|
|
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š..
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 |
|
 |
msmiha Član

Pridružen-a: Sob 26 Feb 2005 16:48 Prispevkov: 115 Aktiv.: 0.49 Kraj: Slovenske Konjice
|
Objavljeno: Pon Feb 12, 2007 10:36 pm Naslov sporočila: |
|
|
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 |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.01
|
Objavljeno: Pon Feb 12, 2007 11:09 pm Naslov sporočila: |
|
|
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 .
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 |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.17 Kraj: Ljubljana
|
Objavljeno: Tor Feb 13, 2007 8:59 am Naslov sporočila: |
|
|
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 |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.71 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Tor Feb 13, 2007 9:49 am Naslov sporočila: |
|
|
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 |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.01
|
Objavljeno: Tor Feb 13, 2007 12:45 pm Naslov sporočila: |
|
|
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 .
|
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 ). 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 |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.71 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Tor Feb 13, 2007 3:43 pm Naslov sporočila: |
|
|
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 |
|
 |
kavelj22 Član


Pridružen-a: Tor 23 Jan 2007 23:56 Prispevkov: 465 Aktiv.: 2.08 Kraj: Ljubljana
|
Objavljeno: Sob Feb 17, 2007 8:11 pm Naslov sporočila: |
|
|
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 |
|
 |
s55m Član


Pridružen-a: Sob 06 Jan 2007 17:07 Prispevkov: 2696 Aktiv.: 12.01 Kraj: Plovdiv-Bolgarija
|
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Ned Feb 18, 2007 12:18 am Naslov sporočila: |
|
|
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 |
|
 |
kavelj22 Član


Pridružen-a: Tor 23 Jan 2007 23:56 Prispevkov: 465 Aktiv.: 2.08 Kraj: Ljubljana
|
Objavljeno: Ned Feb 18, 2007 1:42 pm Naslov sporočila: |
|
|
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 |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Ned Feb 18, 2007 2:00 pm Naslov sporočila: |
|
|
Malo si zadevo res zavozlal 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  _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
|
|
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
|