mikrocontroller.net

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


Autor: Sandra Schaefer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sandra Schaefer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke :)

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

schöne Ostern!

Autor: Kr2 Kr2 (kr2)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.