View previous topic :: View next topic |
Author |
Message |
oxxyfx
Joined: 24 May 2007 Posts: 97
|
int_ext problem |
Posted: Mon Jul 16, 2007 6:22 pm |
|
|
Hello,
I am trying to write a program where on a push of the button the 16F88 toggles a variable. Also for a longer push of the same button it will (should) enter the menu subroutine to give me different options to change, however the interrupt doesn't seem to work... - Yes I know it is my fault. So that's why I am asking you the more experienced one...
So the pic is 16F88, tne PIN_B4 is connected to a push button, the other end of the push button is connected to the ground...
Here is the relevant portion of the code I wrote:
Code: |
#Define M_button Pin_B4
#Define On 1
#Define Off 0
...
...
...
int Tracking;
Void ShortBeep();
Void LongBeep();
Void Menu();
#int_EXT
Void Ext_isr() {
Delay_ms(250);
If (Input(M_Button)){
If (Tracking == Off) {
Tracking = On;
Shortbeep();
Delay_ms(150);
Longbeep();
}
Else {
Tracking = Off;
LongBeep();
Delay_ms(150);
ShortBeep();
}
}
Else {
Delay_ms(1750);
If (!Input(M_Button)) {
Delay_ms(500);
If (Input(M_Button)){
Longbeep();
Menu();
}
}
}
}
...
...
...
Void
set_tris_a(0b00000001);
set_tris_b(0b11010000);
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(True);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
...
...
...
|
The PIC boots however nothing happens when I push the button - short or long push...
Can you please help me?
Thanks, Ox. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jul 16, 2007 8:14 pm |
|
|
Quote: | So the pic is 16F88, tne PIN_B4 is connected to a push button.
However the interrupt doesn't seem to work. |
RB4 uses INT_RB interrupts. RB0 uses INT_EXT interrupts.
Remember that with INT_RB interrupts, you need to read Port B inside
the ISR to clear the "mis-match condition". Also, it will interrupt on
either edge. You can't specify the edge with INT_RB. |
|
|
oxxyfx
Joined: 24 May 2007 Posts: 97
|
|
Posted: Mon Jul 16, 2007 9:17 pm |
|
|
Thank you. I remembered the INT_RB after I posted my original post and changed the code to that, but it still did not work. After I read your post I did a search on the forum and based on that modified the code to the following:
Code: |
...
...
#int_RB
Void RB_isr() {
int8 tempb;
tempb = input_b();
If (bit_test(tempb.4) == 0){
Delay_ms(500);
tempb = input_b();
If (bit_test(tempb.4) == 1){
If (Tracking == Off) {
Tracking = On;
Shortbeep();
Delay_ms(150);
Longbeep();
}
Else {
Tracking = Off;
LongBeep();
Delay_ms(150);
ShortBeep();
}
}
Else {
Delay_ms(1750);
tempb = input_b();
If (bit_test(tempb.4) == 0) {
Delay_ms(500);
tempb = input_b();
If (bit_test(tempb.4) == 1){
Longbeep();
Menu();
}
}
}
}
}
...
...
...
void main()
{
set_tris_a(0b00000001);
set_tris_b(0b11010000);
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(True);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
ext_int_edge(H_to_L);
...
...
...
}
|
It looks like it never beyond the first if statement because I can never hear the beeps - no matter how long I keep the button pressed.
Thanks,
Ox. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jul 16, 2007 10:09 pm |
|
|
You need to look at the .LST file to see what the compiler is doing.
Look at the code generated for the setup_spi(FALSE) statement.
What is it doing to pin RB4 ? How will this affect your program ?
Quote: |
.................... setup_spi(FALSE);
0010: BCF STATUS.RP0
0011: BCF SSPCON.SSPEN
0012: BSF STATUS.RP0
0013: BCF TRISB.2
0014: BSF TRISB.1
0015: BCF TRISB.4
0016: MOVLW 00
0017: BCF STATUS.RP0
0018: MOVWF SSPCON
0019: BSF STATUS.RP0
001A: MOVWF SSPSTAT
.................... |
The SPI module is disabled upon power-on reset. You don't need
to use that function. Or more accurately, the Wizard doesn't need
to put in that line and it causes harm by doing so. |
|
|
oxxyfx
Joined: 24 May 2007 Posts: 97
|
|
Posted: Mon Jul 16, 2007 11:10 pm |
|
|
Thank you, my lst file looks like this:
Code: |
.................... void main()
.................... {
*
0992: CLRF 04
0993: BCF 03.7
0994: MOVLW 1F
0995: ANDWF 03,F
0996: MOVLW 62
0997: BSF 03.5
0998: MOVWF 0F
0999: MOVLW 0C
099A: MOVWF 19
099B: MOVLW A6
099C: MOVWF 18
099D: MOVLW 90
099E: BCF 03.5
099F: MOVWF 18
09A0: BSF 03.5
09A1: BCF 1F.4
09A2: BCF 1F.5
09A3: MOVF 1B,W
09A4: ANDLW 80
09A5: MOVWF 1B
09A6: MOVLW 07
09A7: MOVWF 1C
.................... set_tris_a(0b00000001);
*
09AA: MOVLW 01
09AB: BSF 03.5
09AC: MOVWF 05
.................... set_tris_b(0b11010000);
09AD: MOVLW D0
09AE: MOVWF 06
.................... setup_adc_ports(sAN0|VSS_VDD);
09AF: BCF 1F.4
09B0: BCF 1F.5
09B1: MOVF 1B,W
09B2: ANDLW 80
09B3: IORLW 01
09B4: MOVWF 1B
.................... setup_adc(ADC_CLOCK_INTERNAL);
09B5: BCF 1F.6
09B6: BCF 03.5
09B7: BSF 1F.6
09B8: BSF 1F.7
09B9: BSF 03.5
09BA: BCF 1F.7
09BB: BCF 03.5
09BC: BSF 1F.0
.................... setup_spi(FALSE);
09BD: BCF 14.5
09BE: MOVLW 00
09BF: MOVWF 14
09C0: BSF 03.5
09C1: MOVWF 14
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
09C2: MOVF 01,W
09C3: ANDLW C7
09C4: IORLW 08
09C5: MOVWF 01
.................... setup_timer_1(T1_DISABLED);
09C6: BCF 03.5
09C7: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
09C8: MOVLW 00
09C9: MOVWF 78
09CA: MOVWF 12
09CB: MOVLW 00
09CC: BSF 03.5
09CD: MOVWF 12
.................... setup_comparator(NC_NC_NC_NC);
09CE: MOVLW 07
09CF: MOVWF 1C
09D0: MOVF 05,W
09D1: MOVLW 03
09D2: MOVWF 77
09D3: DECFSZ 77,F
09D4: GOTO 1D3
09D5: MOVF 1C,W
09D6: BCF 03.5
09D7: BCF 0D.6
.................... setup_vref(FALSE);
09D8: BSF 03.5
09D9: CLRF 1D
.................... port_b_pullups(True);
09DA: BCF 01.7
.................... enable_interrupts(GLOBAL);
09DB: MOVLW C0
09DC: BCF 03.5
09DD: IORWF 0B,F
.................... enable_interrupts(INT_RB);
09DE: BSF 03.6
09DF: BSF 0B.3
.................... ext_int_edge(H_to_L);
09E0: BSF 03.5
09E1: BCF 03.6
09E2: BCF 01.6
|
I tried disabling it, and it doesn't seem to make any difference....
Code: |
.................... void main()
.................... {
*
0992: CLRF 04
0993: BCF 03.7
0994: MOVLW 1F
0995: ANDWF 03,F
0996: MOVLW 62
0997: BSF 03.5
0998: MOVWF 0F
0999: MOVLW 0C
099A: MOVWF 19
099B: MOVLW A6
099C: MOVWF 18
099D: MOVLW 90
099E: BCF 03.5
099F: MOVWF 18
09A0: BSF 03.5
09A1: BCF 1F.4
09A2: BCF 1F.5
09A3: MOVF 1B,W
09A4: ANDLW 80
09A5: MOVWF 1B
09A6: MOVLW 07
09A7: MOVWF 1C
.................... set_tris_a(0b00000001);
*
09AA: MOVLW 01
09AB: BSF 03.5
09AC: MOVWF 05
.................... set_tris_b(0b11010000);
09AD: MOVLW D0
09AE: MOVWF 06
.................... setup_adc_ports(sAN0|VSS_VDD);
09AF: BCF 1F.4
09B0: BCF 1F.5
09B1: MOVF 1B,W
09B2: ANDLW 80
09B3: IORLW 01
09B4: MOVWF 1B
.................... setup_adc(ADC_CLOCK_INTERNAL);
09B5: BCF 1F.6
09B6: BCF 03.5
09B7: BSF 1F.6
09B8: BSF 1F.7
09B9: BSF 03.5
09BA: BCF 1F.7
09BB: BCF 03.5
09BC: BSF 1F.0
.................... // setup_spi(FALSE);
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
09BD: BSF 03.5
09BE: MOVF 01,W
09BF: ANDLW C7
09C0: IORLW 08
09C1: MOVWF 01
.................... setup_timer_1(T1_DISABLED);
09C2: BCF 03.5
09C3: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
09C4: MOVLW 00
09C5: MOVWF 78
09C6: MOVWF 12
09C7: MOVLW 00
09C8: BSF 03.5
09C9: MOVWF 12
.................... setup_comparator(NC_NC_NC_NC);
09CA: MOVLW 07
09CB: MOVWF 1C
09CC: MOVF 05,W
09CD: MOVLW 03
09CE: MOVWF 77
09CF: DECFSZ 77,F
09D0: GOTO 1CF
09D1: MOVF 1C,W
09D2: BCF 03.5
09D3: BCF 0D.6
.................... setup_vref(FALSE);
09D4: BSF 03.5
09D5: CLRF 1D
.................... port_b_pullups(True);
09D6: BCF 01.7
.................... enable_interrupts(GLOBAL);
09D7: MOVLW C0
09D8: BCF 03.5
09D9: IORWF 0B,F
.................... enable_interrupts(INT_RB);
09DA: BSF 03.6
09DB: BSF 0B.3
.................... ext_int_edge(H_to_L);
09DC: BSF 03.5
09DD: BCF 03.6
09DE: BCF 01.6
|
Should I try to change the pin? maybe use RB6 or 7 instead of RB4? I have an RS232 TX on RB5...
Thankx, Ox. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jul 16, 2007 11:19 pm |
|
|
Post your compiler version. |
|
|
oxxyfx
Joined: 24 May 2007 Posts: 97
|
|
Posted: Tue Jul 17, 2007 6:32 am |
|
|
It is 4.023. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jul 17, 2007 11:42 am |
|
|
You're using fast i/o mode. That's why those lines didn't appear in your
.LST file.
I think you need to prove that you can get #int_rb to work.
See the test program shown below. I compiled it with PCM vs. 4.023
and ran it on a PicDem2-Plus board. It worked. Every time I press
or release a push-button (on RB4), I get the LED on RB0 to blink.
That's what it should do. You get an interrupt on both edges. The
200 ms delay acts as a debounce delay in this test.
Try this program "as is". Don't add fast i/o or TRIS statements to it.
Code: |
#include <16F88.h>
#fuses INTRC_IO, NOWDT, PUT, BROWNOUT, NOLVP
#use delay(clock=4000000)
#int_rb
void int_rb_isr()
{
int8 c;
output_high(PIN_B0);
delay_ms(200);
output_low(PIN_B0);
c = input_b();
}
//=================================
void main()
{
port_b_pullups(TRUE);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
while(1);
} |
|
|
|
oxxyfx
Joined: 24 May 2007 Posts: 97
|
|
Posted: Tue Jul 17, 2007 11:50 am |
|
|
Thank you. I will try this perhaps tonight and I will let you know by tomorrow how it goes.
thanks, Ox. |
|
|
oxxyfx
Joined: 24 May 2007 Posts: 97
|
|
Posted: Tue Jul 17, 2007 8:12 pm |
|
|
Ok,
I've got the LED flashing with your code. Now what should be my next step? Try disabling the Fast_IO on port B and the set_tris_B statements? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jul 17, 2007 8:43 pm |
|
|
Quote: |
#use fast_io(A)
#use fast_io(B)
set_tris_a(0b00000001);
set_tris_b(0b11010000);
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE); |
Remove the statements shown in bold. If you use CCS pin i/o functions
the compiler will automatically handle the TRIS. Most of the stuff that
the Wizard puts in to disable the peripheral modules isn't needed,
because these modules are disabled upon power-on reset anyway. |
|
|
oxxyfx
Joined: 24 May 2007 Posts: 97
|
|
Posted: Tue Jul 17, 2007 8:55 pm |
|
|
Thank you. I've got it working. After I remove the fast_io's and the Tris, I had to go back to my original code version with the Input(M_button) statements, because the tempb = Input_B()'s didn't work. Now I have it now up and running.
Thank you for your patience and help.
Ox. |
|
|
|