"Interrupt on change" på PIC18LF2320 ?
Postat: 15 augusti 2006, 20:11:46
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:
(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?
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
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?