[Top][All Lists]
[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