Forum: Mikrocontroller und Digitale Elektronik Atmega328 Register an Funktion übergeben


von Josef K. (sechzger_sepp)


Lesenswert?

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

von Theor (Gast)


Lesenswert?

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.

von Josef K. (sechzger_sepp)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

>void shiftregWrite(char x, int port, char data, int clk, int trans)

void shiftregWrite(char x, volatile uint8_t *port, char data, int clk, 
int trans)
{
*port = ...
}

shiftregWrite(..., &PORTB, ...);

von Thomas E. (thomase)


Lesenswert?


von Theor (Gast)


Lesenswert?

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.

von Theor (Gast)


Lesenswert?

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.

von Josef K. (sechzger_sepp)


Lesenswert?

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.

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
Noch kein Account? Hier anmelden.