[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [avr-chat] Mega644 bit test problem
From: |
tarmigan |
Subject: |
Re: [avr-chat] Mega644 bit test problem |
Date: |
Sat, 18 Jul 2009 16:12:22 -0700 |
(Reading through some very old email, it looks like this one might not
have been resolved...)
On Fri, May 8, 2009 at 2:41 AM, Robert von Knobloch<address@hidden> wrote:
> Hallo,
>
> I am writing code for an ATMega 644P and have come across some very
> strange behaviour.
> A small part of the code is required to read an asynchronous serial
> signal (data & clock - low speed) over PORTB pins.
> The relevant code snippet is:
>
> snip
> #define CLOCK_TIMEOUT 2000
> #define ASYNCPIN PORTB
> #define ASYNCCLK 0
> #define ASYNCDATA 3
>
> for (i = 0 ; i < 16 ; ++i)
> {
> while ((ASYNCPIN & _BV(ASYNCCLK)) != 0) // Wait for clock low
> {
> if (mSecdowncnt == 0)
> {
> noclock = 1;
> break; // Timeout
> }
> }
>
> result = result >> 1;
> if ((ASYNCPIN & _BV(ASYNCDATA)) != 0)
> {
> result |= 0x8000;
> }
>
> while ((ASYNCPIN & _BV(ASYNCCLK)) != 1) // Wait for clock
This line is probably the problem.
> This works fine. I want, however to use portb bits 1 & 3 for clock &
> data. I simply change to #define ASYNCCLK 1
> and re-compile
> Now, nothing works and the code generated is much smaller (0xe5 bytes
> instead of 0x193 bytes for the working variant).
_BV(0)==1 but _BV(1)==2, so when you do ((value & _BV(1)) != 1), it's
never false because the possible values of (ASYNCPIN & _BV(1)) are 0
or 2, never 1.
I would try to write these kinds of statements as
while( !(ASYNCPIN & _BV(ASYNCCLK)) ) {
blah, blah;
}
-Tarmigan
- Re: [avr-chat] Mega644 bit test problem,
tarmigan <=