|
|
View previous topic :: View next topic |
Author |
Message |
Guest
|
pin does not know its high, pun intended |
Posted: Tue Jan 29, 2008 9:40 am |
|
|
Im sure there is a simple answer that im not seeing.....
I'm working with a univeral proto board that has pull down resistors connected with a push button to pin_b1 and pin_b2 of PIC18F4520 Micro. I am using the input function to detect a high level on either of the pins and nothing is happening. Ive checked the portb register and the micro is not detecting that the pins have gone high.
here is a test piece of code that i have tried to cimply to problem to. Thanks for the input.
Compiler 3.203
Code: | #include <18F4520.h>
#fuses INTRC//HS//INTRC
#fuses NOPROTECT,MCLR,NOBROWNOUT,BORV45,NOWDT,WDT128,NOPUT,NOSTVREN,NODEBUG
#fuses NOLVP,NOWRT,NOCPB,NOWRTB,NOWRTC,NOCPD,NOWRTD,NOEBTR,NOEBTRB
#fuses NOXINST //extended cpu
#use delay(clock=8000000)
void main(){
setup_oscillator(OSC_8MHZ|OSC_NORMAL);
set_tris_b(0xff);
//start indicator
output_high(pin_d7);
delay_ms(500);
output_low(pin_d7);
delay_ms(500);
while(1){
if(input(pin_b1)==0){
//pin_b1 button was pushed
output_high(pin_d7);
delay_ms(500);
output_low(pin_d7);
delay_ms(500);
}
else if(input(pin_b2)==1){
//pin_b2 button was pushed
output_high(pin_d7);
delay_ms(500);
output_low(pin_d7);
delay_ms(500);
}
delay_ms(50);
}//while
}//main |
|
|
|
Wayne_
Joined: 10 Oct 2007 Posts: 681
|
|
Posted: Tue Jan 29, 2008 9:50 am |
|
|
Shouldn't you be checking if pin_b2 == 0 (not 1 as in your code).
Also I would remove the else and just have the 2 seperate if's unless you don't want to check b2 IF b1 is pressed!
I also assume the push buttons are push to break and are connected from VCC to each pin. |
|
|
Guest
|
|
Posted: Tue Jan 29, 2008 9:56 am |
|
|
The pushbuttons are tied Low through the pull down resistor and the input pins are connected to VDD when the pushbutton is pressed. So the pins are low until buttons are pushed.
Yeah, the code is rough, but just a simple example of checking both pins. |
|
|
Guest
|
|
Posted: Tue Jan 29, 2008 9:58 am |
|
|
Woops to the code here is the updated corrected test statements.....
Code: | #include <18F4520.h>
#fuses INTRC//HS//INTRC
#fuses NOPROTECT,MCLR,NOBROWNOUT,BORV45,NOWDT,WDT128,NOPUT,NOSTVREN,NODEBUG
#fuses NOLVP,NOWRT,NOCPB,NOWRTB,NOWRTC,NOCPD,NOWRTD,NOEBTR,NOEBTRB
#fuses NOXINST //extended cpu
#use delay(clock=8000000)
void main(){
setup_oscillator(OSC_8MHZ|OSC_NORMAL);
set_tris_b(0xff);
//start indicator
output_high(pin_d7);
delay_ms(500);
output_low(pin_d7);
delay_ms(500);
while(1){
if(input(pin_b1)==1){
//pin_b1 button was pushed
output_high(pin_d7);
delay_ms(500);
output_low(pin_d7);
delay_ms(500);
}
else if(input(pin_b2)==1){
//pin_b2 button was pushed
output_high(pin_d7);
delay_ms(500);
output_low(pin_d7);
delay_ms(500);
}
delay_ms(50);
}//while
}//main |
|
|
|
Guest
|
|
Posted: Tue Jan 29, 2008 10:32 am |
|
|
Anything obviously wrong?
Is it possible that i have bad couple of micros?
Do i need the weak pull ups enabled in this case? Where i am connecting the pin directly to VDD.
Any other ideas? |
|
|
rnielsen
Joined: 23 Sep 2003 Posts: 852 Location: Utah
|
|
Posted: Tue Jan 29, 2008 10:32 am |
|
|
Just one quick note. You need to include the fuse NOPBADEN. This makes PORTB pins configured as digital I/O on RESET.
Ronald |
|
|
Guest
|
|
Posted: Tue Jan 29, 2008 1:41 pm |
|
|
Ok, so after some pin to pin testing and verifying the test on a separate proto board im a little perplexed!
I thought there may be some errors on my proto board so i did all concluding test on the PICDEM 2 plus Demo board.
I first decided to test to 2 pins that i was having problems with on my board. b1 and b2, which by verification on the datasheet state they can be used as digital I/O (page 14). One discrepancy between by board and the dem2 plus board is that they do not have a direct resistor pull-up configuration for the PB(Vinput of ~2.2V), the pins with both microchip's PB configuration and a direct vdd pull up configuration. Both of the pins do no work as digital Inputs in either configurations. I tried a separate micro and same results.
This really blowing me away, i tested all ports to see which i can use as digital Inputs. Here are my findings
PORTA, the only pin that responded as an input was pin_a4.
PORTB, the only pin that responded as an input was pin_b5
PORTC, Port C worked as expected, but would not respond to their input pin configuration where Vinput ~2.2V.
PORTD, PORTC, Port C worked as expected, but would not respond to their input pin configuration where Vinput ~2.2V.
So i did both test on 2 boards with same results. Either both my micros after damaged or Microchips datasheet seems to be wayyyyy offffff as to how you can use the pins.
Here is the code i used to test both configurations.
Code: |
#include <18F4520.h>
#fuses INTRC//HS|INTRC
#fuses NOPROTECT,MCLR,NOBROWNOUT,BORV45,NOWDT,WDT128,NOPUT,NOSTVREN,NODEBUG
#fuses NOLVP,NOWRT,NOCPB,NOWRTB,NOWRTC,NOCPD,NOWRTD,NOEBTR,NOEBTRB
#fuses NOXINST //extended cpu
#fuses NOPBADEN //PORTB pins configured as digital I/O on RESET
#use delay(clock=8000000)
#define LED pin_b3
#define test_pin pin_b1
void main(){
setup_oscillator(OSC_8MHZ|OSC_NORMAL);
set_tris_b(0xff);
//start indicator
output_high(LED);
delay_ms(500);
output_low(LED);
delay_ms(500);
while(1){
if(input(test_pin)==1){
//pin_b1 button was pushed
output_high(LED);
delay_ms(500);
output_low(LED);
delay_ms(500);
}
delay_ms(50);
}//while
}//main |
Any ideas, i guess i will order a couple more PIC18F4520's to verify the results...........
very discombobled......as i thought i could trust the datasheets a little more than this! |
|
|
Ttelmah Guest
|
|
Posted: Wed Jan 30, 2008 8:05 am |
|
|
So, what happens if you add:
SETUP_ADC_PORTS(NO_ANALOGS);
to your code?.
I'd have expected B6, and B7 to also work, but the big 'pattern', is that no pin that is definable as an analog source, is working. There have been a number of versions of CCS code, with various chips, that 'default' to enabling the analog ports on boot. Explicitly turning them off, may well fix this.
Best Wishes |
|
|
Guest
|
|
Posted: Sat Feb 02, 2008 9:04 am |
|
|
Well, got some new pic18f4520's in and tested them..... same problems. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sat Feb 02, 2008 9:29 am |
|
|
This might not have to do with your current problems but using this version you are going to run into other problems. V3.203 was one of the first releases of the v3.2 compiler and had _many_ problems. The v3.2 compiler became more or less usable with release v3.225.
My advice: revert to either v3.191, the last stable version before the v3.2 release, or update to a newer version. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Feb 02, 2008 4:48 pm |
|
|
Quote: | but would not respond to their input pin configuration where Vinput ~2.2V. |
Are you using 2.2v as your input high level ?
For many pins, this won't work. It's too low. All PIC pins that have
schmitt trigger inputs require an input level of at least .8 x Vdd.
For a 5v board, the required level is 4.0 volts. However, for Port B
2.2v should work. The required minimum is 2.0v.
I suggest that you use the PicDem2-Plus board, and make these changes:
1. Re-wire your switches so they are used in the conventional way.
This is with a pull-up resistor on the PIC pin, and with one side of the
switch connected to ground.
2. For Port B, you can enable the built-in pull-ups instead of adding
external resistors. Do it by adding this line of code:
Code: | port_b_pullups(TRUE); |
3. Change the tests so they check for a logic zero. That's because
pressing the switch will now take the pin to ground, after you re-wire it.
Example:
Code: | if(input(test_pin) == 0){ |
If this doesn't work then post the new program. |
|
|
|
|
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
|