Po resetu se "nějak samo" vyvolá přerušení

Zdravim.
Mohl by se mi někdo kouknout na zdroják případně poradič proč to dělá? V simulátoru program funguje správně po nahrátí do PIC16F630 se chvá lehce podivně.

Co to má dělat:
Po každém zapnutí se do EEPROM ukládá počet spuštění.
Výstupu mají být pulzy 50Hz, jsou 2 výstupy, OUT1 a OUT2 - mezi nima je nastaven pár us deadtime.
Mám nastavenou referenci komparátoru na 0.6V, nastavený komparátor. Při překročení napětí 0.6V na vstupu komparátoru se má vyvolat přerušení, rozsvítit LED a impulzy z výstupu mají na 1s ustat. Pokud dojde 5x k přerušení má se do EEPROM udělat záznam. Když se pětice znovu opakuje tak se k jednou zapsané hodnotě přičte 1.

Co to dělá:
Když to dotlačím do PIC tak mi při každém spuštění a RESETu skočí PIC do obsluhy přerušení. I v případě že je vstup komparátoru uzemněn.

Po resetu dávám komparátoru 20ms na ustálení potom povoluji GIE, přesto to dělá.

Zatím si nevím rady, v programování ještě nejsem moc zběhlý.
Díky moc.
Martin
stridac.asm (7.79 KB)

Není mi docela jasný, proč jsi nepoužil soubor P16F630.INC ?? Už jen tímhle jsi mohl udělat nějakou chybu.

V přerušení nemusíš nulovat GIE, koukám že tam toho je víc.

Zkus to teď. Něco málo jsem ti upravil.
stridac.asm (6.82 KB)

soubor *.inc nepoužívám z historických důvodů, protože jsem se to kdysi naučil bez toho.
Jsem zvědavý jestli tvoje úpravy pořeší můj problém.
Co dělá banksel? Předpokládám že to nějak automaticky přepíná banky, je tomu tak?

Díky moc.

Je to spíš o tom, že se v tom pak vyznat je problém. :open_mouth: Znám to z vlastní zkušenosti. :blush:

BANKSEL přepíná banky, je to náhrada za to macro, co jsi tam měl.
PAGESEL přepíná stránky.

Snad jo, i když čekat v přerušení 1 vteřinu mi připadá dost divný, ale když to bude fungovat, tak proč ne.
Do přerušení už to neskáče a při nastavení příznaku přerušení PIR1,CMIF tak to skočí do přerušení a pak se zapisuje do EEPROM. A pak to zase pokračuje v HLAVNI

Mě nenapadl jiný způsob jak pozastavit impulzy. Jde o to, že na výstupu PIC je připojen plný most a při nadproudu potřebuju funkci mostu zastavit a počkat 1s. Pak ať si to nějak pokračuje.

S přepínáním stránek jsem se zatím nesetkal.

Ten šílený výpis registrů jsem měl na začátku taky proto, že když jsem používal ty makra tak jsem se aspoň mohl kouknout v které bance se registr nachází. Používal jsem jeden soubor jako “kostru” a dopisoval zbytek. Takhle to budu mít o mnohem přehlednější.

Zatím díky za pomoc. Zítra to v práci vyzkouším a dám vědět.

no obcas to budu zaujimave stavy pre polovodice v mustku… nebude ten procesor pri ochrane troska pomaly ?

Mohl jsi si do přerušení dát nastavit nějaký příznak, třeba FLAG,0 a v HLAVNÍ ho testovat a pokud bude splněna podmínka, vypnout přerušení, vynulovat FLAG,0 , čekat 1 vteřinu, zapnout přerušení a zase se vrátit k 10ms impulzům.

Atlan: Polovodiče v můstku jsou poměrně masivní. Hlavně ta ochrana má být na to, aby na výstup někdo nepřipojil dvojnásobnou zátěž. Polovodiče to snesou, chlazení už ne.

Zatím je to pouze zkušební verze, finální verze bude mít ještě mírně poupravený program.

honza3: Díky, popřemýšlím o tom

EDIT: Tak jsem upravenou verzi vyzkoušel a efekt žádný, pořád mi to po startu skáče do přerušení.

EDIT2: Pořešil jsem to tak, že mi přerušení hned po startu nevadí. Proč to MPLAB SIM nedělá a skutečný PIC jo mi není v tuto chvíli jasné.
Než povolím GIE, tak vynuluju CMIF. Přerušení od jiné periferie nemám povoleno.

Můžeš sem hodit schéma? Jestli teda není tajné. Jde mi o to, jak máš ty comparatory zapojené a na kterém pinu měříš. Mám takové tušení, že máš špatně nastavené ty comparatory. Já jsem si s nimi kdysi hrál u 16F887 a nějak jsem se v tom nevyznal. :blush:

A proč tam máš tohle?

BCF STOP ;STOP BIT HLAVNI BTFSC STOP ;OTESTUJ STOP BIT SLEEP ;JESTLI STOP = 1 -> ZACYKLOVAT SE NA HLAVNI

Příznak přerušení od komparátoru CMIF je nastaven při změně COUT z log.1 do log.0 nebo naopak.
Tedy při přechodu měřeného napětí nad referenční i zpět (příznak COUT). V přerušení to nemáte ošetřené.

Příznak CMIF je nastavován i když je globální přerušení zakázáno GIE=0, hned po zapnutí komparátoru a změně COUT.
Proto do INIT před instrukci BSF INTCON,GIE bych dal ještě dva řádky, MOVF CMCON,W a BCF PIR1,CMIF.
A jelikož je rutina přerušení honě dlouhá (časově), dal bych to samé i před KONEC přerušení,
(v tom případě se může vynechat SMAZÁNÍ PŘÍZNAKU KOMPARÁTORU na začátku).

Proč načíst registr MOVF CMCON,W? Doporučuji prostudovat datasheet PIC16F630/676
Přerušení od komparátoru na stránce 44 a příznaky přerušení str.15.
Překlad najdete na copsu.cz/mikrop/?obsah=downl … ual&w=1280

Tak už je mi docela jasné, proč jsem se s tí tenkrát při pokusech nedomluvil. :blush:

Koukám, že to s těma komparatorama není vůbec jednoduché :smiley:, ale doplnil jsem do dle rad ondra.cer, takže zkus to, pokud už jsi si to nedoplnil sám :smiley:
stridac.asm (6.89 KB)

Schéma mám načmáraný rukou na papíře.
Používám interní zdroj referenčního napětí. Vstup -CIN je připojen na jezdec trimru 1K, který tvoří dělič.
Snad na tom není co pokazit. Jinak celý port A mám nastaven jako vstupy, které “visí ve vzduchu”

STOP a zbytek s tím související tam bylo proto, že se tam uvažoval zvláštní servisní režim kdy potřebuju zastavit program. Spíš pro sichr, teď to půjde odstranit, budu to řešit jinak.

ondra.cer: Děkuji, zkusím program upravit podle vašich rad. Zatím jsem přerušení používal jen k TMR0, tohle je první aplikace komparátoru.

Do datasheetu jsem se díval, tam jsem to pochopil jako 2 rovnocený možnosti, zase tolik angličtinou nevládnu takže kdo ví co jsem to četl.

Proto jsem chtěl vidět schéma. Ted už je mi jasné, proč ti to nefunguje. Máš nastavenou interní referenci a přitom to nastavuješ trimrem. Zítra na to mrknu, jsem v práci, pokud na to do té doby nepříjdeš sám.

Trimr tam mám z důvodu přesného donastavení. Je tam ještě snímací odpor 1R, kterým prochází proud. Nemůžu to připojit na vstup PICu napřímo, jednak nemůžu spoléhat na přesnost součástek a za další v jednom kusu bude trimrem nastaveno 2A, v dalším jen 1A. Proto ten trimr. Podle mě to je naprosto správně.
Teď si myslím, že mi to dělá bordel právě z toho důvodu co psal ondra.cer . Dneska to v práci otestuju a uvidím.

Tak jsem tě špatně pochopil. Myslel jsem, že tu referenci si nastavuješ trimrem. Úpravy co psal ondra.cer máš v tom posledním ASM.

To přerušení po startu se mi nedaří čímkoli eliminovat. Zatím to nechám tak. Při příští verzi programu to celý udělám jinak.

Zjišťuju, že si raději přepínání bank pohlídám sám.