Zeiger für IO-Funktion?

OP #2231857
Lesenswert?

Wie kann mann über solch einen Ausdruck einen Output erzeugen?
1
#define  TFT_comm   (*(volatile unsigned char *)(0xC001))  //A8=0; RS =0
2
#define  TFT_Data   (*(volatile unsigned char *)(0xC100))  //A8=1; RS =1
3

4
void write_command(unsigned int index)
5
{
6
TFT_comm=index>>8;
7
TFT_comm=index;
8
}
9
void write_data(unsigned int dat)
10
{
11
TFT_Data=dat>>8;
12
TFT_Data=dat;
13
}

Ich bin mir nicht ganz im klaren darüber, was hier wohin zeigt. Kann 
mich vielleicht Jemand aufklären?

Es handelt sich hier umd die Datenkanäle eines Displays D0..D7 , die 
eigentlich an PortJ eines ATXMega128A1 hängen.
Gast #2231872
Lesenswert?

Mach doch mal den Preprozessor...
1
void write_command(unsigned int index)
2
{
3
(*(volatile unsigned char *)(0xC001)) = index>>8;
4
(*(volatile unsigned char *)(0xC001)) = index;
5
}
6
void write_data(unsigned int dat)
7
{
8
(*(volatile unsigned char *)(0xC100)) = dat>>8;
9
(*(volatile unsigned char *)(0xC100)) = dat;
10
}

Ist es jetzt klarer?
Gast #2231873
Lesenswert?

Hm. Wahrscheinlich nicht. Leider schreibst Du auch nicht, was Dir jetzt 
genau ein Problem macht.

Also:

0xC001   ist erstmal einfach irgendeine Zahl, zufällig genau die 
Portadresse

(volatile unsigned char *) ist ein cast in einen Zeiger

mit

(volatile unsigned char *) 0xC001   wird aus der Zahl also ein Zeiger.

Damit dieser Zeiger auf der Linken Seite einer Zuweisung auftauchen 
kann,
weil ja der Wert auf den dieser Zeiger zeigt verändert werden soll, muss 
der Zeiger dereferenziert werden. Also

(*(volatile unsigned char *)(0xC001))

Die Klammern sind nur das übliche Vorrang-Geklingel.

Jetzt ein wenig klarer?
OP #2231932
Lesenswert?

Danke, nur leider dachte ich mir das auch schon.
Mein Problem ist: wohin Zeigt dieser Zeiger?
Denn PORTJ ist laut Datenblatt 0x0700.
Ich kann auch in der einfachen Simulation nicht nachvollziehen wo diese 
Daten geschrieben werden... ich finde die in keinem Port und auch nicht 
im Speicher. Entweder schreibt der Simulator die nicht oder da passiert 
noch etwas anderes.
jedenfalls PORTJ verändert sich nicht und da erwarte ich es.
Ich werd nochmal schauen ob das irgendein Speicherbereich ist, der 
später von einer anderen Funktion ausgelesen wird ... das glaube ich 
aber fast nicht.
OP #2231937
Lesenswert?

scheinbar handelt es sich um eine adresse im SRAM oder?
oder wurder hier der Speicher des TFT's direkt addressiert?
1
void Initial_EBI(void)
2
{
3
PORTH.OUT=0xff;
4
PORTH.DIR=0xff;
5
PORTH.PIN4CTRL=PORT_OPC_PULLUP_gc;
6
PORTH.PIN5CTRL=PORT_OPC_PULLUP_gc;
7
PORTH.PIN6CTRL=PORT_OPC_PULLUP_gc;
8
PORTH.PIN7CTRL=PORT_OPC_PULLUP_gc;
9

10
PORTK.DIR=0xff;
11

12
EBI.CTRL=EBI_SDDATAW_4BIT_gc | EBI_LPCMODE_ALE1_gc | EBI_SRMODE_NOALE_gc | EBI_IFMODE_3PORT_gc;
13
        //Data multiplexed with Address byte 0
14
        //EBI enabled with 3-port interface
15
//-----------------------------------------
16
EBI.CS0.CTRLA=EBI_CS_ASPACE_32KB_gc | EBI_CS_MODE_LPC_gc; //64K SRAM  LPC
17
EBI.CS0.CTRLB=EBI_CS_SRWS_0CLK_gc;  //0 CLKPER2 cycles wait state
18
EBI.CS0.BASEADDR=(((uint32_t) 0x4000)>>8) & (0xFFFF<<(EBI_CS_ASPACE_32KB_gc>>2));  //0x4000 >>8;
19
//-----------------------------------------
20
EBI.CS1.CTRLA=EBI_CS_ASPACE_32KB_gc | EBI_CS_MODE_LPC_gc; //2"TFT LCD
21
EBI.CS1.CTRLB=EBI_CS_SRWS_0CLK_gc;  //0 CLKPER2 cycles wait state
22
EBI.CS1.BASEADDR=(((uint32_t) 0xC000)>>8) & (0xFFFF<<(EBI_CS_ASPACE_32KB_gc>>2));  //0x14000 >>8
23
//-----------------------------------------
24
EBI.CS2.CTRLA = EBI_CS_MODE_DISABLED_gc;
25
EBI.CS3.CTRLA = EBI_CS_MODE_DISABLED_gc;
26
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren