PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datenregister an Funktion übergeben



ach-feld
20.03.2006, 21:08
hallo zusammen,

wie kann ich das datenregister an eine selbst geschriebene funktion übergeben? ich habe vor eine funktion zu schreiben, an die man das datenregister und den port übergeben kann und die dann den entsprechenden port auf HIGH bzw. LOW setzt. also so in etwa:

void mache_an(Datenregister, port, pin)
{
//datenregister setzen
//z.B. DDRA = 0xFF;
//ausgang schalten
//z.B. PORTA = (1 << PA1);
}

wie kann ich dies realsieren?

gruß

gamecounter
20.03.2006, 21:35
wenn ich mich nicht irre müsste das mithilfe von pointern realisierbar sein.

schau dir vielleicht mal die theorie zu diesem kapitel im internet an.

im endeffekt müsstest du die speicheradresse des Ports bzw Registers an die Funktion übergeben und diese in einem Pointer (ein Variablentyp für speicheradressen) speichern und damit weiterarbeiten.

im netz gibts da viel dazu (stichwort pointer)

mfg gamecounter

skillii
20.03.2006, 21:37
Was meinst du mit einem Datenregister?
Eines der Register r0 - r31 des Controllers,
oder einfach irgend ein Byte aus dem SFR?

Naja ein beliebiges Byte aus dem SFR übergibst du einfach wie einen "unsigned char".
also so z.B.:
void Funktion(unsigned char port);

ach-feld
20.03.2006, 21:42
hi,

erstmal danke für die schnelle antwort, allerdings kenn ich mich schon relativ gut mit c und auch mit pointern etc aus. was ich jetzt nur benötige, wären die speicheradressen der Datenregister etc. aber ist das nicht irgendwie anders möglich? schließlich gab es ja auch mal in früheren versionen sbi und cbi an die man auch die entsprechenden ports und pins übergeben hat. weiß jetzt nicht ob das makros oder funktionen waren aber im prinzip muss das also möglich sein. habe auch schon einiges im internet durchsucht aber nichts zu diesem thema gefunden.

ach-feld
20.03.2006, 21:44
hallo,

ich hatte mir gedacht, dass ich die funktion wie folgt aufrufen kann:
mache_an(DDRA, PORTA, PA6);
ich denke, daran kannst du erkennen, was ich mit datenregister usw meine.

skillii
20.03.2006, 21:47
Wenn du z.B.: das Register PORTB übergeben willst dann schreibst du einfach folgende Funktion:
void Funktion(unsigned char port);

und beim Aufruf:
Funktion(PORTB);

allerdings so wie ich es jetzt geschrieben habe kannst du den Wert in der Funktion nicht verändern(call by value).
um PORTB in der Funtion zu verändern müsstest du folgendes schreiben:

void Funktion(unsigned char* port);

und beim Aufruf:
Funktion(&PORTB);

mfg

gamecounter
20.03.2006, 21:58
genau das meinte ich mit pointern ;)

ach-feld
20.03.2006, 22:09
also weiß ich jetzt, wie ich PORTx übergeben kann. aber wie übergebe ich DDRx? kann man das auch als unsigned char übergeben? und wie ist das mit dem pin?

danke für die bisherigen antworten

skillii
20.03.2006, 22:14
Das DDRx Register ist auch ein 1-Byte Register wie fast alle anderen Register im AVR, also kannst du ihn genau so wie z.B.: PORTx an eine Funktion übergeben.

Ein PIN ist einfach ein Index(0...7) im entsprechenden Register, also kannst du ihn auch per "unsigned char" übergeben.

ach-feld
20.03.2006, 22:16
danke für die schnellen antworten. ich glaube ich hab jetzt alles verstanden.
eigentlich ganz einfach, wenn man weiß, dass man alles per "unsigned char" übergeben kann. danke nochmal

ach-feld

SprinterSB
21.03.2006, 09:11
PORTx und DDRx ist KEIN unsigned char* !

Es hat zu heissen


void Funktion (unsigned char volatile * port);

Das volatile ist wichtig, sonst landest du ruckzuck auf der Nase, je nach Code!