Hi,
Look at your available interrupts list ...
Does "change on Port B" seem familiar ???
Go on ...
Alain
Hi,
Look at your available interrupts list ...
Does "change on Port B" seem familiar ???
Go on ...
Alain
************************************************** ***********************
Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
************************************************** ***********************
IF there is the word "Problem" in your question ...
certainly the answer is " RTFM " or " RTFDataSheet " !!!
*****************************************
Hi Acetronics. Thanks for your reply. As I said I wanted to use Interrupt from "Change on portB", but it didnot work. I use PIC16F84 in my project so I should optimize use of pins. I defined all of pins of PORTB as output except for one of them. I connected a push button to that. It didnot work normally. Why? Can you help me? How can I do that? Have you any example of method of using Change on port B interrupt?
Hi,Yasser
First , In the title , understand we do not know at all what you did ( hardware ) nor what you wrote ( software ) ... and there are no "crystal ball" option on this forum ...
For the car ... " did you insert the key ??? " is a first question to consider ...
...
There's a funny thing in this feature ... the "end of mismatch" condition.
I think there were ( numerous ) threads about that on this forum. ( a SEARCH will be useful ...)
... in a word, you have to READ PortB in your interrupt stubb to get it that interrupt working properly ( see examples given ...)
BUT, as always ... only knowing which processor and compiler ... leaves NUMEROUS non-working reasons ...
Alain
************************************************** ***********************
Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
************************************************** ***********************
IF there is the word "Problem" in your question ...
certainly the answer is " RTFM " or " RTFDataSheet " !!!
*****************************************
Thanks alot dear Acetronics.
I wrote this simple program for testing portB change interrupt.
'************************************************* ****************
'* LCD Deifnes *
'************************************************* ****************
DEFINE LCD_DREG PORTD ' I/O port where LCD is connected
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 2 ' Register select pin
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 3 ' Enable pin
DEFINE LCD_BITS 4 ' 4-bit data bus
DEFINE LCD_LINES 2 ' LCD has 2 character lines
'************************************************* ****************
'* Interrupt Initialzing *
'************************************************* ****************
INTCON = %10001000 ' GIE and RBIE are set
OPTION_REG = %10000000
'************************************************* ****************
'* Initialzation *
'************************************************* ****************
TRISB = %00010000
PORTB = 0
ON INTERRUPT GOTO DIRECTION
'************************************************* ****************
'* Main Program *
'************************************************* ****************
MAIN:
lcdout $fe,1
lcdout "Main Routine"
pause 500
GOTO MAIN
END
'************************************************* ****************
'* Interrupt Service Routine *
'************************************************* ****************
DISABLE
DIRECTION:
lcdout $fe,1
lcdout "Interrupt !!!"
PAUSE 100
INTCON.0 = 0
RESUME
ENABLE
I compiled it and downloaded HEX file to PIC. I use PROTEUS 6 pro for simulating my program.(My Circuit Attached) When I pushed start debugging button on
proteus an unusual thing happened. I think that program should work in main loop so "Main Routine" should be written on LCD! But as soon as program starts
executing, the message "Interrupt !!!" is shown on LCD!! even if the push button isn't pressed. Why it does not work correct?!!
You wrote for me: "... in a word, you have to READ PortB in your interrupt stubb to get it that interrupt working properly ( see examples given ...)" What do you maen? Could you tell me about given examples?
** Although I use PIC16F877 in this simulator, I want to use PIC16F84 in my project. **
Do you know what the inital value of port B is in order to detect a change on said port B?
Are all of your Port B pins pulled high/low or whatever?
Are any of them floating? open?
2nd thought...get rid of the simulator and build some real hardware...
Hi, Yasser
I'll give a try on my test board : 16F84 + LCD ...
Alain
************************************************** ***********************
Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
************************************************** ***********************
IF there is the word "Problem" in your question ...
certainly the answer is " RTFM " or " RTFDataSheet " !!!
*****************************************
Yasser,
You're a bad student !!!
What did I tell you about " mismatch condition " ???
That works fine ... for a 16F84 !Code:STATE var Byte I var Byte PORTA = 0 PORTB = 0 '************************************************* **************** '* Interrupt Initialzing * '************************************************* **************** INTCON = %10001000 ' GIE and RBIE are set OPTION_REG = %10000000 '************************************************* **************** '* Initialzation * '************************************************* **************** PORTB = 0 TRISB = %00010000 ON INTERRUPT GOTO DIRECTION '************************************************* **************** '* Main Program * '************************************************* **************** MAIN: lcdout $fe,1,"Main Routine" FOR I = 1 to 50 : PAUSE 10 : NEXT I ' For quick response GOTO MAIN END '************************************************* **************** '* Interrupt Service Routine * '************************************************* **************** DISABLE DIRECTION: STATE = PORTB ' End of Mismatch Condition lcdout $fe,1 lcdout "Interrupt !!!" IF State.4 THEN LCDOUT $FE,$C0," LOW to HIGH " ELSE LCDOUT $FE,$C0, " HIGH to LOW " ENDIF PAUSE 1000 INTCON.0 = 0 RESUME ENABLE END
Alain
Last edited by Acetronics2; - 12th March 2008 at 14:16.
************************************************** ***********************
Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
************************************************** ***********************
IF there is the word "Problem" in your question ...
certainly the answer is " RTFM " or " RTFDataSheet " !!!
*****************************************
Hi dearAcetronics.
Thanks alot for your replies. I found a nice PDF on the net about "Using the PORTB Interrupt on Change as an External Interrupt" microchip AN566. I rewote my code:
'************************************************* ****************
'* Initialzation *
'************************************************* ****************
TRISB = %00010000
'************************************************* ****************
'* Interrupt Initialzing *
'************************************************* ****************
OPTION_REG = %10000000
INTCON = %10001000
ON INTERRUPT GOTO DIRECTION
'************************************************* ****************
'* Main Program *
'************************************************* ****************
MAIN:
PAUSEUS 10
lcdout $fe,1
lcdout "Main Routine"
pause 100
GOTO MAIN
END
'************************************************* ****************
'* Interrupt Service Routine *
'************************************************* ****************
DISABLE
DIRECTION:
@ MOVF PORTB,1
INTCON.0 = 0
lcdout $fe,1
lcdout "Interrupt !!!"
PAUSE 100
RESUME
ENABLE
and it worked correct.
Bookmarks