Stránka 1 z 1
Soft reset PIC
Napsal: 23 lis 2008, 21:24
od ferdo1
Je možné spraviť softwarový reset PIC - jedná sa o to, aby som počas prerušenia dokázal spraviť reset PICčka - aby mi po návrate z prerušenia nepokračoval odkiaľ tam skočil, ale išiel od adr. 00. Ďakujem
Napsal: 23 lis 2008, 21:34
od Hula
Zdravim, ja bych to viděl tak, že po skončení obsluhy přerušení nedáš return,retfie apod...ale goto nula.Asi takhle
org0
nula call init
.......program
....program
org4 ;preruseni
;obsluha preruseni
goto nula ;skok na adresu nula
Akorat ti asi ve stacku zustane adresa intrukce pred kterou prislo preruseni, ale to by nemelo vadit.
Napsal: 24 lis 2008, 03:25
od Jenda_KL
možná ještě nastavit StackPointer na začátek a vyklidit RAM.
Ale to by mělo v INIT být vždy.
Napsal: 24 lis 2008, 08:50
od jankop
PIC řady 16FXX a nižší nemají přístupný StackPointer, tutíž ho nejde nulovat a ani to není třeba. Zásobník je totiž cyklický. Stačí opravdu skok na inicializační adresu - obvykle 0x00. Ovšem je vhodné ještě před tímto skokem smazat příznak aktivního přerušení.
Napsal: 24 lis 2008, 10:10
od ferdo1
Vďaka, príznak prerušenia je zmazaný po aktivácii rutiny prerušenia. Len sa bojím, ak nepoužijem return, retfie aby pretečenie Stack nerobilo haluze, nakoľko prerušenie buď prepína dva výstupy (krátke stlačenie tlačítka) alebo spôsobí "vypnutie" činnosti PICčka (dlhé stlačenie tlačítka). V tomto prípade program beží v prerušovacej rutine, na krátke stlačenie nereaguje, pri dlhom by mal program bežať od začiatku. Procík je trvalo napájaný, takže k pretečeniu Stack časom určite príde - simulátor pri pretečení vyhadzoval chybu.
Napsal: 24 lis 2008, 10:27
od jankop
Nenapsal jsi, o jaký PIC se jedná. Jak jsem ale řekl, u řady 16FXX a nižší je osmiúrovňový cyklický stack, který po přetečení začíná od začátku. Přetečení není nijak kontrolováno ani signalizováno. Nemusíš to tedy hlídat jinak, než že za standardního běhu programu nesmí být vnoření větší než 8x. Ty nemůžeš ovlivnit na jakou pozici zásobníku tvůj call uloží návratovou adresu a nezajímá tě to. Pokud simulátor hlásí přetečení stacku, tak to nejspíš není chyba, ale pouze varování. Reálný procesor se o této nastalé situaci ani nedozví a to přetečení znamená, že se ukazatel zásobníku nastaví zase na počátek.
Napsal: 24 lis 2008, 10:39
od Atlan
Inak musi to ist urobiť aj inako

Napsal: 24 lis 2008, 13:23
od meereck
a co treba nejaky output pin privest na tranzistor, kterym se bude davat na log0 MCLR pin (na kterem bude samozrejme pullup z Vcc)? Nebo pouzit Watchdog (ale to v tvem pripade okamziteho resetu nelze pouzit)?
Kazdopadne u PIC18 se da pouzit RESET instrukce.
Napsal: 24 lis 2008, 21:28
od ferdo1
jankop> Ide o 16F627. Práve o to vnorenie 8x ide - vždy po resete skokom na 00 by ostala jedna úroveň visieť, preto chcem robiť ten reset.
Ako som písal, program bude bežať stále a je reálny predpoklad, že k tomu 8násobnému vnoreniu príde.
Skúsim to prepísať a otestovať na reál procíku.
Nad Watchdog som rozmýšľal, nakoniec to možno spravím tak, len sa mi nechcelo zbytočne komplikovať program.
Napsal: 24 lis 2008, 21:46
od jankop
Kolikrát ještě potřebuješ zopakovat, že nic nezůstane viset. Ukazatel zásobníku se ani při resetu nenuluje. Jeho stav může být po resetu naprosto náhodný. S ohledem na cykličnost je naprosto jedno, v jaké počáteční hodnotě se nachází. Opravdu nerozumíš tomu, že zásobník prostě ošetřovat nemusíš? Co pořád vymýšlíš nesmysly? Když chceš skočit ven z přerušení, tak to prostě udělej. Stack ti v tom naprosto nebrání.