9-bit SPI mit ATMega?

#3884494
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
#3884513
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
(Firma: Vescomp) #3884543
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.
Gast #3884618
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.
#3884941
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
(Firma: Vescomp) #3885512
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.
Gast #3885529
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren