avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-gcc-list] Bug? with switch statement


From: Mike Hoyt
Subject: Re: [avr-gcc-list] Bug? with switch statement
Date: Fri, 13 Dec 2002 15:21:41 -0500

Hi Jeff,

I think the compiler is working correctly. Try changing readPort from a
signed char to an unsigned char. I think the problem is that the switch is
promoting readPort (which is implicitly signed since it was declared a char)
to an int before comparing the cases, which means values like 0xf0 become
0xfff0. This makes sense when you consider what you said about the last case
being the only one that works, since (char)0x70 becomes 0x0070 when promoted
to an int.

Hope this helps,
--Mike



----- Original Message -----
From: "Hendrix, Jeff" <address@hidden>
To: <address@hidden>
Sent: Friday, December 13, 2002 2:06 PM
Subject: [avr-gcc-list] Bug? with switch statement


> I'm compiling the code below with 2002-06-25 release from avrfreaks.
> I was originally testing this code on a mega128, the I tried in in avr
> studio with the same results. I also tried compiling it to an 8515 target
> and still get the same results.
> What's happening is the switch statement will only ever take the last
case.
> To simulate this, you need to turn on the high nibble on port C pins (to
> simulate the pullups), and then turn off one of the bits in the high
nibble.
> The only time it takes one of the case paths is when bit 8 is off (0x70),
> all the other times it just ignores the other cases.
> Anyone have any ideas?
>
> thanks
> -jeff
>
> #include <io.h>
>
> char ReadKeyPad(void)
> {
>    char readPort = 0;
>    char curKey = 0;
>
>    // check ROW1
> PORTC = 0xfe;  // turn on pull ups and ground row 1
> readPort = PINC&0xf0;   // check just the high nibble
> switch (readPort) {
> case 0xe0:     // key 1 held down
> curKey = 1;
> break;
> case 0xd0:     // key 2 held down
> curKey = 2;
> break;
> case 0xb0:     // key 3 held down
> curKey = 3;
> break;
> case 0x70:     // key 4 held down
> curKey = 4;
> break;
> }
>
> PORTC = 0;
>    return curKey;
> }
>
>
> int main(void)
> {
> char kp;
> DDRC = 0x0f;
> PORTC = 0x00;
>
>    while (1) {
> kp = ReadKeyPad();
> }
> return 0;
> }
> avr-gcc-list at http://avr1.org
>

avr-gcc-list at http://avr1.org



reply via email to

[Prev in Thread] Current Thread [Next in Thread]