Andreas schrieb:
> Hi,
>
> danke für die Antwort; das nimmt mein CodevisionAVR auch nicht - leider.
>
> Jetzt meldet er, dass er 'PG3' nicht kennt.
PG3 ist einfach nur
#define PG3 3
Im Grunde wäre ein
if( PING & ( 1 << BIT3 ) )
sowieso auch beim AVR-GCC besser gewesen. Denn das Bit mit der Nummer 3
unterscheidet sich am Port B nicht vom Bit mit der Nummer 3 am Port C
(oder D oder E oder). Das 3. Bit ist immer das 3. Bit, egal bei welchem
Register. Das hätte man nicht mittels jeweils eigenen #define
unterscheidbar machen müssen, sodass im Bitnamen der Portname mit
auftaucht.
PING & ( 1<<PG3)
PING & ( 1<<3)
PING & 0x08
alle 3 Versionen machen dasselbe: Sie maskieren den Registerinhalt, so
dass das Endergebnis nur davon abhängt, ob das 3. Bit gesetzt oder
gelöscht ist.
Aber aus naheliegenden Gründen ist die Variante mit den << meistens die
bessere, weil dort die Bitnummer direkt auftaucht und man nicht erst im
Kopf die Bits abzählen muss um zu erkennen, dass in 0x08 das Bit mit der
Nummer 3 auf 1 ist.
Ob man jetz allerdings
if( PING & (1<<PG3) ) oder
if( PING & (1<<3) ) oder
if( PING & (1<<BIT3) )
schreibt, ist weitgehend Geschmaksssache. Den im Idealfall schreibt man
das gar nicht so, sondern so
#define TASTEN_PIN PING
#define NOTHALT_BIT 3
if( TASTEN_PIN & ( 1 << NOTHALT_BIT ) )
denn dann sieht man auch im Source Code direkt, dass hier der Nothalt
Knopf abgefragt wird und muss sich nicht den Kopf zerbrechen, welcher
Taster jetzt eigentlich am Bit Nummer 3 vom Port G angeschlossen wurde.
Mit noch einem Makro
#define TASTEN_PIN PING
#define NOTHALT_BIT 3
#define IS_BIT_ZERO(P,B) ( (P) & ( 1 << (B) ) )
if( IS_BIT_ZERO( TASTEN_PIN, NOTHALT_BIT ) )
liest sich das dann schon fast wie ein englischer Satz im Klartext und
erzählt einem alles was man wissen möchte.
Nicht ganz so elegant wie
#define NothaltKey PING.3
if( NothaltKey == 0 )
aber auch nicht weit davon entfernt.
> sagen, wo eines eine Mapping Tabelle für den ATmeg128 gibt. Dann kann
> ich mir die Adresse des Ports raussuchen und diese Variable zusammen
> basteln.
Wenn der Compiler PING kennt, brauchst du das alles nicht.
Du musst dich nur von der Vorstellung lösen, dass es nur einen Weg gibt
um auf Portpins zuzugreifen. Viele Wege führen nach Rom
Bitmanipulationen