View previous topic :: View next topic |
Author |
Message |
meo tseto
Joined: 28 Feb 2010 Posts: 4 Location: montreal
|
problem reading many switches with ELSE IF |
Posted: Sun Mar 21, 2010 1:03 pm |
|
|
Hi, I am new in code. I am trying to understand why my code is not working. In regards of everything I can read on many books and on the help file it should work. Sometime a little dot could change everything.
I am using a old version of PCWHD 4.084 I start to think maybe that could be part of my problem. My problem is on the hyperterminal I have for result only "SORTIE B0" or SORTIE B1" when I press on A0. The other switch have no impact.
Thank you
Code: |
#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES MCLR //Master Clear pin enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=pin_B2,rcv=pin_B1,bits=8,parity=n)
#zero_ram
void main()
{
// set_tris_b(0x00); //set port b as outputs
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);
while (True)
{
output_b (0x00);
if (input(PIN_A0))
printf ("sortie B0\n\r");
else if (input(PIN_A1))
printf ("sortie B1\n\r");
else if (input(PIN_A2))
printf ("sortie B2\n\r");
else if (input(PIN_A3))
printf ("sortie B3\n\r");
else if (input(PIN_A4))
printf ("sortie B4 \n\r");
else
printf ("toute les sorties aux niveaux bas\n\r");
}
} |
_________________ Loi d’Incompréhension de Cooper
Si dans un article scientifique un mot vous échappe, ignorez-le.
Le texte est tout aussi compréhensible sans ce mot. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Mar 21, 2010 1:44 pm |
|
|
Quote: |
I am using a old version of PCWHD 4.084 I start to think maybe that
could be part of my problem.
|
That compiler version probably works OK with the 16F628.
Quote: |
My problem is on the hyperterminal I have for result only "SORTIE B0"
or SORTIE B1" when I press on A0. The other switch have no impact. |
Describe the external circuits that you have connected to the pins on
Port A. |
|
|
John P
Joined: 17 Sep 2003 Posts: 331
|
|
Posted: Sun Mar 21, 2010 4:35 pm |
|
|
Shouldn't that be "Toutes les sorties"?
For this to work, you'd need pull-down resistors on all the pins you're testing, with pushbuttons connected between the pins and Vcc. Pullup resistors and buttons connecting to Gnd is a more common arrangement. As PCMP says, you need to explain what your external circuit is. |
|
|
meo tseto
Joined: 28 Feb 2010 Posts: 4 Location: montreal
|
switch connectic |
Posted: Sun Mar 21, 2010 6:27 pm |
|
|
Here are how my switch are connected.
The hardware work ok if I am doing a regular IF and ELSE (only one choice) But when I want to use many ELSE IF (many choices) that is when it doesn't work.
Code: |
VDD 5V
|
|
|
|
<
> 10K
<
|
| __________________
| |
| | PIC16F628A
| |
|_________________________| Pin A0
| |
| |
| |
| SWITCH NO |
| |
| |
| |
| |
| |
---- |
-- |
- |
|
Thank you _________________ Loi d’Incompréhension de Cooper
Si dans un article scientifique un mot vous échappe, ignorez-le.
Le texte est tout aussi compréhensible sans ce mot. |
|
|
meo tseto
Joined: 28 Feb 2010 Posts: 4 Location: montreal
|
|
Posted: Sun Mar 21, 2010 7:21 pm |
|
|
Thank you for your fast answer. The answer from John P make me think to look more at how my switches are connected and I realised my switches were returning a state 1 instead of 0.
Code: |
void main()
{
// set_tris_b(0x00); //set port b as outputs
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);
while (True)
{
output_b (0x00);
if (!input(PIN_A0))
printf ("sortie B0\n\r");//pin 17
else if (!input(PIN_A1))
printf ("sortie B1\n\r");//pin 18
else if (!input(PIN_A2))
printf ("sortie B2\n\r");//pin 01
else if (!input(PIN_A3))
printf ("sortie B3\n\r");//pin 02
else if (!input(PIN_A4))
printf ("sortie B4 \n\r");//pin 03
else
printf ("toute les sorties aux niveaux bas\n\r");
}
}
|
So I correct the code but now I am reacting with a delay of one step, meaning when I press PIN AO I should read SORTIE B0 and when I press PIN A1 I should read SORTIE B1 and so.
Instead I have one step behind, meaning when I press PIN A1 I get SORTIE B0 and when I press PIN A2 I get SORTIE B1. I noticed also the switch PIN A0 is inop.
So with your help I resolve one but create another one _________________ Loi d’Incompréhension de Cooper
Si dans un article scientifique un mot vous échappe, ignorez-le.
Le texte est tout aussi compréhensible sans ce mot. |
|
|
meo tseto
Joined: 28 Feb 2010 Posts: 4 Location: montreal
|
It WORKING |
Posted: Sun Mar 21, 2010 7:30 pm |
|
|
Hi guys,
Big thank you for your support everybody.
I just find a miss routed wire, shame on me (pitcher error).
So now the code is working, I can wait to be no more a green and be able to help other like you and payback to the forum.
Have a great day _________________ Loi d’Incompréhension de Cooper
Si dans un article scientifique un mot vous échappe, ignorez-le.
Le texte est tout aussi compréhensible sans ce mot. |
|
|
|