Yahoo Groups archive

AVR-Chat

Index last updated: 2026-04-28 22:41 UTC

Message

RE: [AVR-Chat] Re: Some C help please !

2007-03-29 by AVR Development

IT WAS YOU!! >:(  hehe

 

-----Original Message-----
From: AVR-Chat@yahoogroups.com [mailto:AVR-Chat@yahoogroups.com] On Behalf
Of kernels_nz
Sent: Wednesday, March 28, 2007 5:15 PM
To: AVR-Chat@yahoogroups.com
Subject: [AVR-Chat] Re: Some C help please !

 

SORRY ! Wasnt me, no idea why that message got pasted so many times ! 

--- In AVR-Chat@yahoogroup <mailto:AVR-Chat%40yahoogroups.com> s.com,
"kernels_nz" <kernels@...> wrote:
>
> So ... after the big discussion on bit-shifting and masking I decided
> to rewrite a bit of pretty rough wireless code I use a lot with my new
> found appreciation of making my code more portable and tidy-er. 
> 
> But! To my dismay I found that the codevision header files dont
> contain defines for bits like SPIF in the SPSR (SPI status register)
> do the other compilers like GCC and IAR have header files that have
> the names of each bit of every register defined ?
> 
> I did end up rewriting the code, and to me it is now a thing of
> beauty, but I had to go through the header file and #define all the
> bits I was using for shift and masking.
> 
> Cheers
> Hein B
> Auckland
> New Zealand
> 
> 
> 
> --- In AVR-Chat@yahoogroup <mailto:AVR-Chat%40yahoogroups.com> s.com, Ned
Konz <ned@> wrote:
> >
> > I wrote:
> > 
> > > So, using my headers, your example test for tx completed or empty
> could 
> > > be written:
> > > 
> > 
> > [snip]
> > 
> > > if (UCSR0B & ((1 << bitTXC0) | (1 << bitUDRE0)))
> > > /* do stuff */
> > > 
> > > 
> > > and the generated code would look like this:
> > 
> > [snip]
> > 
> > > or this (somewhat more efficient):
> > > 
> > > 
> > > 15:test2.c *** if (UCSR0B & ((1 << bitTXC0) | (1 <<
> bitUDRE0)))
> > > 
> > > 324 0010 8AB1 in r24,42-0x20
> > > 325 0012 8076 andi r24,lo8(96)
> > > 326 0014 31F0 breq .L5
> > > *** /* do stuff */
> > > 338 .L5
> > 
> > 
> > 
> > And here we see the problem with the bit numbers: they're not
connected 
> > with the register.
> > 
> > I made the mistake of referring to UCSR0B, when TXC0 and UDRE0 are 
> > actually in UCSR0A.
> > 
> > This is a not-uncommon error using this idiom. You don't have the 
> > ability to make this error when using bitfields.
> > 
> > The above should be:
> > 
> > if (UCSR0A & ((1 << bitTXC0) | (1 << bitUDRE0)))
> > /* do stuff */
> > 
> > 
> > I spent some time making a safer version using C++ templates, but 
> > haven't been satisifed with its ease of use.
> > 
> > -- 
> > Ned Konz
> > ned@
> > http://bike- <http://bike-nomad.com> nomad.com
> >
>

 



[Non-text portions of this message have been removed]

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.