|
|
View previous topic :: View next topic |
Author |
Message |
dbrown
Joined: 24 Jul 2004 Posts: 20
|
Problem with #int_ext |
Posted: Sat Jan 07, 2006 7:22 pm |
|
|
I have been trying to read the value on port B when an interrupt has occurred on int_ext. I set the flag ext_flag in the ISR when the interrupt occurs. In the main loop I read the port, however I am not seing what I expect. I have b0-b3 tied to ground with 1k resisters, but I keep reading either 16 or 17 when the program executes. I do not understand how it can be reading 16 or 17 since I have set_tris_b(0xf), should it not only be reading bits 0 to 3?
I am using a 18F4550 @ 4 MHz
Any help would be appreciated.
Thanks
Dave Brown
The code is shown below:
Code: |
#include <18f4550.h>
#use delay (clock=4096000)
#fuses xt,nowdt,NOPUT,noprotect,nolvp
#USE RS232(BAUD=9600, XMIT=PIN_c6, RCV=PIN_c7,DISABLE_INTS)
int ext_flag;
#int_ext
test_int(){
ext_flag=1;
}
main(){
enable_interrupts(global);
enable_interrupts(int_ext);
set_tris_b(0x0f);
ext_int_edge(l_to_h);
while(1){
if(ext_flag==1){
printf("Port b %u\r\n",input_b());
ext_flag=0;
enable_interrupts(global);
}
}
}
|
|
|
|
asmallri
Joined: 12 Aug 2004 Posts: 1635 Location: Perth, Australia
|
|
Posted: Sat Jan 07, 2006 7:43 pm |
|
|
When you read the port you get the whole 8 bits. If you have a high impednace load on the output pins (say 1K) then you will read the value you have written. However if you have a low impedandance on the output (say 300R), the voltage on the output pin will be much lower (typical output characterists of the driver) and could be less than half VDD. Then means when you read the output port this pin may read the opposite to what you expect.
It is up to you to mask the unwanted bits when reading a port. _________________ Regards, Andrew
http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!! |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Sat Jan 07, 2006 8:53 pm |
|
|
Quote: |
I have b0-b3 tied to ground with 1k resisters
|
After Power on, B0..B4 wake up as analog inputs.
You can select this setting/clearing the PBADEN bit in ADCON1 register.
To do it using the CCS built in function:
Code: |
setup_adc_ports(NO_ANALOGS); // set digital inputs
setup_adc(ADC_OFF); // switch of the ADC module.
|
Quote: |
should it not only be reading bits 0 to 3?
|
NOP. You only enabled INT_EXT. The interrupt will be triggered only by an edge in PB0.
If you want the interrupt being triggered by PB1 you must enable INT_EXT1 and code the handler.
If you want the interrupt being triggered by PB2 you must enable INT_EXT2 and code the handler.
or change the inputs prior to trigger the enabled PIN.
To test the external interrupt capabilities, the easy way is to enable the built in pull ups resistors
in PortB and driving them against Gnd. Remember to change the interrupt edge from L_H to H_L.
Code: |
portb_pull_ups(TRUE);
ext_int_edge( H_TO_L );
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
|
keep well,
Humberto |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|