Forum: Compiler & IDEs Verständnissfrage am beispeil des LCD Scriptes aus dem Tut.orial


von Sandra Schaefer (Gast)


Lesenswert?

Guten Abend.
würde mich freuen wenn mich jemad Aufklären kann was dort Passiert.

Zitat aus dem LCD-Tutorial-Beispiel:

void lcd_data(unsigned char temp1)
{
    [...]

1   LCD_PORT |= (1<<LCD_RS);        // RS auf 1 setzen

2   temp1 = temp1 >> 4;
3   temp1 = temp1 & 0x0F;
4   LCD_PORT &= 0xF0;
5   LCD_PORT |= temp1;               // setzen
    lcd_enable();

    [...]


Was Passiert dort?
Zeile 1:
PD4 wird auf 1 gesetzt... Also steht in portd [0 0 0 1 0 0 0 0]
Bedeutet der Interne Pullup wird aktivirt?

Zeile 2:
Der Inhalt von templ wird um 4 Bits rechts geschoben.

Zeile 3
Bit 7 6 5 4 wird auf 0 gesetzt Bit 3 2 1 0 bleiben wie sie sind.

Zeile 4:
Portd ist jetzt [1 1 1 1 0 0 0 0]

Zeile 5:
Bit 3 2 1 0 von Portd wird auf das gesetzt was noch in der templ steht. 
die 1-en von Zeile 4 bleiben.

Dann werden PD 0 - 4 an das LCD übertragen.

PD 5 ist LCD-Enable. Das habe ich aber dann doch schon gesetzt. Oder?
Warum wird das nochmals aufgerufen? Muss das Enable einfach nochmal 
Toggeln?

Warum setzt der Autor die unbenutzen Pins auch auif 1?


Würd mich sehr freuen wenn mir das jmd. ein bischen nahe bringen kann...

Danke und schöne Ostern...

von Karl H. (kbuchegg)


Lesenswert?

Sandra Schaefer wrote:
> Guten Abend.
> würde mich freuen wenn mich jemad Aufklären kann was dort Passiert.
>
> Zitat aus dem LCD-Tutorial-Beispiel:
>
> void lcd_data(unsigned char temp1)
> {
>     [...]
>
> 1   LCD_PORT |= (1<<LCD_RS);        // RS auf 1 setzen
>
> 2   temp1 = temp1 >> 4;
> 3   temp1 = temp1 & 0x0F;
> 4   LCD_PORT &= 0xF0;
> 5   LCD_PORT |= temp1;               // setzen
>     lcd_enable();
>
>     [...]
>
>
> Was Passiert dort?
> Zeile 1:
> PD4 wird auf 1 gesetzt... Also steht in portd [0 0 0 1 0 0 0 0]
> Bedeutet der Interne Pullup wird aktivirt?

Kann man so nicht sagen.
Dazu muss man erst mal nachschauen, ob dieser Pin über das zugehörige 
DDR Register auf Eingang oder auf Ausgang gesetzt ist.

Wenn Ausgang: Der Ausgangspin wird auf 1 gesetzt
Wenn Eingang: Der Pullup wird eingeschaltet.

Also sieh nach, wie das entsprechende Bit im DDR Register des Ports ist 
:-)

>
> Zeile 2:
> Der Inhalt von templ wird um 4 Bits rechts geschoben.

Ja.

>
> Zeile 3
> Bit 7 6 5 4 wird auf 0 gesetzt Bit 3 2 1 0 bleiben wie sie sind.
>

Ja

> Zeile 4:
> Portd ist jetzt [1 1 1 1 0 0 0 0]

Die 0-en sind in Ordnung. Aber die 1-en nicht. Schreibs besser als

 Portd ist jetzt [x x x x 0 0 0 0]

Wobei x bedeutet: 0 oder 1, was auch immer der Portpin auch vorher schon 
hatte.

Mit & kann man Bits gezielt auf 0 setzten. Über die restlichen Bits sagt 
das nichts aus. Die bleiben so wie sie sind.

>
> Zeile 5:
> Bit 3 2 1 0 von Portd wird auf das gesetzt was noch in der templ steht.
> die 1-en von Zeile 4 bleiben.

Kann man so lassen. die 1-en von Zeile 4 sollte besser "die x-en von 
Zeie 4 lauten. Aber entscheidend ist: die untersten 4 Bit sind auf jeden 
Fall 0 und durch das verodern werden gegebenenfalls einige Bits von 
temp1 auf 1 gezogen.

Mittels | kann man gezielt einzelne Bits auf 1 setzen. In einem gewissen 
Sinne also die Umkehrung von &
&  -> Bits auf 0 setzen
|  -> Bits auf 1 setzen

> PD 5 ist LCD-Enable. Das habe ich aber dann doch schon gesetzt. Oder?

Wo?

> Warum setzt der Autor die unbenutzen Pins auch auif 1?

Tut er doch gar nicht.

von Sandra Schaefer (Gast)


Lesenswert?

Danke :)

Nein wenn man das so wie du betrachtet tut er es wirklich nicht :)

schöne Ostern!

von Kr2 K. (kr2)


Lesenswert?

>Warum setzt der Autor die unbenutzten Pins auch auf 1?

> Zeile 4:
> Portd ist jetzt [1 1 1 1 0 0 0 0]

bin mir zwar nicht sicher aber ich glaub nicht das das stimmt da steht 
ja
LCD_PORT &= 0xF0;
was soviel heißt wie
LCD_PORT = LCD_PORT & 0xF0;
oder?

>PD 5 ist LCD-Enable. Das habe ich aber dann doch schon gesetzt. Oder?
>Warum wird das nochmals aufgerufen? Muss das Enable einfach nochmal
>Toggeln?

wenn du dier die enable Funktion ansiehst siehst du das da ein high 
impusl geschickt wird. das muss man machen wenn die Daten stabile am 
Eingang des LCD kontroleres anliegen. dann übernimmt der die Daten.

>Bedeutet der Interne Pullup wird aktivirt?
hmm bin mir auch da wieder nich so sicher aber ich denk mal schon. es 
liegt dann auf jedenfalls ein high Pegel auf dem pin.

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.