PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitweise und und oder



Trexis5
30.09.2010, 13:50
Hi,

könnte mir bitte einer sagen was dort gemacht wird?




#define SED1335_A0 (1 << PD4)
#define SED1335_WR (1 << PD5)
#define SED1335_RD (1 << PD6)
#define SED1335_CS (1 << PD3)
#define SED1335_RES (1 << PD2)



SED1335_CONTROL_PORT &= ~(SED1335_CS | SED1335_A0 | SED1335_WR);
asm("nop");
asm("nop");
SED1335_CONTROL_PORT |= (SED1335_CS | SED1335_A0 | SED1335_WR);



Danke.

sast
30.09.2010, 14:31
SED1335_CONTROL_PORT &= ~(SED1335_CS | SED1335_A0 | SED1335_WR);
hier werden SED1335_CS, SED1335_A0, SED1335_WR auf Low gesetzt, d.h. 0
und bei
SED1335_CONTROL_PORT |= (SED1335_CS | SED1335_A0 | SED1335_WR);
werden sie wieder auf High also 1 gesetzt

in Bits
XXXXXXXX & 11000111 = XX000XXX
...
XX000XXX | 00111000 = XX111XXX

sast

Trexis5
30.09.2010, 15:25
Hi,

eigentlich fehlt da noch was:
Erst wird das WriteCommand angesprochen, danach das WriteData.
Stimmt dann das von vorher noch?
Danke.



#define SED1335_DATA_PORT PORTA
#define SED1335_DATA_DIR DDRA
#define SED1335_DATA_PIN PINA

#define SED1335_CONTROL_PORT PORTD
#define SED1335_CONTROL_DIR DDRD
#define SED1335_CONTROL_PIN PIND

#define SED1335_A0 (1 << PD4)
#define SED1335_WR (1 << PD5)
#define SED1335_RD (1 << PD6)
#define SED1335_CS (1 << PD3)
#define SED1335_RES (1 << PD2)
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
void GLCD_InitializePorts(void)
{
SED1335_DATA_DIR = 0xFF;
SED1335_CONTROL_PORT |= (SED1335_A0 | SED1335_WR | SED1335_RD | SED1335_CS | SED1335_RES);
SED1335_CONTROL_DIR |= (SED1335_A0 | SED1335_WR | SED1335_RD | SED1335_CS | SED1335_RES);
}
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
void GLCD_WriteData(unsigned char dataToWrite)
{
SED1335_DATA_PORT = dataToWrite;
SED1335_DATA_DIR = 0xFF;
SED1335_CONTROL_PORT &= ~(SED1335_CS | SED1335_A0 | SED1335_WR);
asm("nop");
asm("nop");
SED1335_CONTROL_PORT |= (SED1335_CS | SED1335_A0 | SED1335_WR);
}
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
void GLCD_WriteCommand(unsigned char commandToWrite)
{
SED1335_DATA_PORT = commandToWrite;
SED1335_DATA_DIR = 0xFF;
SED1335_CONTROL_PORT &= ~(SED1335_CS |SED1335_WR);
asm("nop");
asm("nop");

SED1335_CONTROL_PORT |= (SED1335_CS | SED1335_WR);
}
//-------------------------------------------------------------------------------------------------

sast
30.09.2010, 16:06
Das Wissen, das ich versucht habe zu vermitteln, darfst du gern auch auf die anderen Programmzeilen sinngemäß anwenden.

Zum Verständnis der Ansteuerung des GLCD wirst du die beste Hilfe sicher im dazugehörigen Datenblatt finden.

Die Bezeichner wie zB _CS, _RD, _WR usw sind doch recht aussagekräftig. Finde ich zumindestens.

sast

Trexis5
01.10.2010, 15:22
Hi,

ja das ist mir klar.
Ich habe meinen Bascom Code schon Teils in Assembler umgebaut.
Als Refenz habe ich nur den C Code und ich bin mir nicht sicher was da gemacht wird, da ich mich mit C nicht auskenne. Habe auch schon einiges durchsucht im Netzt, aber nicht ganz das Richtige gefunden.

Nach meinem Wissen sollte bei WriteData
SED1335_CS =0
SED1335_A0 = 0
SED1335_WR = 0
sein
und dann nach den NOP
SED1335_WR = 1
SED1335_A0 = 0
SED1335_CS = 0 (kann auch 1 sein - egal)

bei WriteCommand
SED1335_CS =0 (wenn vorher 1 war)
SED1335_A0 = 1
SED1335_WR = 0
sein
und dann nach den NOP
SED1335_WR = 1
SED1335_A0 = 0
SED1335_CS = 0 (kann auch 1 sein - egal)

Das funktioniert so, aber es ist anscheinend hier anders.

Also:
SED1335_WR muss 0 werden, dann werden die Daten(Data) in das Display geschrieben.
Wenn SED1335_A0 1 wird, dann wird das Command geschrieben wenn SED1335_WR = 0 wird.

sast
01.10.2010, 16:22
So jetzt hast du es geschafft, dass ich mir doch mal die Infos zum 1335 etwas genauer ansehe. Command- und Datawrite unterscheiden sich nur im A0 Bit. Dh ist A0 High dann ist es ein Kommando ansonsten ein Datum.

Es ist nicht egal ob CS nun 1 oder 0 ist.

Nach dem Schreiben eines Datums ist es dafür aber erst einmal egal ob nun A0 auf 1 oder 0 steht. Das interessiert erst wieder bei der nächsten Aktion. Ist das ein Kommando dann kann das A0 auf 1 bleiben und wird somit gar nicht angefasst. Ist es ein Datawrite dann wird A0 auf 0 gesetzt. Nachdem Schreiben wird das A0 wieder auf 1 gesetzt und muss somit beim nächsten Kommando nicht erst gesetzt werden. Ob man das nun so macht oder andersherum ist vermutlich Geschmackssache.

Auf jeden Fall bleibt die Abarbeitung in Bezug auf CS und WR immer gleich. Nur A0 muss halt bei einem Kommando auf High sein und bei Daten auf Low.

sast