Forum: Compiler & IDEs Atmel Studio 7 - Atmega328p - Befehle werden rot unterstrichen


von Frank (Gast)


Lesenswert?

Hallo,
ich habe in Atmel Studi 7 ein einfaches Blink-Programm geschrieben
1
#define F_CPU 16000000L
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
7
int main(void)
8
{
9
  DDRB |= (1 << PB5); // PB0 -> Ausgang
10
  PORTB &= ~(1 << PB5); // PB0 -> low
11
  while (1)
12
  {
13
    _delay_ms(1000);
14
    PORTB ^= ( 1 << PB5 );
15
  }
16
  return 0;
17
}

PB5 wird dabei jedesmal rot unterstrichen. Das kenne ich eigentlich nur, 
wenn ein Befehl nicht funktioniert oder ähnliches. Aber hier scheint es 
keine Auswirkung (bis auf Verwirrung) zu haben.

Muss ich evtl. noch etwas einstellen? Habe als Device aber den 
Atmega328p gewählt.

Frank.

: Verschoben durch User
von Bastian W. (jackfrost)


Lesenswert?

Hi,

Probiers mit PORTB5 statt mit PB5. In der iom328p.h sind die nun 
scheinbar so definiert. Beim Attiny2313 ist es noch PBx.

Gruß JackFrost

von Stefan F. (Gast)


Lesenswert?

> Probiers mit PORTB5 statt mit PB5. In der iom328p.h sind
> die nun scheinbar so definiert.

Also wenn das wahr ist, dann habe ich hiermit einen weiteren erheblichen 
Grund vom Atmel Studio abzuraten.

von Bastian W. (jackfrost)


Lesenswert?

Ich hab mir gerade ein paar io.h auf Github angeschaut.

Beim Atmega644 ( iomxx4.h) ist es PBx
Beim Atmega328p Portbx

Falsches Copy&Past ?

Gruß JackFrost

von jrins (Gast)


Lesenswert?

Bastian W. schrieb:
> Falsches Copy&Past ?

Wahrscheinlich.

von Sheeva P. (sheevaplug)


Lesenswert?

Bastian W. schrieb:
> Ich hab mir gerade ein paar io.h auf Github angeschaut.
>
> Beim Atmega644 ( iomxx4.h) ist es PBx
> Beim Atmega328p Portbx
>
> Falsches Copy&Past ?

Vermutlich. Magst Du bitte einen Bugreport schreiben?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Stefan U. schrieb:
> Also wenn das wahr ist, dann habe ich hiermit einen weiteren erheblichen
> Grund vom Atmel Studio abzuraten.

Ich finde PORTB5 weitaus intuitiver als PB5. Mir gefällt diese 
Schreibweise deutlich besser, da sie auch bei größeren und neueren 
Controllern zum Einsatz kommt. Abkürzungen sind nicht immer sinnvoll, 
schon gar nicht, wenn sie nur aus 3 Charaktern bestehen.

von Bastian W. (jackfrost)


Lesenswert?

Sheeva P. schrieb:
> Vermutlich. Magst Du bitte einen Bugreport schreiben?

Ist auf Bugzilla geschrieben.

Gruß JackFrost

von Wolfgang (Gast)


Lesenswert?

Knut B. schrieb:
> Ich finde PORTB5 weitaus intuitiver als PB5.

Wieso siehst du der Bezeichnung besser an, dass es sich um die Nummer 
eines Bits handelt? Mit Port hat das doch beliebig wenig zu tun.

Man könnte doch genauso schreiben
1
PORTB &= ~(1 << PC5);
 und würde damit immer noch das sechste Bit meinen.

von Stefan F. (Gast)


Lesenswert?

> Ich finde PORTB5 weitaus intuitiver als PB5.

Dann brauchst du allerdings auch PINB5 und DDRB5.

Wie dem auch sei, diese Sachen einfach von einem Patchlevel zum nächsten 
umzubenennen geht gar nicht. Stell Dir mal vor, man würde sowas in der 
Windows API oder bei Linux in der libc machen!

Dann müssten die Programmierer auf der ganzen Welt der Welt zusammen 
gerechnet Hundert-Tausende Stunden arbeiten, um alle davon abhängigen 
Programm anzupassen.

So etwas macht man nicht. Man kann ja gerne neue Alternativen 
hinzufügen, aber die ursprünglichen Namen müssen gültig bleiben. Ist ja 
nicht so, dass die ATmega Serie gerade erst erfunden wurde.

von Sheeva P. (sheevaplug)


Lesenswert?

Bastian W. schrieb:
> Sheeva P. schrieb:
>> Vermutlich. Magst Du bitte einen Bugreport schreiben?
>
> Ist auf Bugzilla geschrieben.

Super, danke!

von Sheeva P. (sheevaplug)


Lesenswert?

Stefan U. schrieb:
>> Ich finde PORTB5 weitaus intuitiver als PB5.
>
> Dann brauchst du allerdings auch PINB5 und DDRB5.

Man kann ja beide Schreibweisen anbieten.

> Wie dem auch sei, diese Sachen einfach von einem Patchlevel zum nächsten
> umzubenennen geht gar nicht.

Absolut richtig!

von Harry L. (mysth)


Lesenswert?

Stefan U. schrieb:
> Also wenn das wahr ist, dann habe ich hiermit einen weiteren erheblichen
> Grund vom Atmel Studio abzuraten.

Das hat mit Atmel Studio rein gar nichts zu tun!

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Knut B. schrieb:
> Ich finde PORTB5 weitaus intuitiver als PB5. Mir gefällt diese
> Schreibweise deutlich besser, da sie auch bei größeren und neueren
> Controllern zum Einsatz kommt. Abkürzungen sind nicht immer sinnvoll,
> schon gar nicht, wenn sie nur aus 3 Charaktern bestehen.

 Aber wenn es sich um bits handelt ist es doch vollkommen egal, ob
 PB5 oder PC6 oder PORTA4.
 Am sinnvollsten wäre es gewesen, einfach b0..b7 zu definieren und dann
 nur diese zu benutzen, also:
1
  PORTB &= ~(1 << b5);
2
  PORTC &= ~(1 << b6);
 Und auch das nur, damit man weiss, dass es sich um eine Bitoperation
 handelt und das man genau diese bits setzen oder löschen wollte.

 Weder PB5 noch PORTB5 haben irgendetwas mit PORTB zu tun, bezeichnen
 nur die bitwertigkeit.
 Auch folgendes funktioniert:
1
  uint8_t DummyVar = 85;
2
  DummyVar |= (1<<PB5);
 Und natürlich auch dieses:
1
  DDRC |= (1<<PORTB5);
 Anstatt diese Bitdefinitionen für jeden Port und fast alle Register
 dumm zu wiederholen, wäre eine einzige Definition am Anfang völlig
 ausreichend, für alle CPUs.
 Wenn es so ginge:
1
  PORTB5 = true;    // oder _ON
2
  PORTD4 = false;   // oder _OFF
 dann wäre es noch irgendwie logisch.

 Somit ist PORTB5 genauso überflüssig und verwirrend wie z.B. GPIOR24,
 _UBRR0 aber dafür UBRR3 (ohne Unterstrich).
 Nach dieser Logik müsste es auch UBRR0H1 geben, aber nein, beim
 ATMEL ist das UBRR9.

 Aber ATMEL wäre nicht ATMEL wenn es logisch wäre...

 P.S.
 Natürlich ist z.B. TXCIE oder UDRE sinnvoll und nötig, aber jeder, der
 diese dumme und überflüssige RegisterOderPortnamenBitbezeichnungen
 benutzt, ist selber schuld wenn sein Programm beim nächsten Typ nicht
 compiliert wird.

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Eigentlich bin ich der Ansicht, man sollte als Konvention generell immer 
die SFR Namen des Datenblatts verwenden um Unklarheiten und 
Missverständnisse zu vermeiden.

von Timmo H. (masterfx)


Lesenswert?

Da die "Portzuordnung" für einen PIN meines Erachtens eh schwachsinnig 
ist (da ja die Pins eh alle die gleiche Wertigkeit im Register DDR, 
PORT, PIN haben) verwende ich schon von Anfang an die generischen 
PORT0..7, PIN0...PIN7, DD0...7 und wenn ich schreibfaul bin lasse ich 
PORTx und DDx ganz sein und schreibe gleich nur PINx. (ünrigens alles 
portpins.h definiert, wird von io.h included)

Ansonsten müsste man wenn man sehr pingelig ist und mal einen Port 
umlegt, aus
PORTB |= (1<<PB5);
auch
PORTD |= (1<<PD5);
machen.

Da ändere ich doch lieber nur die Portbezeichnung und lasse die 
PORTx/PINx so wie sie sind.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

> einfach b0..b7 zu definieren

Schreib doch einfach PORTB |= (1<<7) !

Ich weiss ja nicht, was Atmel da inzwischen alles weg gekürzt hat. Doch 
in der Linux Version vom gcc ist für jeden Geschmack was passendes 
dabei:

PB0
PORTB0
PINB0
DDR0
_BV(0)     statt (1<<0)

von PORTB (Gast)


Lesenswert?

So steht es in
**************
C:\Atmel7\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\avr\iom328p. 
h
************************************************************************
#define PORTB _SFR_IO8(0x05)
#define PORTB0 0
#define PORTB1 1
#define PORTB2 2
#define PORTB3 3
#define PORTB4 4
#define PORTB5 5
#define PORTB6 6
#define PORTB7 7

Niemand verbietet zusätzlich etwas in iom328p.h hinein zu schreiben.
*******************************************************************
#define PB0 0 /*for compability*/
#define PB1 1
#define PB2 2
#define PB3 3
#define PB4 4
#define PB5 5
#define PB6 6
#define PB7 7

Sind ja defines : !! Textersetzungen !!
                  *********************

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Stefan U. schrieb:
>> einfach b0..b7 zu definieren
>
> Schreib doch einfach PORTB |= (1<<7) !

 Tue ich doch.
 Oder benutze  PORTB |= (1<<b7).

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.