Forum: Compiler & IDEs Bug oder Feature?


von Dragan I. (ebelcrom)


Lesenswert?

Hallo an alle,

es geht um einen möglichen Compilerfehler des avr-gcc bzw. der avr-libc. 
Die Schaltung hat den ATMEGA32 auf dem Evaluationsboard 2.0 von Pollin. 
Angesprochen werden soll die Leuchtdiode auf PortD.5.

Folgendes Progrämmchen (avr.S)
1
#include <avr/iom.h>
2
3
.text
4
.global main
5
6
main:
7
  ldi r16, (1 << PORTD5)
8
  out DDRB, r16
9
  out PORTD, r16
10
  ret

wird  durch
> avr-gcc -Os -mmcu=atmega32 -I/usr/avr/include -o avr.elf avr.S
so übersetzt:
1
...
2
main:
3
  ldi r16, 0x20
4
  out 0x31, r16
5
  out 0x32, r16
6
  ret

Problem sind die Registeradressen von DDRD und PORTD: sie entsprechen 
nicht 0x11 und 0x12 der Headerdefinition, was aber die richtigen 
Addessen wären!

Ich nutze avr-gcc 3.4.3 und die dazugehörige avr-libc des Ubuntu Dapper 
Drake Pakets und wollte dabei bleiben...

Hat jemand eine Idee?

von Karl H. (kbuchegg)


Lesenswert?

Dragan Isakovic wrote:
> Hallo an alle,
>
> es geht um einen möglichen Compilerfehler des avr-gcc bzw. der avr-libc.

No. Schau in das File sfr_defs.h
Da findet sich die Erklärung.

-> Falsche Verwendung deinerseits
1
#include <avr/io.h>
2
3
.text
4
.global main
5
6
main:
7
  ldi r16, (1 << PORTD5)
8
  out _SFR_IO_ADDR(DDRB), r16
9
  out _SFR_IO_ADDR(PORTD), r16
10
  ret

von ebelcrom (Gast)


Lesenswert?

übrigens: WinAVR in der neuesten Version macht das gleiche, nur hier 
sind die Ergebnisse Register 0x32 und 0x37 :-(

von Dragan I. (ebelcrom)


Lesenswert?

OK, hab's ausprobiert mit WinAVR. Das war die Lösung.

Danke!

Müssen noch andere Makros genutzt werden, die evtl. Addressen von I/O- 
oder Speicherplätzen während der Compile-Zeit verändern?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.