www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR PortG bei ATmega128


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne jetzt dein CodevisionAVR nicht, aber mit dem üblichen gcc
für den AVR geht das etwas anders:
    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.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ansonsten steht alles im Datenblatt (ganz hinten, Tabelle mit 
Registern).

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmals zusammen!

Vielen HERZLICHEN DANK! Das hat mir enorm weitergeholfen.

Beste Grüße,

Andi

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.