Forum: Compiler & IDEs WinAVR aktualisieren


von dennis (Gast)


Lesenswert?

Hi,
ich hab jetzt schon ein bissel mit WinAVR gespielt, aber ich hab
festgestellt das das ganze schon ein bissel älter ist. Ich hab
mittlerweile mitbekommen das man den AVR-GCC von WinAVR aktualisieren
kann. Ich hab auch gesehen das man dafür ein paar Sachen braucht. Aber
ganz kapiert hab ich das noch nicht. Wäre für ein paar Tips dankbar die
mir weiterhelfen

von Peter (Gast)


Lesenswert?

Hi Dennis

Du kannst Dir die neuste avr.libc-1.4.0 runterladen un einfach ins
WinAVR Verzeichniss entpacken, überschreibe bestehende Files.

Etwas komplizierter wird's, wenn Du auch den neusten GCC(4.0.2) und
die neusten BinUtils(2.16) benutzen willst. Die musst Du Dir selber
patchen und zusammen compilieren, ist offenbar nicht ganz einfach,
trotz Anleitungen die im Internet zu finden sind.

Ich empfehle, auf den nächsten WinAVR Release zu warten. Dieser wäre
eigentlich schon längst fällig, leider hat Eric Weddington kaum Zeit,
daran zu arbeiten. Aber ich denke es wird sich in den nächsten Wochen
etwas tun....

Peter

von Peter (Gast)


Lesenswert?

Hallo ich hab noch was...   ;o))

Es gibt eine simple Möglichkeit, WinAVR zu aktualisieren, AtmanAVR
enthält ein neueres und fertig compiliertes AVR-GCC Paket für Win32:

_______________________________________________________________

AtmanAvr C new version 5.1 is available:
AVR-GCC tool chain (gcc-3.4.4, binutils-2.16.1, avr-libc-1.4.0)
Added support for new devices
- AT90PWM2/3
- ATmega329/3290/649/6490
- ATtiny25/45/85
- ATmega164/324/644
- ATmega640/1280/1281.
_______________________________________________________________

Link zum Download des AtmanAVR AVR-GCC Package:
http://www.atmanecl.com/download/avrgccUpdate.exe
_______________________________________________________________

Update WinAVR AVRGCC tool chain with AtmanAVR AVRGCC package:
1) Download AVRGCC package AVRGCCUpdate.exe from Atman site
2) Install it to a specified directory
3) Copy the subdirectories (avr, bin, lib and libexec) under the
   created directory \avrgcc and paste them to \WinAVR directory
4) Uninstall it (AVRGCC 3.4.4)
_______________________________________________________________

Bei mir hat's funktioniert... ;o)

Gruss Peter

von dennis (Gast)


Lesenswert?

cool, danke. Werd ich probieren

von Birger* (Gast)


Lesenswert?

Mir fiel bei der Version auf, dass da die #define(s) für sbi(), cbi(),
inp, etc wieder drin sind. Die waren doch eigentlich schon längst
entfernt worden. Da ich für einige alte Projekte schon eigene Lösungen
entwickelt hatte, kam es hier zu Warnings.

von Peter (Gast)


Lesenswert?

Yes, these macros are defined in <avr\sfr_defs.h> for backward
compatibility. Nevertheless, you shouln't use them in new projects.


/* Backwards compatibility, do not use in new programs.
   These macros are removed.*/

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define inb(sfr) _SFR_BYTE(sfr)
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val))
#define inw(sfr) _SFR_WORD(sfr)
#define outw(sfr, val) (_SFR_WORD(sfr) = (val))
#define outp(val, sfr) outb(sfr, val)
#define inp(sfr) inb(sfr)
#define BV(bit) _BV(bit)

#endif  /* SFR_DEFS_H */

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Die Antwort ist falsch.

Da wir jetzt ein <compat/deprecated.h> haben, haben wir darin nicht
nur die Dinge aufgenommen, die in Version 1.4 neu "deprecated"
geworden sind, sondern auch noch die ,,beliebten'' alten IO-Makros
mit
nachgezogen.

<compat/deprecated.h> sollte aber ausschließlich zur Pflege
existierender Altlasten benutzt werden, alles darin enthaltene ist
eben nicht nur komplett überflüssig, sondern wurde aus irgendwelchen
Gründen ,,entsorgt''.

Übrigens: bitte <avr/sfr_defs.h>, nicht <avr\sfr_defs.h>.  Das
erleichtert die Portierbarkeit des Codes.  Der Vorwärtsstrich
funktioniert auch unter sämtlichen existierenden Windowsvarianten (ja,
bis zurück zu Windows 1.x, sogar bis zurück zu MS-DOS wenigstens
Version 3.x) als Pfadnamentrenner.

von Peter (Gast)


Lesenswert?

Aha..  ;o)

Danke für die Präzisierungen, ich hatte bloss den Kommentar nochmals
rezitiert.

Gruss Peter

von dennis (Gast)


Lesenswert?

Was wäre denn der aktuelle Ersatz für sbi, cbi & co?

von Fritz G. (fritzg)


Lesenswert?

PORTB|=_BV(1) setzt das 2.Bit in PORT B
PORTB&=~_BV(1) löscht es.

Der Compiler macht dann draus sbi usw. aber nicht wenn man

PORTB|=_BV(1)|BV(2)

macht, dann ist out schneller, aber das weiss der Compiler selbst.
Muss aber glaub ich mind. mit -Os optimiert werden.

von dennis (Gast)


Lesenswert?

wieso wird in C eigentlich immer nur mit solchen Operatoren gearbeitet
die man nur versteht wenn man sich damit auskennt? Was spricht gegen
Befehle wie sbi und cbi? Sind doch immerhin die normalen
Maschinenbefehle

von Fritz G. (fritzg)


Lesenswert?

sbi() ist ein Makro, das heisst halt zufällig so wie der
Assemblerbefehl. Aber sbi() ist halt kein C, auf einem anderen
Controller gibts den Befehl vielleicht nicht.
Die Schreibweise mit PORTB|=_BV(1) ist portabel wenn PORTB ein gültiger
Portname ist.

| ist ein binäres ODER, & ein Binäres UND, ~ die Negation.

man kann auch schreiben
PORTB=PORTB|(1<<1);

Ich könnte auch als C Programmierer sagen: was ist sbi? Muss ich jetzt
Assembler können um C zu programmieren?

von dennis (Gast)


Lesenswert?

aber _BV ist doch auch ein Makro. Da ist mir die Logik nicht ganz klar.
Für mich ist sbi & co verständlicher, egal in welcher Sprache

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

> Ich könnte auch als C Programmierer sagen: was ist sbi? Muss ich
> jetzt Assembler können um C zu programmieren?

Genauso könntest du fragen "was ist PORTB?" oder "was ist _BV?".

Ich habe nie verstanden warum diese Makros plötzlich böse sein sollte.
Wem "sbi" nicht gefällt, der kann es ja "set_bit" nennen. Aber das
"PORTB &=~ _BV(1)"-Kauderwelsch macht den Code nur unnötig
fehleranfällig und unleserlich.

von Peter (Gast)


Lesenswert?

Der richtige C-Weg um Bit's zu setzen oder zu löschen ist zB:

PORTB |=   (1<<PIN3)|(1<<PIN2);   // Setzt Pin 2+3
PORTB &= ~((1<<PIN3)|(1<<PIN2));  // Löscht Pin 2+3

Gruss Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Ich habe nie verstanden warum diese Makros plötzlich böse sein
> sollte.

Sie waren seit ca. 2001 überflüssig.  Sie waren einfach nur Krücken
zuvor, damit man an die entsprechenden Maschinenbefehle überhaupt
herankam, als der Compiler noch zu blöd war dafür.  Seinerzeit waren
sie inline-asm-Makros, die direkt die entsprechenden Maschinenbefehle
abgebildet haben -- mit allen Fallstricken.  Wenn das entsprechende
Register nicht SBI-fähig war, bekam man für scheinbar syntaktisch
richtigen Code plötzlich seltsame Assemblerfehlermeldungen an den Kopf
geworfen.

,,Böse'' sind sie nicht, aber genügend Leute haben sie sinnlos und
blindlings eingesetzt in der Annahme, da sei auch das drin, was drauf
steht (das ist es keineswegs immer).  Davon abgesehen, dass ich diesen
Makros persönlich die Hauptschuld gebe, dass von allen
Lowlevel-C-Programmierer-Gemeinden die AVR-C-Programmierer diejenigen
sind, die als einzige nach wie vor ziemlich lernresistent gegenüber
C-Bit-Operatoren sind, spätestens wenn man dann sowas sieht wie:

sbi(DDRB, 0);
sbi(DDRB, 1);
sbi(DDRB, 2);
sbi(DDRB, 3);
sbi(DDRB, 4);
sbi(DDRB, 5);
sbi(DDRB, 6);
sbi(DDRB, 7);

fragt man sich schon, ob nicht vielleicht beim Schreiben der richtigen
Bitnotation manch einem die Idee gekommen wäre, dass es auch ein

DDRB = 0xff;

getan hätte.

Aber `deprecated' hat diese Makros bereits Marek Michalkiewicz,
nachdem er dem Compiler endlich beigebracht hat, mit der üblichen
Notation für IO-Register ordentlich umzugehen (sofern ich mich recht
erinnere).

von dennis (Gast)


Lesenswert?

Ich schließe mich da Andreas' Meinung an. Dieser Operator Kauderwelsch
ist nur mit viel Übung lesbar. Allerdings muß ich ein's gestehen: bei
anderen C-Compilern dürfte man diese Macros von Haus aus nicht finden

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Dieser Operator Kauderwelsch
> ist nur mit viel Übung lesbar.

Dann ist C für dich einfach mal die falsche Programmiersprache.
Nimm Ada.

von Birger* (Gast)


Lesenswert?

Ich persönlich habe schon lange sbi() & co. aus meinen Programmen
verbannt. Ich benutze wie oben geschrieben nur sowas:
PORTB |=   (1<<PIN3)|(1<<PIN2);   // Setzt Pin 2+3
PORTB &= ~((1<<PIN3)|(1<<PIN2));  // Löscht Pin 2+3

Mit _BV kann ich auch nicht viel anfangen. Dabei kann PORTB erstmal als
ein Zeiger auf einen unsigned char gesehen werden. Alle darüber
hinausgehenden Konstrukte sind nicht wirklich C und bei Programmen, die
mit abenteuerlichen #define aus C Pascal oder Basic machen wollen, kann
ich mich ebenfalls nur schütteln. Und Assembler hat in einem C-Programm
eigentlich nicht wirklich was verloren. Wenn man meint sowas gebrauchen
zu müssen, so gehört sowas in eine individuelle Header-Datei aber nicht
in den Compiler selber.

von Birger* (Gast)


Lesenswert?

Oh je, ich lese grad meinen älteren Beitrag und möchte mich bzw. mein
Copy&Paste korrigieren:
PORTB |=   (1<<PORTB2)|(1<<PORTB3);   // Setzt Pin 2 u.3
PORTB &= ~((1<<PORTB4)|(1<<PORTB7));  // Löscht Pin 4 u.7

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.