View previous topic :: View next topic |
Author |
Message |
tmach
Joined: 20 Dec 2003 Posts: 14
|
interrupt routine wont work! |
Posted: Wed Mar 03, 2004 10:28 am |
|
|
Hello All,
I am trying to toggle pin RD1 on a H->L external interrupt. Initially I set RD1 to high in main and then on an external interrupt from H->L, I set it permanently low.
I see that RD1 stays high on powerup and does not go low even afer a H-L interrupt on RB0. Here is the relevant code. Please explain why I see this unusual behavior. I use PIC16F874A and PCM compiler.
Thanks.
mach
***********************************************************
port declares;
#INT_EXT
intRB0()
{
#asm
BCF 0x3, 0x5 select Bank 0
BCF 0x8, 0x1 clear RD1 high
#endasm
}
main()
{
ENABLE_INTERRUPTS(INT_EXT);
ENABLE_INTERRUPTS(GLOBAL);
EXT_INT_EDGE(H_TO_L);
//port initialization
#asm
CLRF 0x03 // Bank0
CLRF 0x05 // Initialize PORTA by clearing output
CLRF 0x06 // Initialize PORTB by clearing output
CLRF 0x07 // Initialize PORTC by clearing output
CLRF 0x08 // Initialize PORTD by clearing output
CLRF 0x09 // Initialize PORTE by clearing output
// data latches
BSF 0x03, 5 // Select Bank1
MOVLW 0xFF // Value used to initialize data direction
MOVWF 0x85 // PORTA<7:0> = inputs
MOVLW 0xFF // Value used to initialize data direction
MOVWF 0x86 // PORTB<7:0> = inputs
MOVLW 0xBE // Value used to initialize data direction
MOVWF 0x87 // PORTC<7:0> = inputs
MOVLW 0xFD // Value used to initialize data direction
MOVWF 0x88 // PORTD<7:0> = inputs
MOVLW 0xFF // Value used to initialize data direction
MOVWF 0x89 // PORTE<7:0> = inputs
#endasm
output_high(PIN_D1);
while(true)
{
software SPI statements;
}
}
********************************************************** |
|
|
tmach
Joined: 20 Dec 2003 Posts: 14
|
minor correction |
Posted: Wed Mar 03, 2004 10:40 am |
|
|
Just to avoid confusion, I should say that in my ISR, two statements are commented
intRB0()
{
#asm
BCF 0x3, 0x5 //select Bank 0
BCF 0x8, 0x1 //clear RD1 high
#endasm
} |
|
|
Neutone
Joined: 08 Sep 2003 Posts: 839 Location: Houston
|
|
Posted: Wed Mar 03, 2004 11:04 am |
|
|
This is how I setup discrete IO. It is easier to read like this. I think you were settings the TRIS in the wrong bank.
Code: |
#define Port_A_Mask 0b101111
#define Port_B_Mask 0b11111111
#define Port_C_Mask 0b10000110
#define Port_D_Mask 0b11111111
#define Port_E_Mask 0b00000000
#define Port_F_Mask 0b01111111
#define Port_G_Mask 0b00100
/***********************************************************
* Initialize Discrete IO *
***********************************************************/
#inline
void Initialize_Discrete_IO(void)
{ #use fast_io (A) // Do not set I/O tri-state status automaticly
#use fast_io (B) // Do not set I/O tri-state status automaticly
#use fast_io (C) // Do not set I/O tri-state status automaticly
#use fast_io (D) // Do not set I/O tri-state status automaticly
#use fast_io (E) // Do not set I/O tri-state status automaticly
#use fast_io (F) // Do not set I/O tri-state status automaticly
#use fast_io (G) // Do not set I/O tri-state status automaticly
SET_TRIS_A(Port_A_Mask); // Set I/O tri-state status
SET_TRIS_B(Port_B_Mask); // Set I/O tri-state status
SET_TRIS_C(Port_C_Mask); // Set I/O tri-state status
SET_TRIS_D(Port_D_Mask); // Set I/O tri-state status
SET_TRIS_E(Port_E_Mask); // Set I/O tri-state status
SET_TRIS_F(Port_F_Mask); // Set I/O tri-state status
SET_TRIS_G(Port_G_Mask); // Set I/O tri-state status
output_e(0); // Force off status of outputs
setup_spi(SPI_MASTER |SPI_H_TO_L | SPI_CLK_DIV_64 );
}
|
|
|
|
|