Forum: Mikrocontroller und Digitale Elektronik Display im 4-Bit-Modus ansteuern, Datenausgabe auf Port klappt nicht


von Christian W. (christian_w)


Lesenswert?

Hallo zusammen,

nach Tagen des tüftelns und probierens bin ich nun erst mal mit meinem 
Latein am Ende.

Ich habe ein HD44780-kompatibles Display an einen ATmega8 angeschlossen, 
genauergesagt sind die Datenleitungen D4, D5, D6, D7 mit den Pins PB0, 
PB1, PB2, PB3 verbunden. PB4 und PB5 sind anderweitig belegt, und an PB6 
und PB7 ist ein Quarz angeschlossen.

Das Problem ist nun, wie ich jetzt zweimal vier Bit an Port B0/1/2/3 
ausgebe, ohne PB4/5/6/7 zu verändern oder zu beeinflussen.

Ich spiele schon tagelang mit Bitmanipulation herum, aber wie ich es 
auch probiere, mit veschiedenen Masken, mit &, |, &~, |~, die Daten 
landen nicht so auf dem Port, wie sie sollen. Mal bleiben die Pins 
PB4/5/6/7 so wie sie sollen, aber es kommt nur Datenmüll auf den 
brauchbaren Leitungen an, oder umgekehrt.

Ich habe schon Papier und Bleistift bemüht, zahlreiche Seiten 
vollgekrizelt, habe auch schon eine Exceltabelle erstellt in der ich die 
verschiedenen Bitmanipulationsmöglichkeiten durchprobierte, aber es will 
mir einfach nicht gelingen.

Ich könnte ja auch blind Code kopieren, und das würde dann schon laufen, 
aber ich will es ja verstehen, darum geht es.

Muss man eventuell direkt auf die Portadressen des Atmega zugreifen? Ich 
habe im Tutorial etwas davon gelesen, dass von der Zahl 4 die 
Portadresse subtrahiert wird. Verstehe aber nicht, warum... Laut ATmega 
Datenblatt folgen ja die Portadressen direkt aufeinander ohne 
Zwischenraum.

Christian

von San L. (zwillingsfreunde)


Lesenswert?

So als kleiner Denkanstoss:

Schon mal dran gedacht die Bits in einer Variable herumzuschieben mit >> 
und << ?

von Max H. (hartl192)


Lesenswert?

Low Nibble
1
PORTB=(PORTB&0xF0)|(data&0x0F)
High Nibble
1
PORTB=(PORTB&0xF0)|(data>>4)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Christian W. schrieb:
> genauergesagt sind die Datenleitungen D4, D5, D6, D7 mit den Pins PB0,
> PB1, PB2, PB3 verbunden. PB4 und PB5 sind anderweitig belegt, und an PB6
> und PB7 ist ein Quarz angeschlossen.

Christian W. schrieb:
> Ich spiele schon tagelang mit Bitmanipulation herum, aber wie ich es
> auch probiere, mit veschiedenen Masken, mit &, |, &~, |~, die Daten
> landen nicht so auf dem Port, wie sie sollen. Mal bleiben die Pins
> PB4/5/6/7 so wie sie sollen, aber es kommt nur Datenmüll auf den
> brauchbaren Leitungen an, oder umgekehrt.

 Variable, z.B. PB_State definieren.
 PB_State = PortB;  // Nicht PINB !!
 PB_State &= 0xF0;
 // Jetzt LowNibble einblenden
 PB_State |= LowNibble;
 // Ausgeben
 PortB = PB_State;
 // Und noch einmal dasselbe nur mit HighNibble...

EDIT:
 Max hat es eleganter:
Max H. schrieb:
> PORTB=(PORTB&0xF0)|(data&0x0F)High
 Wahrscheinlich arbeitet er mit PINB...

von Bitflüsterer (Gast)


Lesenswert?

Ich glaube fast, es wäre besser, wenn Du das Ganze mal ein paar Tage 
beiseite legst.

Dann stellst Du hier konkrete Fragen bzgl. der Bitmanipulation.

von Christian W. (christian_w)


Angehängte Dateien:

Lesenswert?

Max H. schrieb:
> Low Nibble
>
1
PORTB=(PORTB&0xF0)|(data&0x0F)
> High Nibble
>
1
PORTB=(PORTB&0xF0)|(data>>4)

Und genau DAS war jetzt der entscheidende Tipp.
Ich hatte AND und OR immer nur einzeln, nie zusammen in einer Zeile 
verwendet.
Gleich mal in Excel getestet, verstanden, und für perfekt befunden.

Vielen Dank dafür!!!

Christian

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Christian W. schrieb:
> Und genau DAS war jetzt der entscheidende Tipp.
> Ich hatte AND und OR immer nur einzeln, nie zusammen in einer Zeile
> verwendet.

 Und genau DAS glaube ich nicht, sorry...

von Christian W. (christian_w)


Lesenswert?

Marc Vesely schrieb:
>  Und genau das glaube ich nicht, sorry...

WER hier WAS glaubt, ist mir auch vollkommen egal ;-)

Ich bedanke mich jedenfalls bei Max H. für die schnelle, einfache und 
kompetente Hilfe!

Christian

von Max H. (hartl192)


Lesenswert?

Marc Vesely schrieb:
> Und genau DAS glaube ich nicht, sorry...
Ok, das ändert aber nichts an der Tatsache.

Christian W. schrieb:
> Ich bedanke mich jedenfalls bei Max H. für die schnelle, einfache und
> kompetente Hilfe!
Kein Problem...

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Christian W. schrieb:
> WER hier WAS glaubt, ist mir auch vollkommen egal ;-)

 WER DIR glaubt, ist mir auch vollkommen egal, ich tue es nicht.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Max H. schrieb:
> Ok, das ändert aber nichts an der Tatsache.

 Nein, aber ich würde mal gerne wissen, was eine oder 2 Zeilen
 damit zu tun haben. Wenn er es tatsächlich geshafft hat, so was
 einfaches in 2 Zeilen zu versauen, dann sollte er lieber beim
 kochen bleiben.

 Eine Zeile
  PORTB=(PORTB&0xF0)|(data&0x0F)

 Zwei Zeilen
 PORTB = (PORTB&0xF0) // Daten ausgeblendet
 PORTB |= (data&0x0F)  // Daten 2 Cycles später am Port

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Christian W. schrieb:
> Ich könnte ja auch blind Code kopieren, und das würde dann schon laufen,

 Hast du ja auch mit Max's Code gemacht, deswegen läuft es auch.

Christian W. schrieb:
> aber ich will es ja verstehen, darum geht es.

 Wirst du wahrscheinlich niemals.

von Christian W. (christian_w)


Lesenswert?

Marc Vesely schrieb:
> Christian W. schrieb:
>> aber ich will es ja verstehen, darum geht es.
>
>  Wirst du wahrscheinlich niemals.

Danke für deine unbrauchbare und pessimistische Einschätzung.

Ablage "P" :-D

Christian :-)

von San L. (zwillingsfreunde)


Lesenswert?

Christian W. schrieb:
> Danke für deine unbrauchbare und pessimistische Einschätzung.
>
> Ablage "P" :-D
>
> Christian :-)

Hör nicht auf Leute wie Marc. ;)
Blos an dich glauben und weiter lernen. Auf die Meinung solcher Leute 
wie von ihm kannst du ruhig verzichten, sind sowiso meist die Leute die 
am Abend sowenig zutun haben, dass sie alles und jeden im Internet 
beleidigen, blos weil man ihnen dort nicht direkt eins in die Fr**** 
schlagen kann.

Schlussendlich besitzt er ja in keinster Weise die Kompetenz irgendwas 
über dich auszusagen, geschweige denn über deine Lernfähigkeit.

von Karl H. (kbuchegg)


Lesenswert?

Christian W. schrieb:

> Ich könnte ja auch blind Code kopieren, ...


Könntest du.
Du könntest aber auch den kopierten Code anstatt ihn einfach so zu 
verwenden tatsächlich studieren. Man kann viel lernen, wenn man anderer 
Leute Code studiert und sich ansieht, wie die gewisse Dinge machen.

Fremden Code zu verwenden ist an und für sich nichts verwerfliches. 
Verwerflich ist maximal die Art und Weise wie man den Fremdcode 
verwendet.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

San Lue schrieb:
> Schlussendlich besitzt er ja in keinster Weise die Kompetenz irgendwas
> über dich auszusagen, geschweige denn über deine Lernfähigkeit.

 Stimmt, ich entschuldige mich hiermit für meine Bemerkung.

San Lue schrieb:
> beleidigen, blos weil man ihnen dort nicht direkt eins in die Fr****
> schlagen kann.

 Ein tapferer Zwerg hinter seinem Riesenmonitor hat gesprochen...

Karl Heinz schrieb:
> Fremden Code zu verwenden ist an und für sich nichts verwerfliches.

 Selbstverständlich, warum das Rad immer neu erfinden ?
 Man kann nicht alles wissen und vor allem, man kann nicht alles am
 besten wissen und machen - wenn ich manchmal so genial einfache
 Codeschnipsel sehe, frage ich mich immer wieder wieso ich nicht
 darauf gekommen bin. Wenn ich aber so etwas übernehme, mache ich
 IMMER ein Vermerk wo ich das übernommen habe, egal ob das kommerziell
 genutzt wird oder nicht. Und wenn ich es übernehme, dann schreibe ich
 auch nicht, das es ein TIPP von xyz war.

von Christian W. (christian_w)


Lesenswert?

Sehr schön,

freut mich, dass das doch noch ein positives Ende findet.

Nicht umsonst habe ich ja den Excel-Screenshot hochgeladen. In Excel 
habe ich mit diversen Formeln und Verknüpfungen gespielt (AND, OR, ~, 
usw...) und da kann man dann wunderbar experimentieren und zusehen, wie 
die Bits umkippen.

Lektion verstanden und angewendet ;-)

Danke

Christian

von Max H. (hartl192)


Lesenswert?

Marc Vesely schrieb:
> Ein tapferer Zwerg hinter seinem Riesenmonitor hat gesprochen...
Ich glaube du besitzst auch nicht die Kompetenz etwas über seine Größe 
und der seines Bildschirms zu sagen.
Korrigier mich wenn ich falsch liege...

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Max H. schrieb:
> Ich glaube du besitzst auch nicht die Kompetenz etwas über seine Größe
> und der seines Bildschirms zu sagen.

 Leute die hinterm Bildschirm Sprüche wie:
 'beleidigen, blos weil man ihnen dort nicht direkt eins in die Fr****
 schlagen kann.' von sich geben, müssen irgendein Komplex haben.
 Entweder ist er zu klein geraten, oder sein Werkzeug - eins von Beiden.
 Und für Zwerge ist jeder Monitor riesengroß, auch wenn es ein 17'' ist.

 P.S.
 Um mir in die Fresse zu hauen, fehlt ihm
  1. Die Mut
  2. Stuhl oder Leiter ( bin 1.97 )

von Max H. (hartl192)


Lesenswert?

Marc Vesely schrieb:
> 1. Die Mut
Was soll er mit einer ägyptischen Göttin?
> 2. Stuhl oder Leiter ( bin 1.97 )
Wieso? Weißt du wie groß er ist?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Max H. schrieb:
>> 1. Die Mut

 Deutsch ist nicht meine Muttersprache, ich habe dort nur mein
 Magisterstudium gemacht, also kann ich mal einen Artikel falsch
 benutzen.
"Jedes Substantiv hat sein grammatisches Geschlecht, und die Verteilung 
ist ohne Sinn und Methode. Man muss daher bei jedem Substantiv das 
Geschlecht extra mitlernen. Eine andere Methode gibt es nicht. Um das 
fertigzubringen, braucht man ein Gedächtnis wie ein Terminkalender."

Aus: Mark Twain: Die schreckliche deutsch Sprache

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.