PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : #define "PortPin" im Header-Datei



oderlachs
19.05.2014, 09:43
Hallo Freunde !
ja das berühmte "Brett vorm Kopp.." hat wieder zugeschlagen.. ](*,) Ich möchte in einer Headerdatei mit #define einem bestimmten Namen einen PortPin zuweisen , so das ich zBsp.

#define Output1 PORTD
#define LED1 PIND1

... usw

Output1 &= ~(1 << LED1)

schreiben kann. Ich weiss aber nicht wie ich so etwas definieren muss, ich meine wie ich die zugeordneten Pin/Ports schreiben muss und ob es überhaut geh...

Mir geht es darum, in grösseren Projekten einfach durch Änderung im #define mal eine Änderung vor nehmen zu können , das ich nicht dann den ganzen Source ändern muss.
Ich hoffe das ich mich richtig ausgedrückt habe und zu erkennen ist, was ich eigendlich möchte. Ich habe es leider :( nicht verstanden, per Webrecherche danach zu suchen, weil ich mich wahrscheinlich nicht recht in den Suchmaschinen richtig ausdrücken konnte...

Ich freu mich wenn mir Jemand helfen könnte... :)

Gruss und Danke

Gerhard

markusj
19.05.2014, 11:53
Hallo Gerhard,

ich sehe dein Problem gerade nicht. Der Code den du da geschrieben hast realisiert doch genau die von dir gewünschte Funktion, oder übersehe ich was?

mfG
Markus

oderlachs
19.05.2014, 12:27
Danke Markus !

Ja ich weiss nicht ...der Compiler( AVR-Studio + STK500-DevBoard) meckert wenn ich hinter einer '#define Name Bezeichnung' über die Bezeichnung wenn da Text steht...aber ich werde mal weiter probieren.. ;)
Gruss
Gerhard

oberallgeier
19.05.2014, 12:46
...der Compiler( AVR-Studio + STK500-DevBoard) meckert ...*Grübel* Sag mal, der Ausdruck PIND1 ist doch der Inhalt von Bit1 {0...7} des PORTD, oder nicht? Und ich habe so den Eindruck, dass Du den Pin PD1 von PORT D schalten möchtest. Ich würde das anders schreiben - so in der Art #define LED1 PD1. Und wenn mich nicht alles täuscht, ergibt das Auslesen eines Ausgangsregisters mit dem Befehl PINxn ein Umschalten (toggeln) des Pinns.

oderlachs
19.05.2014, 13:03
Ja Oberall..
So meine ich das... soeben musste ich feststellen das mein oben vorgestellter "Code" nun plötzlich angenommen wird, jedenfalls wenn ich ihn so in der main.c im header so schreibe. Vielleicht hatte ich ja in der direkten Headerdatei noch ein Fehler beim Einbinden oder so. Dann hatte ich was in der Form von "_sv_" oder so ähnlich im Web gefunden, da die Beschreibung in english war/ist musste ich leider streiken...

Nun ist mir schon geholfen, das es so geht. Werde es gleich noch mit separater Headerdatei versuchen...
Ich könnte mir auch denken das vieleicht der verwendete µC diese von mir benutzte Pinangabe nicht mag...Das Avr Studio meckert ja wenn da was falsch ist also Code und Chip nicht übereinstimmen...

Mal gleich einflechte, kann man eigendlich im Header mit '#define auch den µC festlegen um dann Chipgerecht auf die richtigen Register zuzugreifen... ??
Ist zwar ein anderes Thema aber viell. hat ja wer grad ne passende Antwort der das hier liest...

Gruss und Dank

Gerhard

markusj
19.05.2014, 13:52
Mal gleich einflechte, kann man eigendlich im Header mit '#define auch den µC festlegen um dann Chipgerecht auf die richtigen Register zuzugreifen... ??
Ist zwar ein anderes Thema aber viell. hat ja wer grad ne passende Antwort der das hier liest...

Ja, du kannst über #if / #endif eine Fallunterscheidung einbauen die Abhängig vom jeweiligen µC ist. Je nach ausgewähltem AVR werden eine ganze Reihe von Makros gesetzt, die Aussagen über die Prozessorgeneration und vorhandene Features/Eigenheiten treffen. Eines dieser Makros beschreibt den konkreten Prozessortyp, z.Bsp. __AVR_ATmega8__


#if __AVR_ATmega8__
//do something for Mega8
#endif
#if __AVR_ATmega32__
//do something for Mega32
#endif


mfG
Markus

Peter(TOO)
20.05.2014, 14:47
Hallo Gerhard,

#define funktioniert eigentlich wie "Suchen und Ersetzen" in der Textverarbeitung!

Und da #define zum Pre-Processor gehört, wird dies ausgeführt bevor der Compiler anfängt zu Übersetzen.

Deshalb muss man bei gewissen Dingen dann etwas aufpassen

#define BufferSize 10+1

int a[BufferSize]; // ergibt ein Array mit 11 int

int a[BufferSize * 3]; // ergibt ein Array mit 13 int !!! und nicht wie erwartet 33.
Nach dem Pre-Processor sieht das folgendermassen aus:
int a[10 + 1 * 3]; // und dies ergibt aber 10 + 3 = 13

Mit
#define BufferSize (10+1)
funktioniert es dann richtig!
int a[(10 + 1) * 3];

MfG Peter(TOO)

oderlachs
20.05.2014, 17:31
Danke Markus, danke Peter !

So langsam frischt sich der Speicher im Kopfe wieder auf...schon mal gelerntes wird aufgefrischt :)

Ja ich denke nun weiss ich Bescheid und kann meine Aufgaben lösen, Dank der Hilfe im Forum hier !

Gruss und DANKE

Gerhard