16F84A: Jak nastavit, aktivovat a použít přerušení od RB4-7?

Zdravím, začínám se učit PIC16F84A, a po internetu jsem našel spousty věcí, ale jediná věc kterou nedokáži zkrotit je přerušení.

V podstatě jsem odněkud vyčetl že přerušení se musí globálně povolit v registru INTCON,bit GIE, a pro moje zapojení také bit RBIE, pro povolení přerušení od RB4-7. Také mam přes příkazy org skoky na návěští program a obsluhy přerušení. Přikládám odkaz na můj program, je to napsané pro test funkce přerušení, hlavní program je jednoduchý blikač. Při přerušení se má měnit počet LED které budou blikat.Není to zrovna pěkně upravené, plive to tak MPLAB.

zbctuning.cz/preruseni.asm

V simulátoru to přerušení prostě nefunguje. Také mám dotaz, příkazem RETFIE se procesor vrací do místa, odkud byl přerušen. Je možné tuto instrukci nepoužít, a donutit tak procesor začít o 00h programové paměti?
Také mám nejasnost v tom, pokud je přerušení nastaveno na piny RB4-7, tak pokud RB7 mám jako vstup, a RB6-4 jako výstupy, jestli to na přerušení má vliv?

Děkuji za pomoc a rozšíření mých vědomostí :smiley:

:arrow_right: administrator: přejmenováno z “Problém s přerušením”

:arrow_right: administrator: přiloženy externí soubory
preruseni.asm (1.76 KB)

Při přerušení od RB 4-7 musíš před nulováním RBIF přečíst PORTB.

MOVF PORTB,w bcf INTCON,RBIF

CAU,
1)D’256’ :question:
2)pri preruseni od RB4-7 nejde nastavit preruseni jen na spadovou ci sestupnou, pouze na zmenu stavu
3)nez povolis preruseni je lepsi si vynulovat priznaky preruseni a pak ho povolit
4)pred instrukci RETFIE (navratu z preruseni) musis vynulovat priznaky preruseni ! (uz sem to tam nasel)
5)to co psal Honza
6)

ne
7)

ne
8)uchovavat obsahy registru pri preruseni netreba ?

Ahoj,

díky za náměty :slight_smile: Co se týče přečtení PORTuB, čeho tím docílím, že obsah portub přesunu do W registru?
za D’256’ se omlouvam, mam v tom guláš, už si dam pozor :slight_smile:
Ta reakce na změnu mi nevadí, to je ideální. Takže nemam vůbec sahat do OPTIONu? :slight_smile:

A co se týče uchování registrů, při přerušení se myslim sahá jen do W, a další mnou definované registry se nijak nemění, ne?

Sečteno podrtženo, nesahat do OPTIONu, a přesunout PORTB do W, a mělo by to jet? Jdu to zkusit :slight_smile:

vynulujes priznak

nemusis

melo by se W + status. poku W staci …
a melo by to jet

No jo, ale instrukcí MOVF se hodnota jenom zkopíruje do W, a ve výchozím registru zůstavá. Takže to řeším BCF PORTB,7 8)

Zkusím to bez záloh, pokud budou problémy, přidam zálohování W se STATUSem.

Zatím díky moc :smiley:

Tak už jsem zoufalý, stále to neběhá jak má:( Přikládám znovu celý program, který má přepínat mezi blikačem, a PWM regulací svitu LED. Při přerušení to má nastavit 1čku do registrů smyček, aby se co nejdříve ukončily, a podprogram došel ke konci. Po zapnutí blikač funguje, po stisku tlačítka dojde ke svitu LED nebo blikají rychlostí těsně před hranicí kdy to je ještě vidět.
Taky jsem nezmínil že neustále držím na RB7 odporem 10k log.1, a mikrotlačítkem uzemňuji. Někde se to celý zasekne, ale nemam vůbec tušení kde se to děje.
preruseni.asm (4.16 KB)

odpoledne na to kouknu

POKUD to neuděláš, nebude to fungovat! A neptej se proč, pokud se zeptáš, přečti si DS

:laughing: jak z hluchim (v tomto pripade mozna slepim)

bejt tebou tak vyhazu vsechno krome toho preruseni, v MAINu si zhasni ledku v preruseni ji rozsvit, az ti tohle pude muzes kod rozsirovat

a pokud ignorujes co ti Honza radi tak ti neni pomoci … :unamused:

kvuly nevynulovanymu priznaku

MOVLW B'10000000' MOVWF TRISB . . . BSF PORTB,7 :laughing:

Dobře dobře :slight_smile: Dám na Profíky. Až se dostanu v osm domů, očistim program od programů a udělám něco jednoduchého, abych hlavně rozchodil to přerušení. DS rozhodně nastuduju, zajímá mi to :slight_smile: Díky za nervy zatím :slight_smile: Jestli to dneska večer uchodim, tak snad probořim strop radostí :slight_smile: :smiley: :smiley: :smiley:

Budu trochu OT, ale zařekl jsem se, že kdo vytáhne z hrobu 16F84, tak je masochista a kdo chce kam… prostě bych ho nechal trpět.
Proč začínat tím nejhorším, starým a téměř nepoužitelným, když je spousta slušnejch, novejch a velice lacinejch věcí?

Nechám se rád inspirovat :slight_smile: s 16F84A dělam jelikož jsme s ním začínali na učňáku :slight_smile: Tak proto :slight_smile:

Tak jsem aplikoval všechny rady co jste mi tu dali…kód jsem přepsal na něco jednoduchého, mělo to pouze rozsvítit, a zhasnout LED. V reálu se to chová tak, že po zapnutí LED nesvítí, a rozvítí se pouze pokud se stiskne a drží tlačítko na RB,7, vyvolávající přerušení. Pokud se pustí, LED zhasne. Každopádně už takto je to špatně, jelikož v programu stojí, že led má zpočátku svítit, a teprv po přerušení zhasnout a zůstat tak… Opravdu, ale opravdu nemám tušení, co se tu děje :cry:
Pro kontrolu přikládám ASM…
prerus_s_led.asm (962 Bytes)

Plně souhlasím s jankopem.

Ale k problému. Přerušení od RB4-7 reaguje na změnu stavu, což přesně tvuj program dělá. Pokud ti LED nesvítí a má svítít, je to tím, že ty nehlidáš, jestli se má testovat LOG 0 nebo 1 na RB7.

Ze srdce opravdu moc díky!! 8) 8) Na začátek obsluhy přerušení jsem vložil:

BTFSC	PORTB,7
GOTO	KONEC
.
.
.
.

KONEC    RETFIE

A už to šlape jako hodinky! Paráda, jsem maxximálně spokojen :slight_smile: :smiley: