Forum: Mikrocontroller und Digitale Elektronik 9-bit SPI mit ATMega?


von Norbert S. (norberts)


Lesenswert?

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

von Stefan S. (sschultewolter)


Lesenswert?

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.

von Norbert S. (norberts)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

Mach das nicht so kompliziert. Sende das erste Bit per Hand und die 
restlichen 8 per SPI-Register. Oder umgekehrt.

mfg.

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


Lesenswert?

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.

von Norbert S. (norberts)


Lesenswert?

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

von Ralph (Gast)


Lesenswert?

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.

von Norbert S. (norberts)


Lesenswert?

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

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


Lesenswert?

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
von rentner im bastelkeller (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.