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: Berni Joss
Subject: Re: [avr-gcc-list] Bug? with switch statement
Date: Fri, 13 Dec 2002 21:08:53 +0100

Haven't tried to compile your code so you may have additional issues .... :-)
but depending on the compiler and clock your running at, the code is likely 
to not work as intended with your hardware because of too short delay 
between:
  PORTC = 0xfe
and
  PINC reading
If you want reliable keypad scanning you will have to estimate the worst case 
time constant of your total capacitances and pull-up resistances.

Sorry, if this has already been acounted for.
Sorry also to not provide a "complete" solution, just a hint towards a 
possible issue.

Have a good day,
Berni.



On Friday 13 December 2002 08:06 pm, Hendrix, Jeff wrote:
> 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]