PIC16F84A - interrup na RB0 PINU problem

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
flash005
Posts: 16
Joined: 30-12-2008, 21:28

PIC16F84A - interrup na RB0 PINU problem

Post by flash005 »

Pozdrav svima,

Evo ponovo pokušavam nešto uraditi sa interrupima, ali sam zasto zbog problema sa pull up otpornikom.
1. Sljedeći kod radi bez problema sve dok je na RB0 pinu priključen pull-down otpornik.
2. Međutim kad umjesto njega stavim pull-up otpornik, interrupt rutina se aktivira samo prvi put (ito samo kada se uređaj isključi iz napajanja pa ponovo uključi pritiskom na taster sa pull-up otpornikom rutina se aktivira. međutim sljedećim pritiskom na taster ništa se ne dešava :SSSSSSS).
3. Ako uključim interne pull-up otpornike koji mi i trebaju (OPTION_REG.F7 = 0;), interrupt rutinu nemogu nikako aktivirati.

Napomena: Dakle sa vanjskim pull upom je moguće samo prvi put aktivirat rutinu tj. nakon restartiranja uređaja, i više ne. Dok sa internim pull-upom nijednom. Stvarno neznam gdije griješim dva dana guglam pregledavam datasheet-ove imam i knjigu o pic16f84 ali bez ikakve pomoći :(.

Code: Select all

void interrupt() {

  if(INTCON.INTF)
  {
     PORTA = 255;
     DELAY_MS(2000);
     INTCON.INTF = 0;
  }
}//~

void main() {
  OPTION_REG.INTEDG=0;
  OPTION_REG.F7 = 1;
  TRISA = 0;
  porta = 0;
  TRISB = 0xff;
  INTCON.GIE = 1;
  INTCON.INTE = 1;

  do {
      PORTA = ~PORTA;
      DELAY_MS(500);

  } while(1);
}//~!
User avatar
trax
Administrator sajta
Administrator sajta
Posts: 3509
Joined: 08-01-2005, 18:04
Location: 75k, BA
Contact:

Re: PIC16F84A - interrup na RB0 PINU problem

Post by trax »

Sa ovim:

Code: Select all

  OPTION_REG.INTEDG=0;
si rekao da zelis da ti se interrupt aktivira prilikom dovodjenja GND-a na pin RB0/INT. (INTEDG: Interrupt Edge Select bit: 0 = Interrupt on falling edge of RB0/INT pin)
To znaci da na ovaj pin treba da dovodis logicku nulu i imas pull-UP otpornik na njemu.
Probaj ovaj kod:

Code: Select all

void interrupt() {
      if(INTCON.INTF)
      {
         INTCON.INTF = 0;
         PORTA = 255;
         DELAY_MS(2000);
         PORTA = 0;
      }
    }//~

    void main() {
      OPTION_REG.INTEDG=0; // edge selection
      OPTION_REG.F7 = 1; // pullups enabled
      TRISA = 0; // all outputs
      porta = 0; // all off
      TRISB = 255; // all inputs
      INTCON.INTE = 1; // 1 = Enables the RB0/INT external interrupt
      INTCON.GIE = 1; // all interrupts enabled

      do {
        // nista, sve je u ISR-u
      } while(1);

    }//~!
Ne znam za koji ti je ovo kompajler, ali mozda nisi dobro nazvao ovu interrupt funkciju. Mozda uopste nije na vektoru 0x04, pa mikrokontroler ne skace na nju prilikom okidanja interrupta.
flash005
Posts: 16
Joined: 30-12-2008, 21:28

Re: PIC16F84A - interrup na RB0 PINU problem

Post by flash005 »

Ovim kodom

Code: Select all

OPTION_REG.F7 = 1; // pullups enabled

Interni pull-up otpornici su isključeni, kod pic16f84a se uključiju kad se taj bit poslavi na logičku nulu.

Zapravo ista stvar se dešava, pic udje samo jedanput u interrupt rutinu sa eksternim pull-up otpornicima, a sa internim neće nikako - pojma nemam zašto. (još da napomenem sa pull-down eksternim naravno, sve radi bez problema).

Koristim mikroC pro kompajler V.4.1
User avatar
arcom
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 447
Joined: 05-03-2010, 20:47
Location: Rijeka
Contact:

Re: PIC16F84A - interrup na RB0 PINU problem

Post by arcom »

Prva greska koju radis je stavljanje delay_ms rutine u interrupt. To se ne radi nikada, a ni onda :)
Interrupt treba biti sto kraci/brzi. Drugo, pametno je resetirati sve interrupt zastavice prije aktiviranja globalnih interrupta.

Probaj ovako nesto:

Code: Select all

unsigned cnt; 

void interrupt() {
      if(INTCON.INTF)
      {
         cnt++;
         INTCON.INTF = 0;
      }
    }

    void main() {
      cnt = 0;

      TRISA = 0; // all outputs
      porta = 0; // all off
      TRISB = 255; // all inputs
      OPTION_REG = 0xC0; // enable portb pullups; set interrupt on falling-edge 
      INTCON = 0x90; // enable INT interrupt; enable global interrupts; clear all interrupt flags

      do {
        PORTA = cnt;
      } while(1);

    }
Post Reply