Forum: Mikrocontroller und Digitale Elektronik AVR PortG bei ATmega128


von Andreas (Gast)


Lesenswert?

Hallo Zusammen,

ich habe gerade ein kleines Problem und verstehe die Went nicht mehr so 
ganz.

Aufgabenstellung: ich möchte bei einem ATmega128 von PORTG, den Eingang 
Drei, also PING.3 einlesen. Alledinsg bekomme ich beim Compilieren unter 
CodevisionAVR immer folgende Fehlermeldung:

  the first argument of the '.'operator must be of 'struct' or 'union' 
type

So, ich habe im Source den Port mittels

  #define  status PING.3

definiert. Die Datadirection im init128.h stimmt auch! Allerdings sind 
nicht mal die einfachsten Operationen wie beispielseise

  while (status == 1);

möglich.

Hab' ich noch was übersehen, bzw. könnt ihr mir noch einen Hinweis 
geben?

Danke und beste Grüße,

Andi

von Klaus W. (mfgkw)


Lesenswert?

Ich kenne jetzt dein CodevisionAVR nicht, aber mit dem üblichen gcc
für den AVR geht das etwas anders:
1
    if( ( PING & (1<<PG3) )!=0 )...

Nichtsdestotrotz kann man sich so etwas wie ping.bit3
selber basteln mit einer struct von bit fields, die man an
die richtige Adresse legt.
Das muß man aber selbst machen.

von Andreas (Gast)


Lesenswert?

Hi,

danke für die Antwort; das nimmt mein CodevisionAVR auch nicht - leider.

Jetzt meldet er, dass er 'PG3' nicht kennt. Kannst du mir vielleicht 
noch
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.

Danke nochmals,

Andi

von Karl H. (kbuchegg)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

Ansonsten steht alles im Datenblatt (ganz hinten, Tabelle mit 
Registern).

von Andreas (Gast)


Lesenswert?

Hallo nochmals zusammen!

Vielen HERZLICHEN DANK! Das hat mir enorm weitergeholfen.

Beste Grüße,

Andi

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.