[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [avr-gcc-list] Possibly wrong code generated using _BV macro
From: |
Omar Choudary |
Subject: |
Re: [avr-gcc-list] Possibly wrong code generated using _BV macro |
Date: |
Wed, 4 Jan 2012 21:13:35 +0000 |
Ups, just seen it (about sbi):
"This instruction operates on the lower 32 I/O Registers – addresses 0-31."
Sorry for writing too early.
Omar
On Wed, Jan 4, 2012 at 9:06 PM, Omar Choudary <address@hidden> wrote:
> Hello,
>
> I wanted to use the _BV macro to set the JTD bit in MCUCR in order to
> disable the JTAG interface and
> allow the PF4-PF7 pins for other use.
>
> The listing result is this:
>
> MCUCR |= _BV(JTD); // needs to be done twice
> 9cf2: 85 b7 in r24, 0x35 ; 53
> 9cf4: 80 68 ori r24, 0x80 ; 128
> 9cf6: 85 bf out 0x35, r24 ; 53
> MCUCR |= _BV(JTD);
> 9cf8: 85 b7 in r24, 0x35 ; 53
> 9cfa: 80 68 ori r24, 0x80 ; 128
> 9cfc: 85 bf out 0x35, r24 ; 53
>
> As you can see the instruction is xoring a temporary value instead of
> using the expected sbi.
>
> On the other hand if I use the same approach for a normal port
> register I get the desired result:
> DDRF |= _BV(PF4);
> 2d66: 84 9a sbi 0x10, 4 ; 16
> PORTF |= _BV(PF4);
> 2d68: 8c 9a sbi 0x11, 4 ; 17
>
>
> Any ideas why _BV works for a port register but not for MCUCR?
> I'm using AT90USB1287, avr-gcc 4.5.2.
>
> Thanks,
> Omar