"Interrupt on change" på PIC18LF2320 ?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
JimmyAndersson
Inlägg: 26651
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

"Interrupt on change" på PIC18LF2320 ?

Inlägg av JimmyAndersson »

Jag lyckas inte få ett interrupt på KBIx-pinnarna.

Har förstås läst databladet men tänkte bara kolla så jag inte missuppfattat något:

INTCON.RBIF "RB Port change Interrupt Flag bit" är väl den som blir hög när t.ex KBI0 ändrats? INTCON.INT0IF är väl bara för INTx-pinnarna?


Kod:

Kod: Markera allt

sub procedure init
  
  'Encoder 1
  SetBit(TRISB, 4)   ' Ingång PORTB.4 (Encoder 1A)
  SetBit(TRISC, 0)   ' Ingång PORTC.0 (Encoder 1B)
  ClearBit(PORTB, 4) ' Rensa PORTB.4  (Encoder 1A)
  ClearBit(PORTC, 0) ' Rensa PORTC.0  (Encoder 1B)
  
  'Initiera interrupt
  INTCON.GIE = 1 ' Global interrupt enable.
  INTCON.PEIE = 1 ' Enable yttre interrupt.
  INTCON.TMR0IE = 0 ' Disable TMR0 overflow interrupt.
  INTCON.INT0IE = 0 ' Disable INT0 external interrupt.
  INTCON.RBIE = 1 ' Enable RB-port change interrupt.
  INTCON.TMR0IF = 0 ' TMR register did not overflow.
  INTCON.INT0IF = 0 ' INT0 external interrupt did not occur.
  INTCON.RBIF = 0 ' None of the RB7:RB4 pins have changed state.

  INTCON2.RBPU = 1 ' All PORTB pull-ups are disabled
  INTCON2.INTEDG0 = 1 ' External interrupt (Interrupt0) on rising edge
  INTCON2.INTEDG1 = 1 ' External interrupt (Interrupt1) on rising edge
  INTCON2.INTEDG2 = 1 ' External interrupt (Interrupt2) on rising edge
  INTCON2.TMR0IP = 0 ' TMR0 Overflow Interrupt = Low priority
  INTCON2.RBIP = 0 ' Port Change Interrupt = Low priority

  INTCON3.INT2IP = 0 ' INT2IP - External interrupt, låg prioritet
  INTCON3.INT1IP = 0 ' External interrupt, låg prioritet
  INTCON3.INT2IE = 0 ' Disable INT2 external interrupt
  INTCON3.INT1IE = 0 ' Disable INT1 external interrupt
  INTCON3.INT2IF = 0 ' INT2 external interrupt did not occur
  INTCON3.INT1IF = 0 ' INT1 external interrupt did not occur

  PIR1 = $00
  PIR2 = $00

  PIE1.PSPIE = 0 ' PSPIE - Parallell slave port read/write disabled
  PIE1.ADIE = 0 ' Disable A/D interrupt
  PIE1.RCIE = 0 ' Disable USART interrupt (Receive)
  PIE1.TXIE = 0 ' Disable USART interrupt (Transmit)
  PIE1.SSPIE = 0 ' Disable Master synchronous serial port interrupt
  PIE1.CCP1IE = 0 ' Disable CCP1 interrupt
  PIE1.TMR2IE = 0 ' Disable TMR2 to PR match interrupt
  PIE1.TMR1IE = 0 ' Disable TMR1 overflow interrupt

  PIE2 = $00
  IPR1 = %10000000
  IPR2 = $00

  RCON.IPEN = 0 ' Disable priority levels on interrupts
end sub


sub procedure interrupt
  if TestBit(INTCON, RBIF) = 1 then
     tmp1 = PORTB.4
     tmp2 = PORTB.5
     ClearBit(INTCON, RBIF)
     'Tänd LED1
     PORTB.2 = 1
  end if
end sub
(Sedan finns även en main-rutin, men den blinkar bara en lysdiod på PORTC.4 och detta kan avbrytas av ett interrupt.)
Det som ska hända i detta test-case är att lysdioden på PORTB.2 ska tändas när man får ett interrupt på någon av KBIx-pinnarna. På dessa sitter bara knappar som ett test för att skicka en hög eller låg signal till KBI0 (PORTB.4) och KBI1 (PORTB.5)

Vad kan vara fel?
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Tänds lysdioden om du lägger "PORTB.2 = 1" i main ?
Bara så att du inte har kopplat den fel...

Är detta för att "end the missmatch condition" ?

> tmp1 = PORTB.4
> tmp2 = PORTB.5

Om inte tmp1 och tmp2 används någon annanstans, så räcker det
med "tmp1 = PORTB", eller liknande, du behöver inte läsa varje bit för sig.

Annars vet i fanken, det *ser* OK ut så här lite snabbt.

Jag skulle lägga till fler leds och i main "visa" status på pinnarna,
biten "RBIF" o.s.v.
Användarvisningsbild
JimmyAndersson
Inlägg: 26651
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

> Tänds lysdioden om du lägger "PORTB.2 = 1" i main ?
> Bara så att du inte har kopplat den fel...

Jodå, så långt fungerar det. Bra test för jag upptäckte att jag tagit fel motstånd till LEDen. På vissa motstånd i E12-serien är det ibland svårt att se om en ring är brun eller röd eller orange...

tmp-raderna är mycket riktigt för att "end the missmatch condition".

Nu har jag lyckats få interrupt. Men jag vet inte riktigt varför det helt plötsligt fungerar. Det enda jag gjorde var att bygga (build) koden på en annan dator. MikroBasic är installerat från samma installationsfil på båda datorerna.

Ser att jag får lite störningar från encodern. Det blir interrupt så fort jag har fingrarna nära encodern. Det finns ingen ingång som "fladdrar löst" någonstans. Eller jo egentligen är det nog så; jag har ingen pull-up/down till encodern. Ska fixa det och några kondingar och testa igen.

Bra idé med fler status-led's.
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Men jag vet inte riktigt varför det helt plötsligt fungerar.

"Blandat bort" dina HEX filer ? :-)

> Det finns ingen ingång som "fladdrar löst" någonstans. Eller jo egentligen
> är det nog så; jag har ingen pull-up/down till encodern.

Exakt.
Encodern antingen *sluter* till den gemensamma pinnen, eller är "öppen"...

10k till 5V och common till gnd så bör det gå bättre.
Användarvisningsbild
JimmyAndersson
Inlägg: 26651
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

> "Blandat bort" dina HEX filer ?

:D
Nja, jag har bra ordning på dem.

Nu har jag lagt till motstånden, så nu fungerar allt. Tack!
Skriv svar