Hi Leute,
Ich hab hier ein Problem, wo ich langsam nicht mehr weiter weiß. Mein
Ziel ist es, mit einem Drehencoder (über Interrupt angebunden, in
sämtlichen anderen Projekten benutzt => zu 99,8% keine Fehlerquelle)
8-Bit-Zahlen in einem Array zu speichern und das Array auf Knopfdruck
per SPI auszugeben. Das Problem dabei: Das Programm bleibt da stecken,
wo die Daten eigentlich gesendet werden. Interruptangebundene Version
des Programms hatte den Interrupt genau einmal aufgerufen, und zwar zum
Zeitpunkt des Hochfahrens - aber auch nicht mehr. Die Polling-Variante
(beigelegt) steckt in der while(!SPCR&(1<<SPIF))-Schleife fest.
Also der Standardfehler mit dem CS-Pin ist es nicht. Abgesehen davon
wüsste ich echt nicht, was da noch so falsch sein soll. Das Datenblatt
dazu hab ich schon quasi als Desktophintergrund, werde aber auch daraus
nicht schlauer.
Hat irgendjemand einen Ansatz?
-upd.: Ein paar Klammern hinzugefügt. Kein Effekt sichtbar
MfG, Viktor
Der Slave - Chip ist ein wenig komisch, was das angeht. Der wird
angesprochen, wenn CS auf high ist. Das Problem liegt ja noch davor -
wie eine Oszilloskopmessung gezeigt hatte, rührt sich weder auf SDA noch
auf SCL was, und die SPI-Einheit des ATmega verweigert einfach mal den
Dienst.
Du schreibst die Daten per Software bitweise auf den Portpin, erwartest
aber, dass die SPI-Hardware erkennt, wenn ein Byte fertig ist? Das kann
nicht funktionieren.
Entweder du musst dir selbst ein SPIF-Flag generieren oder du musst,
wenn du das Flag im SPSR nutzen willst, auch den Rest der SPI-Hardware
nutzen. Also deine Daten senden, indem du sie nach SPDR schreibst. Dann
kümmert sich die Hardware für dich darum, SR_DATA und SR_CLOCK richtig
zu setzen. Natürlich bist du dann auf die Pins festgelegt, an die die
SPI-Hardware angeschlossen ist.
Ein Beispiel dafür ist im Datenblatt enthalten, danach solltest du noch
einmal genau schauen. Außerdem kannst du auch mal ein paar Beiträge
weiter nach dem Thema SPI auf ATMega8 funktioniert nicht (oder so
ähnlich) schauen, da wird das lang und breit diskutiert.
MfG, Arno
Viktor B. schrieb:> rührt sich weder auf SDA noch> auf SCL was, und die SPI-Einheit des ATmega verweigert einfach mal den> Dienst.
SDA und SCL wären aber I²C und nicht SPI. Du sprichts in Rätseln.
Viktor B. schrieb:> Also der Standardfehler mit dem CS-Pin ist es nicht.
Doch, ist es vermutlich, denn ...
1
DDRB=(1<<PB2)||(1<<PB3)||(1<<PB5);
du setzt nur PB0 auf Ausgang. ;-)
PS: Ganz davon zu schweigen, dass natürlich auch die ganze
SPI-Initialisierung auf Grund des gleichen Problems defekt ist.
Arno schrieb:> Du schreibst die Daten per Software bitweise auf den Portpin
Sorry für die Verwechselung. Die Funktion out(); da oben sendet ein Byte
an ein angeschlossenes Schieberegister; mit dem SPI hat es gar nichts zu
tun.
Jim M. schrieb:> SDA und SCL wären aber I²C und nicht SPI.
Jep, das sollten eig SCK und MOSI sein. Hatte die I^2C-Namen noch im
Kopf
Viktor B. schrieb:> Stefan E. schrieb:>> du setzt nur PB0 auf Ausgang.>> Setze ich damit nicht PB2 (SS), PB3 (MOSI) und PB5 (SCK) als Ausgang?
Nein.
|| vs |
Viktor B. schrieb:> Arno schrieb:>> Du schreibst die Daten per Software bitweise auf den Portpin>> Sorry für die Verwechselung. Die Funktion out(); da oben sendet ein Byte> an ein angeschlossenes Schieberegister; mit dem SPI hat es gar nichts zu> tun.
Ah, du hast Recht, und beim zweiten Versuch findet die Suchfunktion auch
die Stelle in deinem Code, an der du SPDR setzt. Muss ich mich vorhin
vertippt haben...
Viktor B. schrieb:> Stefan E. schrieb:>> du setzt nur PB0 auf Ausgang.>> Setze ich damit nicht PB2 (SS), PB3 (MOSI) und PB5 (SCK) als Ausgang?
...aber Stefan hat Recht. || ist logisches Oder, | ist bitweises Oder.
MfG, Arno
Wusste ich's doch, das der Fehler irgendwas unscheinbares sein wird. Auf
jeden Fall vielen Dank, der µC scheint sich nicht mehr aufzuhängen!
Später, wenn ich Zugriff aufs Oszi hab, werde ich weiter schauen. Kudos
to you!