Forum: Compiler & IDEs Zeiger für IO-Funktion?


von S. T. (cmdrkeen)


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.

von Blödmann (Gast)


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?

von Blödmann (Gast)


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?

von S. T. (cmdrkeen)


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.

von S. T. (cmdrkeen)


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
}

von S. T. (cmdrkeen)


Lesenswert?

OK jetzt weiß ich schon eher wonach ich suchen muss:

>>The EBI can interface external SRAM, SDRAM, and/or peripherals such as LCD
>> displays and other memory mapped devices.

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.