PIC18F Nastavení přerušení od pinu RB6/PGC RB7/PGD

Zdravím. Chtěl bych se zeptat, jestli někdo neví, jak nastavit piny RB6 a RB7, aby fungovaly jako vstupní piny? Používám procesor PIC18F4550. Všechno funguje jak má, přerušení na PORTB na pinech RB0 až RB3 funguje, ale tyhle dva piny mi nefungujou. Nastavil jsem v registru INTON bit RBIE, ale přerušení jaksi nefunguje od těchhle dvou pinů. Celá vstupní brána je nastavená jako vstupní. Nějakej nápad v čem by mohl být problém? Děkuji za odpověď

RB7 a RB6 jsou zároveň PGC a PGD. Nemáš náhodou zaplej debugging?

No já vím, že jsou. Naprogramoval jsem to v MPLABu přes sekci programmer…PICKIT3, odpojil programátor, spustil z baterky. Napsal jsem do kódu direktivu # pragma config DEBUG=OFF a nic.

Já už přes MPLAB neprogramuju dlouho, kolikrát to dělalo neuvěřitelný kousky i s PICkit2. Mrkni se do HEX souboru, jestli tam ty pojistky skutečně jsou nastavené jak mají být, a případně vyskoušej tu standalone programovací aplikaci pro PK3.

Když spustím software Pickit3, načtu hexáč a podívám se na konfigurační bity, tak je DEBUG skutečně zakázanej. V datasheetu k tomu nic specifickýho nepíšou. Jenom nastavit přerušení, což je…globální samozřejmě i změna na portuB RBIE. Obsluha přerušení je napsaná dobře. Tlačítko zapojený dobře. Obojí ozkoušený.

A když to s tím softwarem i naprogramuješ, tak se děje co, pořád to samý? Máš tu 18F4550 v DIPu nebo v TQFP pouzdře?

Pořád to samý. Mám to v DIP…teď jsem to zkoušel s PIC18f4520, kterej mám v TQFP na plošňáku, co bezproblémů funguje. Výsledek je stejnej.

A RBIF flag se ti nastavuje? Jinak v DS na straně 114 se píše:

The interrupt-on-change feature is recommended for wake-up on key depression operation and operations where PORTB is only used for the interrupt-on-change feature. Polling of PORTB is not recommended while using the interrupt-on-change feature.
Co ti to přesně má v tom zapojení dělat, jakým přesně způsobem tu funkcionalitu chceš použít?

Potřebuju to kvůli menu na displeji. Jestli se příznak nastavuje nevím, protože to s tím nedebuguju…tlačítko mám mimo plošňák na bastldesce. Ale kdyby se nastavil příznak, tak bych se dostal do přerušení (na základě přerušení rozsvěcuju LED, abych zjistil jestli to funguje). Takže se s největší pravděpodobností nenastavuje RBIF. No to stejně nezjistím, jestli se nastavuje. Protože když budu v vežimu debug, tak ty dva piny RB6 RB7 nebudou v režimu vstupu…nemýlím-li se.

Máš několik možností. Pokud potřebuješ používat debug (jakože asi ne, když ses snažil si ho zakázat), můžeš to přerušení při změně zkoušet i na RB5 a RB4. Otestovat jestli se nastaví RBIF flag není nic těžkýho, dej si někam na nějakej volnej výstup LED a v patřičným místě programu ho (flag) jen zkopíruj na výstup. RBIF flag se ti nastavit musí, bez něj se to přerušení nevyvolá, a až budeš vědět, jestli se ti nastavuje, tak tě bude zajímat ještě RBIP bit, kterej určuje prioritu přerušení - pokud bude nastavená vysoká (RBIP=1), skáče se na vektor 0008h, pokud nízká (RBIP=0), tak na vektor 0018h. Ovšem u té nizké je ještě jedna “zrada” - pokud se má vyvolat přerušení s nízkou prioritou, je tam ještě bit PEIE/GIEL, který musí být nastavený (maskování přerušení).

Jinak v DS na straně 99 se v poznámce píše k tomu RBIF bitu tohle:

A mismatch condition will continue to set this bit. Reading PORTB will end the mismatch condition and allow the bit to be cleared.
Takže pokud si mezitím někde čteš cokoliv z PORTu B (z celýho portu!), tak si tím ten RBIF bit nuluješ. Já už jdu spát, přeji úspěšný lov…

Tak problém vyřešen. Bylo to tím, že priorita přerušení PORTB Interrupt-on-Change byla defaultně nastavená jako nízká. Já měl obsluhu přerušení jenom s vysokou prioritou :-\ Ostatní přerušení jsem nastavoval aby měly high priority, na tohle jsem zapomněl. Moc děkuju za pomoc!!! nevím, jestli bych na to sám přišel.

Ale přišel, akorát by ti to možná trvalo delší dobu… ale z takových věcí si nic nedělat, “žádnej učenej z nebe nespad”, a krom toho to mohlo bejt klidně i daleko horší - já takhle naposledy proseděl dva dny u DS18B20 a furt se divil, že načítám samý nuly, dokonce jsem si kvůli tomu pak pořídil i malej logickej analyzér (a divil se ještě víc, protože čidlo dělalo přesně to co mělo), a až po dvou dnech “jsem si vzpomněl”, že je tam vlastně taky nějakej ANSELx registr (přenášel jsem program z jinýho typu na PIC16F1937) :blush: :laughing:

Takže není zač, jsem rád že jsem pomohl, a oceňuju že jsi se sem vrátil a napsal, čím to bylo.