avr-chat
[Top][All Lists]
Advanced

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

Re: [avr-chat] Mega644 bit test problem


From: Neil
Subject: Re: [avr-chat] Mega644 bit test problem
Date: Tue, 21 Jul 2009 13:56:58 +1200
User-agent: Mutt/1.5.18 (2008-05-17)

> > 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;
>         }
> 

..would:

  while( bit_is_clear( ASYNCPIN, ASYNCCLK));

work as well?  it would be easier to understand.

- neil





reply via email to

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