Hi, ich hab mir dann auch mal ein Nokia 6100 Display zum rumspielen geholt, war einfach zu günstig. Erstes Argument war, daß Bascom das wohl irgendwie unterstützt, damit ich damit überhaupt schonmal was sehen kann. Das ist aber eher mager und schlecht dokumentiert und ich möchte mir meinen eigenen Treiber bauen, den es soweit ich weiß für Bascom sonst so noch nicht gibt. Dafür gibt es dieses famose Tut: http://www.sparkfun.com/tutorial/Nokia%206100%20LCD%20Display%20Driver.pdf Sieht alles sehr machbar aus. Mit Bascom kann ich hoffentlich zumindest herausfinden, welchen Controller ich denn da drin hab. Alle Beschreibungen die ich finden kann passen nicht, orange Platine aber keine Lötpunkte (widerspricht sich), kein Sticker - also ausprobieren. Falls das einer kaufen möchte: Unbedingt den Stecker mitkaufen (Watteroth) und Adapterplatine machen. Mit fliegenden Drähten an der Buchse vom Display wird das nix. Ich bin eigentlich immer für jeden Schweinkram zu haben aber das ist echt zu heftig. Nun zu meiner eigentlichen Frage: Das Display wird mit SPI angesteuert, 9bit-SPI. Ok, exotisch mit 9bit aber das Datenblatt wird mir schon sagen wie. Tja, da hatte ich Uart im Kopf aber bei SPI scheint es das im ATMega324 gar nicht zu geben! Nur 8bit und sonst nix. Auch bei der USART im SPI-Mode ist nur von 8bit die Rede. Hab ich im Datenblatt was übersehen? Gibt es da einen Trick? Kann irgendein anderer ATMega 9bit SPI? Oder muß ich mir wirklich ne Soft-SPI basteln? Gruß, Norbert
Hallo Norbert, mir ist nicht bekannt, dass dies so einfach möglich ist. Was geschieht, wenn du 16 Bit schickst, jedoch nach dem 9 Bit Chip Select fallen lässt? Alternativ mach es einfach in Software. Dürfte das einfachste sein. Kann dir mit Bascom aber nicht weiterhelfen.
Stefan S. schrieb: > Was geschieht, > wenn du 16 Bit schickst, jedoch nach dem 9 Bit Chip Select fallen lässt? Hi, ja, das müsste gehen aber so ganz banal ist das ja auch nicht. Da muß ich ja dann auch aufpassen, wann genau ich CS wegnehme. Ok, könnte man per Timer-Int machen aber dann kann ich das in der Tat auch komplett zu Fuß machen. Aber das wäre ein Ansatz. Alternativ erst nach dem 7. bit vom ersten Byte CS setzen. Ist aber beides nicht mehr so schön wie Hardware SPI. Gruß, Norbert
Mach das nicht so kompliziert. Sende das erste Bit per Hand und die restlichen 8 per SPI-Register. Oder umgekehrt. mfg.
Norbert S. schrieb: > Hab ich im Datenblatt was übersehen? Gibt es da einen Trick? > Kann irgendein anderer ATMega 9bit SPI? > Oder muß ich mir wirklich ne Soft-SPI basteln? Also, soweit ich mich erinnere (kann sein, dass es nicht stimmt), dient das 9-te bit nur zur Unterscheidung, ob Data oder Command. Beim SPI ist MSB zuerst, eine Routine zum Ausgeben könnte so aussehen:
1 | Const nCmnd = 0 |
2 | Const nData = 1 |
3 | |
4 | Sub NokiaOut(nWert As Byte, DspArt As Byte) |
5 | Reset CsLine |
6 | Reset SpiClk |
7 | If DspArt = nData Then |
8 | Set SpiData |
9 | Else
|
10 | Reset SpiData |
11 | End If |
12 | Set SpiClk |
13 | '* Jetzt wird nWert ganz normal über Hardware-SPI ausgegeben |
14 | ...
|
15 | ...
|
16 | |
17 | Set CsLine '* Oder in SPI-ISR, wenn mit Interrupt gearbeitet wird |
18 | End Sub |
Kenne mich mit Basic nicht (mehr) gut aus, aber im Prinzip sollte das so gehen. Muss noch irgendwo diesen ganzen Kram in Assembler haben, werd mal nachschauen.
Hi, jo, das werde ich wohl so machen. Das erste Bit ist das Data/Command bit. Das per Hand raus und dann Hardware SPI, das gefällt mir. Danke! Gruß, Norbert
Viel zu kompliziert. SPI ist nichts anderes als ein getaketes Schieberegister. Nimm eine 16 Bitvariable. Pack deine 9 Bit in die letzen 9 Bits rein. Dann schick über die SPI alle 16 Bit raus. Damit stehen automatisch die gewollten 9 Bit im Empfangsregister von Display. Die ersten 7 bis sind dann einfach auf der "anderen"Seite des Registers ins Nirvana geschoben.
Hi, das wäre natürlich noch schöner. Wenn ich mir das Diagramm der oben verlinkte Anleitung auf S.4 ansehe, habe ich Zweifel, daß das funktionieren wird. Allerdings scheint der James P. Lynch der das Tut geschrieben hat so zu machen oder verstehe ich den C-Code falsch? Ich kann C leider nur rudimentär lesen. [c] unsigned int command; // PCF8833 command byte while ((pSPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0); // wait for the previous transfer to complete command = (command & (~0x0100)); // clear bit 8 - indicates a "command" byte pSPI->SPI_TDR = command; // send the command unsigned int data; // PCF8833 data byte while ((pSPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0); // wait for the previous transfer to complete data = (data | 0x0100); // set bit 8 - indicates a "data" byte pSPI->SPI_TDR = data; // send the command [c] Unsigned Int sind doch 16 Bit oder? Die Zeilen command = ... und data = ... machen nichts anderes als das bit 8 (also das LSB des oberen Byte des Word) zu setzen oder eben nicht? Ist das korrekt? Vielleicht mag mir da jemand auf die Sprünge helfen. Das würde bedeuten: Ein Byte raus in dem nur das LSB Command oder Data bestimmt und dann das eigentliche Byte. Dann CS wieder aus. Ist zwar reichlich Overhead aber dafür könnte man das alles Int-gesteuert mit Hardware-SPI machen. Und bevor hier einer wegen Bascom meckert: Ich will das ja gerade direkt mit der Hardware SPI machen. Direkt über die Register, so, wie man es auch in C machen würde. Nur, daß das Drumherum lesbar ist ;-) Wie ich das dann genau in Bascom umsetze ist nicht das Problem, mir geht es nur um SPI und diese 9-Bit Problematik. In C hätte man ja genau das gleiche Problem mit AVR. Gruß, Norbert
Ralph schrieb: > Viel zu kompliziert. > Was ist viel zu kompliziert ? Das er mit einem Sub Command/Data senden kann, ohne zu jonglieren ? > SPI ist nichts anderes als ein getaketes Schieberegister. > Stimmt, und ? > Nimm eine 16 Bitvariable. > Pack deine 9 Bit in die letzen 9 Bits rein. > Dann schick über die SPI alle 16 Bit raus. > Damit stehen automatisch die gewollten 9 Bit im Empfangsregister von > Display. > Die ersten 7 bis sind dann einfach auf der "anderen"Seite des Registers > ins Nirvana geschoben. Nein, nimm besser eine 32bit Variable. Die ersten 2 Byte werden ins Nirvana geschoben, da kannst du dann Datum und Uhrzeit reinpacken. Werden zwar nirgendwo gebraucht, aber was solls, es geht halt uber Hardware SPI. Beim 3-ten Byte wird nur ein bit gebraucht, da kannst du in die restlichen 7 bits Temperatur reinpacken. Werden auch nirgendwo gebraucht, aber was solls, es geht halt uber Hardware SPI... EDIT: Ich glaube, ich habe damals meinen Display mit 8MHz gefahren, ohne irgendwelche Probleme. Aber ist halt viel zu kompliziert und langsam. Eine 16bit Variable mit 0x0100 ORen und dann 16bit raussenden mit 2 ISR Aufrüfen ist natürlich viel schneller und vor allem einfacher und logischer.
:
Bearbeitet durch User
Norbert S. schrieb: > Hi, > > Das Display wird mit SPI angesteuert, 9bit-SPI. Ich hatte das auch neulich an einem Modul, das wollte auch erst ein extra Startbit vor jedem SPI-Kommando, führende Nullen werden aber ignoriert, deshalb kann man eine dezimale 1 einfach per SPI vorher rüberjagen und muss nicht extra vorher nur ein Bit 'von Hand' senden. Wenn das nicht geht musst du eben ein einzelnes Bit 'von Hand' rüberjagen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.