Zeiger auf 'Register'

Hallo zusammen,

erst mal eine generelle Frage:

kann ich mit einem Zeiger auf das Daten-Register eines mC zugreifen??
zum Beispiel zum setzen eines PINs auf high…

Wenn ja wie könnte das gehen und welchen Typ hat dann der Zeiger?!

Grüße
Geisenhof

Hallo Geisenhof,

kann ich mit einem Zeiger auf das Daten-Register eines mC
zugreifen??
zum Beispiel zum setzen eines PINs auf high…

JAIN.
Fragt sich aber was du unter „Daten-Register“ verstehst.
Und ganz wichtig ist es auch die CPU, bzw. deren Architektur zu kennen. Und je nachdem, muss man auch noch die konkrete Hardware kennen.

Wenn ja wie könnte das gehen und welchen Typ hat dann der
Zeiger?!

Willst du jetzt keine oder Hundert Antworten?

Ohne Angabe einer Programmiersprache, kann man deine Frage nicht beantworten!

Deine Frage ist so allgemein gehalten, dass man sie nicht beantworten kann.

MfG Peter(TOO)

Hallo Peter,

danke schonmal für die Antwort…

tut mir leid :wink:

also Programmiersprache ist C
Das Programm läuft auf einem 32-Bit-mC von Fujitsu

Fragt sich aber was du unter „Daten-Register“ verstehst.

Also ich meine hierbei das Port-Data-Register des mC welches ich zum High-/Low-setzen der einzelnen I/O-Ports des mC verwende.

Willst du jetzt keine oder Hundert Antworten?

also die Anzahl der Antworten ist mir nicht so wichtig =P

Deine Frage ist so allgemein gehalten, dass man sie nicht
beantworten kann.

MfG Peter(TOO)

Ich hoffe das waren ein paar Details…

Beste Grüße

Hallo Fragewurm,

also Programmiersprache ist C

Gut, welcher Compiler?

Das Programm läuft auf einem 32-Bit-mC von Fujitsu

Die haben memorymaped IO.
Dann gehts mit dem Pointer.

Also ich meine hierbei das Port-Data-Register des mC welches
ich zum High-/Low-setzen der einzelnen I/O-Ports des mC
verwende.

Und was ist jetzt genau deine Frage, bzw. dein Problem ?

MfG Peter(TOO)

oT: µC
Guten Tag,

auf den meisten Tastaturen hat es unter dem [M] noch das [µ]. Es wird genau wie das [€] mit [AltGr] bzw. [Alt] + [Ctrl, Strg] aktiviert.

Gruß

Stefan

DANKE

*BonBon geb*

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Also ich versuchs mal so einfach wie möglich zu erklären =)

ich habe eine reihe sich gegenseitig aufrufendeN Funtionen diese dienen zur kommunikation mit einem sensor.

in allen diesen funktionen wird permanent ein „symbol“ „DATA“ verwendet welches vorher über #define auf einen bestimmten port des port-data-registers definiert wurde.

jetzt möchte ich das programm auf mehrere sensoren erweitern und möchte aber nicht alles neu programmieren sondern den code nur modifizieren.

daher wollte ich einfach einen zeiger zb. „DATA_PTR“ verwenden mit dem ich auf einen bestimmten I/O-port zeige und diesen zeiger dann an die funktionen übergebe bzw. durch die funktionen hindurchgebe. Diseser zeiger ersetzt dann das symbol „DATA“. nach jedem auslesevorgang lasse ich dann den zeiger auf einen anderen I/O port zeigen und wiederhole den auslesevorgang.

ich denke das ist die einzige möglichkeit die funktionen zu behalten und trotzdem eine einzige variable/symbol bzw. jetzt zeiger die in allen funktionen verwendet wird für mehrere ports zu verwenden

…ich hoffe es wurde einigermaßen klar =)

in allen diesen funktionen wird permanent ein „symbol“ „DATA“
verwendet welches vorher über #define auf einen bestimmten
port des port-data-registers definiert wurde.

Wie schaut denn konkret die Definition von DATA aus? Es ist doch vermutlich eine einfache Zahl? Wenn ja, spricht doch nichts dagegen, statt dem #define DATA eine Variable DATA zu verwenden. Diese übergibt man allen Funktionen als Parameter, die zuvor das definierte Symbol DATA verwendet haben. Den #define muss man dafür wegnehmen, sonst klappt es nicht.

Viele Grüße,
Sebastian

Wie schaut denn konkret die Definition von DATA aus?
Viele Grüße,
Sebastian

also DATA steht ja nur als Symbol für ein konkretes bit im Portdataregister… über DATA wird dann der Port high- (=1)oder low (=0) gesetzt… daher bringt mir eine Variable glaube ich nichts oder??

weil ich ja dann nicht mehr auf den Pin direkt zugreifen kann mit DATA

danke
grüße

also DATA steht ja nur als Symbol für ein konkretes bit im
Portdataregister… über DATA wird dann der Port high-
(=1)oder low (=0) gesetzt… daher bringt mir eine Variable
glaube ich nichts oder??

In deinem vorherigen Posting hast du aber geschrieben, dass DATA ein #define ist. #defines werden in C in der Regel „textuell“ ersetzt, d.h. wenn dein Code wie folgt aussieht…:

#define DATA 42
[...]
write(DATA, 17);

…dann wird beim Kompilieren als erster Schritt daraus:

write(42, 17);

Und an der Stelle, wo DATA bzw. 42 steht, könnte man nun auch jede andere passende Zahl schreiben.

Es könnte natürlich sein (wenn auch für mich jetzt nicht soo wahrscheinlich), dass der Mikrocontroller mit einer Art Pseudo-C programmiert wird und der #define noch mehr „Magie“ macht als eine textuelle Ersetzung. Ich kenne mich mit Mikrocontrollerprogrammierung nicht besonders aus. Aber ich würde es mal versuchen…

Grüße,
Sebastian

#define DATA 42

aaahh ok… also bei mir sieht das so aus:

#define DATA PDRM_PDM1

als Bsp… also ich ersetze einfach das Bit aus dem Port-data-register mit dem symbol DATA…

ich möchte aber nicht nur PDRM_PDM1 mit DATA setzen können sondern auch beispielsweise PRDM_PDM2, PRDM_PDM3, PRDM_PDM4 usw… die dann jeweils für den nächsten pin stehen… daher ist das define lästig da es DATA auf PDRM_PDM1 festlegt…

grüße

#define DATA 42

aaahh ok… also bei mir sieht das so aus:

#define DATA PDRM_PDM1

Welchen Datentyp hat denn PDRM_PDM1? Wenn es in Wirklichkeit eine Zahl ist (und das Symbol PDRM_PDM1 selbst auch nur per #define erzeugt ist), kann man es in eine Variable stecken.

Versuch doch einfach mal:

int data;
data = PDRM\_PDM1;
[...Code, der statt DATA data verwendet...]

Wenn das klappt, ist PDRM_PDM1 einfach nur ein int. Und alle deine selbstgeschriebenen Funktionen kriegen einen Zusatzparameter „int data“, in dem man je nach Lust und Laune PDRM_PDMx übergibt.

Sollte das mit der Variablen nicht klappen, gibt es wohl auch noch weniger schöne Möglichkeiten, das ganze durch Tricks auf #define-Ebene zu lösen. Aber das wäre unangenehmer.

Grüße,
Sebastian

Hallo Fragewurm,

als Bsp… also ich ersetze einfach das Bit aus dem
Port-data-register mit dem symbol DATA…

ich möchte aber nicht nur PDRM_PDM1 mit DATA setzen können
sondern auch beispielsweise PRDM_PDM2, PRDM_PDM3, PRDM_PDM4
usw… die dann jeweils für den nächsten pin stehen… daher
ist das define lästig da es DATA auf PDRM_PDM1 festlegt…

Jetzt müsste man wissen wie PDRM_PDMx deklariert ist.
Muss irgendwo in einer .H stehen.

Wenn ich dich richtig verstanden haben sind das einzelne Bits und genau in diesem Punkt weichen viele Compiler vom ANSI-Standard ab.

Du solltest angeben welchen Compiler du benutzt (Hersteller und Version).

MfG Peter(TOO)

ich möchte aber nicht nur PDRM_PDM1 mit DATA setzen können
sondern auch beispielsweise PRDM_PDM2, PRDM_PDM3, PRDM_PDM4
usw…

Hi,

du solltest eines bedenken: PDRM_PDM1 usw. sind Mnemonics, damit sollte man sich die Funktion besser merken können als mit Notationen wie 3.1 (Port 3 Bit 1, aber was schaltet das?). Das ist nicht immer so gelungen, aber jedenfalls ist mir TIMER_ENABLE lieber als eine Nummer. Der Befehl SETBIT TIMER1_ENABLE ist ohne Kommentar verständlich.

Wenn du diese Konstanten, egal ob numerisch oder als String, ersetzt mit einem allgemeinen Ausdruck wie DATA, so wird dein Programm weniger leserlich und damit fehleranfälliger.

Gruss Reinhard

Wenn du diese Konstanten, egal ob numerisch oder als String,
ersetzt mit einem allgemeinen Ausdruck wie DATA, so wird dein
Programm weniger leserlich und damit fehleranfälliger.

Also ehrlich gesagt finde ich „DATA“, wenn es die Funktion sinnvoll beschreibt, leserlicher als „PDRM_PDM1“…

Grüße,
Sebastian

also ich habe das jetzt mal so hingebastelt dass es funktioniert und möchte mich recht herzlich bei allen aktiven hier bedanken…

wichtig war für mich herauszufinden ob und vorallem wie ich mit einem zeiger auf einzelne bits in einem register zugreifen kann und das habe ich erfolgreich gemacht

nochmal vielen dank und großes lob für eure mühen auch wenn das problem meinerseits schwierig zu schildern war

vielleicht kann ich mich ja bei weiteren fragen wieder an euch wenden… weiter so

danke
sven geisenhof

ja das sehe ich auch so… ist übersichtlicher

nur hilft ein #define eben nicht bei meinem problem weil ich ja nicht nur auf ein spezielles regiesterbit zugreifen will sondern die registerbits zyklisch wechseln will um alle ports nach und nach zu betakten… daher habe ich das jetzt alles mit zeiger augezogen und es funzt

wichtig war für mich herauszufinden ob und vorallem wie ich
mit einem zeiger auf einzelne bits in einem register zugreifen
kann und das habe ich erfolgreich gemacht

Poste doch mal deine Lösung (also den interessanten Teil :wink:), bin neugierig geworden.

Viele Grüße,
Sebastian

while(1)
{
data_pin = 0x00000011;//PDRH_0 (Start)adresse des Registers
direct_ptr = 0x00000401;//DDRH_0 (Start)adresse des Registers
error=0;
HIGH=0x1;
DDRH=0xf;
PDRH=0xff;
s_connectionreset(data_pin,direct_ptr);
error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI,data_pin,direct_ptr); //measure humidity
error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP,data_pin,direct_ptr); //measure temperature

TEMPERATUR_f=(float)TEMPERATUR;
FEUCHTE_f=(float)FEUCHTE;

TEMPERATUR_f= TEMPERATUR_f * 0.01 -40.1;

RH_lin= FEUCHTE_f*0.0367 + FEUCHTE_f*FEUCHTE_f*(-0.0000016) - 2.0468;
RH_true= (TEMPERATUR_f-25)*(0.01+0.00008*FEUCHTE_f) + RH_lin;

if (TEMPERATUR_f0;i/=2) // shift bit for masking
{SCK=1; // clk for SENSI-BUS
wait(2);
if (*data_pin) val=(val | i); // read bit
SCK=0;
wait(2);
}
*direct_ptr=HIGH; // UMSCHALTEN AUF SENDEN!!!
wait(1);
if(ack) *data_pin=0; // in case of „ack==1“ pull down DATA-Line
.
.
.

so vielleicht kann man jetzt sehen warum ein #define ungeeignet war :smile:
da wo jetzt die zeiger das register zugreifen stand vorher ein „DATA“ welches über #define auf ein registerbit definiert war…

jetzt is alles dynamisch

übergeben werden die zeiger data_pin und direct_ptr … data_pin zeigt auf die port_data_regs und der direct_ptr auf die port_direction_reg

damit wechsle ich die sensoren an dem jumper zyklisch durch

is bis abstrakt zu erkennen aus den codeauszügen denke ich aber ok da muss mer durch =)