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.
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í
administrator: přejmenováno z “Problém s přerušením”
administrator: přiloženy externí soubory preruseni.asm (1.76 KB)
CAU,
1)D’256’
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 uchovavat obsahy registru pri preruseni netreba ?
díky za náměty 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
Ta reakce na změnu mi nevadí, to je ideální. Takže nemam vůbec sahat do OPTIONu?
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
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)
Dobře dobře 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 Díky za nervy zatím Jestli to dneska večer uchodim, tak snad probořim strop radostí
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í?
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
Pro kontrolu přikládám ASM… prerus_s_led.asm (962 Bytes)
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.