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
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.
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
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
Ansonsten steht alles im Datenblatt (ganz hinten, Tabelle mit Registern).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.