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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Josef K. (sechzger_sepp)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert

von Theor (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.