Guten Abend,
Ich hab ein LCD welches vom Umfang her mit seinen Datenleitungen einfach
nicht anderst angeschlossen werden kann als gespiegelt.
Da ich die Routinen und den Rest schon fertig habe, muss ich ja aber das
Byte, also die 8 Bits immer Spiegeln, und das vor jeder Datenübertragun!
Ich hab da mal was von LookUp-Tables gelesen, da ich den ATmega2561 auf
meiner Platine habe geht es mir auch nicht um den Speicherverbrauch,
also denke ich wird das das Sinnvollste (wenn auch nicht die schönste)
Methode sein meine 8 Bits immer zu spiegeln.
Leider habe ich da ein kleines Verständnisproblem bei der Ausführung
meines Plans. Wie muss ich das Table und meine Funktion schreiben, dass
ich nacher ein gespiegeltes Byte hab?
Hoffe es ist alles verständlich und ihr könnt mir helfen!
Dennis
Ein LCD ist nichts zeitkritisches.
Im Gegenteil, wenn man zu schnell ausgibt, wirds unleserlich.
Daher kann man die Pins völlig wahlfrei zuordnen und braucht auch nicht
alle 8 Bits und muß auch nicht das Busy-Bit lesen.
Hier ein einfacher Code:
http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip
Peter
Also ich will es in C programmieren, da ich da schon einige Erfahrungen
gesammelt hab.
Kann ich dann wenn ich die Tabelle schreiben die Zahlen einfach so in
dezimaler Form eintragen? weil ich hab das ma lirgendwo gesehn, dass man
das in Binärer Form macht. weil ich will eigentlich auch einen Binären
Wert an meine Funktionen für das Display übergeben, der dann vor der
Übergabe gespiegelt werden soll.
Was peda meinte ist mir jetzt nicht ganz klar...
Ich kann die doch nicht wahllos zuordnen, das wäre ja voll der Aufwand!
Ich hab die jetzt einfachnur gespiegelt angeschlossen, d.h.:
AVR PC7 --> DB0 LCD
AVR PC6 --> DB1 LCD
.
.
.
usw...
Also ich brauch die dann nur einmal spiegeln bevor ich die verwende.
Wenn ich dann eine Binäre Zahl an die Tabelle übergebe bzw die Funktion
und in der Tabelle Dezimale Zahlen stehen funktioniert das dann? Wäre
natürlich vieeel einfacher!
Besten Dank schonmal Dennis
Klar kannst du die Werte Bitweise schreiben. Aber das ist mehr
aufwandt und unnötig. Es ist nur eine andere Art der Darstellung.
http://www.mikrocontroller.net/articles/Zahlensysteme
Du hast 1 Byte => 8 Bit Wertebereich 0 - 255 -> 256 Werte
-->> Tabelle mit 256 Einträgen.
avr
Okay, dann mach ich das so, jo das war mir klar dass das nur ne andere
Darstellung ist, aber ob der Kompiler da mitspielt...
Also dann mach ich jetzt gschwind mal die Tabelle und die Funktion dazu.
Die muss dann von 255 runtergezählt werden oder? also nicht 0,1,2..
Ich fang dann mal an ;-)
Sind die 8 Bits an einem Port? Dann kannst du diese mit einem & befehl
invertieren, z.B. PORTC = (255&x) wobei x der Ursprungswert ist.
Wenn du immer einzelne Bits invertieren musst, da sich nicht alles an
einem Port befindet, kannst du das auch mit einem Exor lösen y ^= x
Ich hoffe ich habe dein Problem richtig verstanden.
Sry das mitem & funktioniert nicht, du musst es abzählen (255-x)
Das hab ich jetzt grad gar nicht verstanden!
Aaaalso Ich hab ein Dislay und das braucht 8 Datenleitungen, da ich ja
nicht aus Dummhausen komm hab ich mir gedacht alle an einen Port zu
hängen, nur halt gespiegelt (siehe oben!).
Die Funktionen für das ganze Display sind schon fertig! Nur wenn ich da
jetzt das versuchen will, ist ja das Byte immer falsch rum angelegt kann
man sagen! Also muss ich das zuerst Spiegeln, sodass der Port ein
Gespiegelts Byte anlegt, aber auf dem Display das dann wieder stimmt!
Sagte ja es ging nicht anderst, hab schon einiges probiert.
Danke schonmal.
P.S.: Bin schon bei 127 in meiner Tabelle!
Hi
>Die muss dann von 255 runtergezählt werden oder? also nicht 0,1,2..
Nein. deine Tabelle muss so aussehen:
Tabelle[0]: 0b00000000
Tabelle[1]: 0b10000000
Tabelle[2]: 0b01000000
Tabelle[3]: 0b11000000
Tabelle[4]: 0b00100000
Tabelle[5]: 0b10100000
Tabelle[6]: 0b01100000
......
Tabelle[255]: 0b11111111
MfG Spess
Bitteschöön, so wie ich das jetzt verstanden hab, jeder der das Ding mal
braucht darf sichs nehemn, aber das glaub ich nicht ganz dass die liste
wie die von Spess aussehen muss!
Ich glaub ich probier das glich mal aus an meinem Testboard...
Natürlich hat spess53 recht.
Die Umkehrtabelle war nur ein Beispiel wie die Tabelle
angelegt wird.
Ich dachte, er wird sowieso die Umkehrfunktion verwenden.
avr
HEY NEIN das hat ne halbe Ewigkeit gedauert, aber warum hab ich das dann
schonmal so gesehn?
Aber dann brauch ich doch mehr als NUR 256 Bytes oder?
Wie sieht dann die Umwandlung via´ Spess aus? Kann mir das nicht ganz
vorstelen!
Hoff ich kann trozdem irgendwie das heute noch schaffen ;-)
EDIT: Hb mir grad das mal mit den Gedanken ein uC angeguckt, und
festgestellt, dass mein "Spiegelwert" ja eigentlich immer genau die
Dezimale Zahl ergibt, die ich noch addieren muss, um auf 255 zu kommen!
-.-
MIST!
Komm aber auf die Funktion trozdem noch nicht wie Spess meint!
Hi
>Aber dann brauch ich doch mehr als NUR 256 Bytes oder?
Nein. Du brauchst 256Byte.
>Wie sieht dann die Umwandlung via´ Spess aus? Kann mir das nicht ganz>vorstelen!
Ganz einfach
Bit7 enthält Bit0
Bit6 enthält Bit1
Bit5 enthält Bit2
Bit4 enthält Bit3
Bit3 enthält Bit4
Bit2 enthält Bit5
Bit1 enthält Bit6
Bit0 enthält Bit7
Z.B.: aus 0b01101010 wird 0b01010110
MfG Spess
Hi
Oder mal als 'Pseudocode':
if a & 1<<0 then b |= 1<<7
if a & 1<<1 then b |= 1<<6
if a & 1<<2 then b |= 1<<5
if a & 1<<3 then b |= 1<<4
if a & 1<<4 then b |= 1<<3
if a & 1<<5 then b |= 1<<2
if a & 1<<6 then b |= 1<<1
if a & 1<<7 then b |= 1<<0
MfG Spess
Danke an euch!
Hab grad mal mein Testboard rausgesucht, und einen Testmode
implementiert!
Jetzt funktioniert das ganze mit der Umwndlung!
Dann kann ich ja jetzt wieder an die "Normale" Arbeit zurückkommen! ;)
Danke für eure Bemühung Dennis
Dennis G. schrieb:
> Ich kann die doch nicht wahllos zuordnen, das wäre ja voll der Aufwand!
Dann hast Du Dir den Code nichtmal angesehen, der ist überhaupt nicht
aufwendig.
Das wird ganz effizient in Bitbefehle compiliert.
Peter
Hehe, hier geht es mal wieder ein wenig drunter und drüber.
1.
Die Tabelle per Hand zu tippen ist Irrsinn! Dafür gibt es Excel, die
Vervollständigen Funktion und Strg+C, Strg+V (Einfach in Excel die
Zellen markieren und in die .c Datei einfügen. Aus leeren Zellen werden
nur Tabs).
Alternativ ein kleines C Programm schreiben.
2.
Die Methode 255-x wie oben geschrieben ist natürlich auch Quatsch. Das
invertiert zwar, aber nach Invertierung war ja nicht gefragt.
Invertieren macht man außerdem eher mit der Tilde (A = ~B;). Das ist der
"richtigere" Operator, da er binär ist.
3.
Das Zugreifen auf die Lookuptable dauert wahrscheinlich länger als der
von "avr" vorgeschlagene Code. LUT lohnen sich eigentlich nur für
komplexe Rechnungen die man dann halt im Voraus (in Excel wie gesagt zum
Beispiel) ausführen lässt.
Aha cool, dann muss ich glaub die nächste Zeit mal etwas mehr in Excel
machen, ich nutze das Programm NUR für die erstellung vn Diagrammen,
aber ich weiß dass das Programm VIEEEL mehr kann!
Gute Nacht
Dennis
Hi
>Alternativ ein kleines C Programm schreiben.
Geht z.B. mit Delphi genauso gut. Siehe oben. Mal übern Tellerrand
schauen.
>Das Zugreifen auf die Lookuptable dauert wahrscheinlich länger als der>von "avr" vorgeschlagene Code.
W.z.b.w. (Was zu bezweifeln wäre). Zumindest in Assembler. Welchen Code
meinst du?
MfG Spess
LUT ist schneller, das schieben durch das
C-Bit von travelrec in Assembler wohl das beste.
Aber C versteht das Schieben nicht und daher sieht
meine umkehrfunktion in C eleganter aus als Scleifen.
avr
spess53 schrieb:
>>Das Zugreifen auf die Lookuptable dauert wahrscheinlich länger als der>>von "avr" vorgeschlagene Code.>> W.z.b.w. (Was zu bezweifeln wäre). Zumindest in Assembler. Welchen Code> meinst du?
Ok stimmt. Habe es ausprobiert. Viel schneller gehts aber auch nicht :-)