C Macro @ PIC Compiler

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallo liebe C-Ler,

Kann ich dieses Macro auch für die AVR´s umschreiben?



CodeBox C
static bit LCD_RS @ ((unsigned)&PORTE*8+0);  // Register select
static bit LCD_EN @ ((unsigned)&PORTE*8+2);  // Enable
static bit LCD_RW @ ((unsigned)&PORTE*8+1);  // R/W
#define EN_TRIG ((LCD_EN = 1),(LCD_EN = 0));
 
Kann ich dieses Macro auch für die AVR´s umschreiben

Es gibt einige Lösungen, dies "umzuschreiben".

Elegant finde ich diese ...

Hier am Beispiel des Signals LCD_EN (auf PE2).


CodeBox C
#define LCD_EN  PE2
#define LCD_EN_PORT  PORTE
#define LCD_EN_DDR  DDRE
#define LCD_EN_PIN  PINE

// Macros
#define configure_as_input(bit)  {bit ## _DDR &= ~(1 << bit);}
#define configure_as_output(bit)  {bit ## _DDR |= (1 << bit);}
#define set_high(bit)  {bit ## _PORT |= (1 << bit);}
#define set_low(bit)  {bit ## _PORT &= ~(1 << bit);}
#define toggle(bit)  {bit ## _PIN |= (1 << bit);}



int main (void)
{
  // ...
  // Portpin konfigurieren: Output Low
  set_low (LCD_EN);  // ist nach Reset bereits low
  configure_as_output (LCD_EN);
  //

  // EN_TRIG: low->high->low
  set_high (LCD_EN); set_low (LCD_EN);

  // ...


Dirk :ciao:
 
Hallo Dirk,

ist es Sinnvoll damit zu arbeiten? Arbeitest du gerne damit?
 
Ich meine so im allgemeinen...
 
Ich meine so im allgemeinen...

Ja schon. Richtig eingesetzt machen Macros den Code übersichtlicher (verständlicher) und man kann einfacher ganze Programmteile in andere Projekte übernehmen und muss dabei nur wenig anpassen.
 
Okay, finde ich auch.
Aber @Dirk was genau bewirken die beiden Rauten?

Und muss man _PIN mit unterstrich schreiben? Was bringt dies alles?
 
Und muss man _PIN mit unterstrich schreiben? Was bringt dies alles?

In dem Fall ja.

Beispiel
#define set_high(bit) {bit ## _PORT |= (1 << bit);}

Der Präprozessor ersetzt zunächst "bit", also das Argument. "##" ist im Prinzip eine Stringoperation, linker und rechter Teil werden zusammengefügt, hier also "bit" und "_PORT", wobei "bit" erst ersetzt wird durch "LCD_EN", dem Argument.

Bei Aufruf von
set_high (LCD_EN);

entsteht zunächst
{LCD_EN_PORT |= (1<<LCD_EN);}

danach ersetzt der Präprozessor
{PORTE |= (1<<PE2);}

da zuvor definiert ist:
#define LCD_EN PE2
#define LCD_EN_PORT PORTE
#define LCD_EN_DDR DDRE
#define LCD_EN_PIN PINE
 
Ah okay,

Und wieso davor Unterstrich?
 
Okay. Ist das aber nicht genau das gleiche als wenn ich es mit #define mache?
 
Okay. Ist das aber nicht genau das gleiche als wenn ich es mit #define mache?

Hmmm, ich verstehe dich im Moment nicht.

Vielleicht verwendest du einfach auch erst einmal eine einfachere Lösung, so etwas zum Beispiel:


CodeBox C
#define LCD_EN_SET PORTE |= (1<<PE2);
#define LCD_EN_CLEAR PORTE &= ~(1<<PE2);

//...
int main (void)
{
  // ...

  // EN_TRIG: low->high->low
  LCD_EN_SET
  LCD_EN_CLEAR

  // ...
 
Genau das meinte ich.
Es ist doch mit dem Makro genau das gleiche als wenn ich es so mit dem define mache. Im Endeffekt ist es der gleiche Aufwand und lässt sich auch gut Portieren.
 
Meine erste Lösung ist noch etwas flexibler. Die Macros sind "allgemeiner". Das einzigste, was du definieren musst ist dieser Block, jeweils für ein Signal ...



CodeBox C
#define LCD_EN  PE2
#define LCD_EN_PORT  PORTE
#define LCD_EN_DDR  DDRE
#define LCD_EN_PIN  PINE


Du kannst es auch anders lösen, zum Beispiel so wie in meinem letzten Beitrag. Ich hatte ja geschrieben, dass es hierfür einige Lösungen gibt ;)
 
Hallo,

kurze Frage noch dazu.



CodeBox C
#define DDR(x) (*(&x - 1))  /* address of data direction register of port x */


Was es macht, verstehe ich ja. Nur wieso kommt der "* Pointer Operator" und der "& Adress Operator" dort zum Einsatz?
Das man mit "&" die Adresse übergibt weiß ich, den Zusammenhang verstehe ich bloß noch nicht so ganz :/
 
Ich denke mit &x hat man die Adresse vom Argument, von dieser Adresse wird 1 abgezogen und mit * hat man den Inhalt der Adresse.

& Address-of Operator
* Dereference Operator

Was ich mich frage, was du da vorhast. Also ich kann mir es schon denken ;) aber bist du gerade im "Lernrausch" oder hast du einen fertigen Code, den du verstehen möchtest oder musst? :)

Dirk :ciao:
 
Ich bin gerade im Lernrausch :p Ich muss sagen, dass ich schon eine Menge mehr verstehe als am Anfang.
Möchte halt einige Tricks noch lernen und verstehen. Schaue mir gerade div. Codes an um davon zu lernen ;)
Schlimm?
 
Ich bin gerade im Lernrausch :p Ich muss sagen, dass ich schon eine Menge mehr verstehe als am Anfang.
Möchte halt einige Tricks noch lernen und verstehen. Schaue mir gerade div. Codes an um davon zu lernen ;)
Schlimm?

:D Nein, das ist doch gut!

Dirk :ciao:
 
  • Like
Reaktionen: Janiiix3
Ich denke mit &x hat man die Adresse vom Argument, von dieser Adresse wird 1 abgezogen und mit * hat man den Inhalt der Adresse.

& Address-of Operator
* Dereference Operator

Was ich mich frage, was du da vorhast. Also ich kann mir es schon denken ;) aber bist du gerade im "Lernrausch" oder hast du einen fertigen Code, den du verstehen möchtest oder musst? :)

Dirk :ciao:


Dann habe ich später also im DDR(x) den Inhalt, nicht die Adresse?!
 
Dann habe ich später also im DDR(x) den Inhalt, nicht die Adresse?!

Ich nehme an du möchtest zum Beispiel PORTA übergeben. Das DDRA Register liegt sicher eine Adresse unter dem PORTA Register. Du holst dir also erst die Adresse von PORTA, danach subtrahierst du 1. Diese neue Adresse zeigt auf DDRA, durch "*" hast du den Inhalt der Adresse.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)