Hallo,
ich möchte eine Funktion schreiben, mit der ich ein Byte seriell in ein
externes Schieberegister (74HC595) schreiben kann. Der Funktion möchte
ich das zu schreibende Byte, den Port an dem das Schieberegister
angeschlossen ist und die einzelnen Pins für das Schieberegister
übergeben.
Das Ganze funktioniert grundsätzlich schon. Einziges Problem ist noch,
dass ich der Funktion den benötigten Port nicht übergeben kann.
1
void shiftregWrite(char x, int port, char data, int clk, int trans)
2
{
3
4
for(int i=0; i<8; i++)
5
{
6
if (x & (1<<(7-i)))
7
port |= (1<<data);
8
else
9
port &= ~(1<<data);
10
11
port &= ~(1<<clk);
12
port |= (1<<clk);
13
}
14
port &= ~(1<<trans);
15
port |= (1<<trans);
16
}
Ich hab mir das so vorgestellt, dass ich im Funktionsaufruf einfach z.B.
PORTB reinschreiben kann. Dafür ist in wahrscheinlich der falsche
Datentyp ;)
Wie könnte ich das lösen?
Vielen Dank schonmal
Sepp
Ich gehe davon aus, dass Du in einer der C-Dateien eine Include-Datei,
etwa "io.h" einfügst, die zu dem verwendeten Prozessor "passt".
Entweder in dieser oder in einer anderen include-Datei wirst Du entweder
eine Deklaration oder eine Definition oder auch ein Makro finden, dass
es erlaubt, Namen wie "PORTD" als L-Wert zu verwenden.
Wo Du genau nachschauen musst, hängt von dem verwendeten Compiler ab.
Dazu kann ich also nichts sagen.
Josef K. schrieb:> Ja das ist mir klar.> Mir geht es darum, dass die Bezeichnung port in der Funktion durch den> Text in der Parameterübergabe im Aufruf ersetzt wird.
Ja, das ist mir klar.
Mir geht es darum, dass Du die Implementierung des Bezeichners so, dass
er als L-Wert verwendet wird, in den Include-Dateien Deines Compilers
feststellst.
:-)
Daraus ergibt sich, meiner Auffassung nach, die angemessene
Parameterdeklaration.
Wenn Du in einer Funktion einen Port als L-Wert verwendest muss dessen
Deklaration/Definition das auch erlauben. Wenn das aber innerhalb der
Funktion möglich sein soll, dann muss der Parameter entsprechend
deklariert sein. Dann aber muss der Funktionsaufruf den Parameter
entsprechend enthalten. Zusätzlich sollte gelten, - das ist nur so ein
Gedanke -, das der Bezeichner nicht von der üblichen Verwendung im
globalen Geltungsbereich abweicht.
Deswegen.
Erklärend könnte ich folgendes hinzufügen:
Es geht mir nicht etwa darum, mich mit meinem Wissen gross zu tun, und
es deswegen solange vor Dir geheim zu halten, bis Du auf den Knien vor
mir liegst. Obwohl ... die Vorstellung hat was, vor allem wenn sie mit
Bargeld verbunden ist. ;-)
Ich möchte Dir Hinweise geben, wie Du Dir das Wissen selbst erschliessen
kannst, wie Du solcher Art Probleme angehen kannst. Das Problem heisst:
Wie werden als L-Werte verwendbare Deklarationen geschrieben?
Daraus ergibt sich in Deinem Fall vielleicht folgende Frage: Was ist ein
L-Wert?
Das steht in einem C-Buch. Ein Buch ist ein Stapel Papier ... ;-) Eine
Erklärung die man im Prä-Internet-Zeitalter hätte geben müssen! Nämlich,
weil es in einem Buch gestanden hätte, was ein Buch ist.
Aber so ... Hier gibt es Hilfe zur Selbsthilfe - keine Fische sondern
Anleitungen zum Angeln.
Vielen Dank für die Hilfe.
@Theor: Ich hab dich falsch verstanden. Habs so verstanden, dass du
dachtest ich weiß nicht dass ich die Registeradressen mittels der
Prozessoreigenen Lib auch mit Bezeichnern ansprechen kann. Was ein
L-Wert ist hab mich mittlerweile ergoogelt. Ist also nur ein Pointer.
Auf die Idee hätte ich auch kommen können. :D Da wäre Hilfe zur
Selbsthilfe wirklich ausreichend gewesen ;)
Taste mich an das ganze Thema erst heran.
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