PIC, assembler, interrupt

Sekcia: Programovanie 18.07.2009 | 06:08
Avatar Grawp   Používateľ
(pic16f628)
Ak pouzijem pin RB0 ako interrupt mozem ho nadalej pouzivat ako input port?

Ide mi o to ci po preruseni mozem ten pin testovat na to ci je este stale HIGH (test ci je este stale tlacitko stlacne). Samozrejme interrupt nastaveny na rising edge.
    • Re: PIC, assembler, interrupt 18.07.2009 | 13:43
      filodendron   Návštevník
      Samozrejme, že sa to dá. Pri zmene hrany na pine, procesor nastaví vlajku INTF, a keď je súčasne povolený bit INTE, tak skočí na adresu obsluhy prerušenia. Nič viac a nič menej. Podobne sa správa procesor aj pri iných prerušeniach: Pri splnení podmienok prerušenia nastaví vlajku xxxF, a keď je povolené xxxE tak skočí na adresu obsluhy prerušenia. Zhodenie vlajky xxxF musí vykonať program obsluhy prerušenia. Ináč by sa po opustení rutiny prerušenia vyvolalo to isté prerušenie opäť, čo je vo väčšine prípadov nežiadúce.
      • Re: PIC, assembler, interrupt 18.07.2009 | 15:52
        Avatar Grawp   Používateľ
        Ide mi o nieco ine. Potrebujem spravit neco taketo: Stlacim tlacitko tym sa dostane do HIGH a kedze prerusenie bude nastavene na stupajucej hrane skoci okamzite na adresu prerusenia. Nasledne ma pustit odpocitavanie tak 500ms a nasledne ma skontorlovat ci uz je tlacitko pustene (A toto sa pytam ci sa da!). nasledne ak je skoci inde, ak neni pocita dalsich 500 ms a ak je potom pustene , skoci inde atd...

        Pytam sa ci mozem normalne testovat BTFSC PORT0,RB0 aj ked sa pin pouziva na samotne prerusenie.
        • Re: PIC, assembler, interrupt 18.07.2009 | 20:45
          filodendron   Návštevník
          Prerušenie nevykonáva nič iné, než to, čo som už napísal. Z toho je jasné, že ostatné záleží už iba od programu. Program si môže robiť s pinom čo chce. Prerušenie nemá na funkciu pinu žiaden vplyv.
          Ja osobne sa snažím využívať prerušenia iba vtedy, ak nie je iná možnosť. Testovanie tlačítka vačšínou stačí dať do programovej slučky, v ktorej sa procesor rozhoduje podľa stavu tlačítka. Netreba testovať stav pinu, ale iba stav vlajky INTF, ktorú procesor nastaví aj vtedy, keď nie je povolené prerušenie. Nič nebráni programu potom čakať aj 500 ms, zhodiť vlajku INTF a podľa úrovne na pine sa rozhodnúť o ďalšom pokračovaní programu.
          • Re: PIC, assembler, interrupt 19.07.2009 | 02:14
            Avatar Grawp   Používateľ
            Ok, diky.
            Este jednu vec by som sa chcel opytat. Bude za chybu ak sa z prerusenia nebudem vracat pomocou RETFIE ale cez GOTO? teda ak sa nepotrebujem vratit na miesto kde prerusenie nastalo.
            • Re: PIC, assembler, interrupt 19.07.2009 | 09:55
              filodendron   Návštevník
              Dá sa to, ale nie je to "programátorské", pretože v zásobníku procesora ostane návratová adresa. Pri použití nejakého ďalšieho podprogramu nastane v zásobníku chaos medzi návratovými adresami a program sa bude správať hazardne. Pokiaľ však v celom programe nebude okrem toho prerušenia použitý iný podprogram, bude to fungovať.
              • Re: PIC, assembler, interrupt 19.07.2009 | 11:47
                Avatar Marián Sova Ubuntu 10.10  Používateľ
                Stačí príslušne upraviť ukazateľ zásobníka. Alebo urobiť inštrukciu výber zo zásobníka, pred goto. Podľa inštrukčnej sady sa mi ale nezdá, že by PIC mal nejakú takú inštrukciu (hádam som sa len zle pozrel, s PICmi nerobím).
                Čo ťa nezabije, to ťa posilní | Leták na propagáciu jabbera v pdf | www.mikroprocesory.sk
                • Re: PIC, assembler, interrupt 19.07.2009 | 14:01
                  filodendron   Návštevník
                  Jedine inštrukcie typu call a return vedia pristupovať k zásobníku. Tento PIC nemá iné inštrukcie, ktorými by sa dal upravovať zásobník. Pokiaľ sa použije pred návratom z "goto" rutiny nejaká inštrukcia typu return, tak sa zásobník upraví na správnu hodnotu a program bude pokračovať nasledujúcou inštrukciou, pred ktorou bolo vyvolané prerušenie.
                  • Re: PIC, assembler, interrupt 19.07.2009 | 14:55
                    Avatar Marián Sova Ubuntu 10.10  Používateľ
                    Aha. To nie je dobré. A čo inkrementovať alebo dekrementovať (podľa toho ako funguje zásobník) ukazateľ zásobníka? Alebo sa nedá ten register, kde je ukazateľ zásobníka tiež meniť?
                    Čo ťa nezabije, to ťa posilní | Leták na propagáciu jabbera v pdf | www.mikroprocesory.sk
                    • Re: PIC, assembler, interrupt 19.07.2009 | 16:51
                      Avatar Grawp   Používateľ
                      The PIC16F627A/628A/648A family has an 8-level
                      deep x 13-bit wide hardware stack (Figure 4-1). The
                      stack space is not part of either program or data space
                      and the Stack Pointer is not readable or writable. The
                      PC is PUSHed onto the stack when a CALL instruction
                      is executed or an interrupt causes a branch. The stack
                      is POPed in the event of a RETURN, RETLW or a
                      RETFIE instruction execution. PCLATH is not affected
                      by a PUSH or POP operation.

                      Ale v mojom pripade to nevadi. Nic ine okrem prerusenia stack nepouziva, nemam nikde RETURN alebo RETLW
                      Moj program je obycajna blikacka s viacerymi vzormi. Vzory sa nastavuju podla registra "pattern"
                      Na zaciatku spusti TEST podla ktoreho spusti nektory vzor, ked skonci pusti test odznovu. Prerusenie mi prestavuje "pattern" register. A aby zmena nastala hned je tam GOTO na TEST. Nemozem predsa za kazdou castou kde mam aj delay kontrolovat zmenu patttern bytu