Ist die while Schleife drin, so bleibt das Programm hängen, ohne läuft
es weiter???
Ich glaube das Problemn ist, dass SCK nicht wackelt. Auch mit
SpeicherOszi sehe keine daten über die Leitung huschen. Liegt das an der
Initialisierung, oder liegt der Hund woanders begraben.
Danke für eure Hilfe
Mein Debugger is t leider nur der Simulator dea AVR Studios und bei dem
wird SPIF gestzt und alles ist gut...
Also an Semikolata :-) wird es nicht liegen, denn kompiliert wird ja...
Eine untaugliche Programmstruktur und eine fehlerhafte SPI
Initialisierung oder Abfrage können zu der Beschriebung passen. Die SPI
Initialisierung / Abfrage habe ich nicht geprüft, weil es IMHO an deiner
Programmstruktur hapert.
Du willst SPI in main durch Polling (sich wiederholende Abfrage aus
dem Hauptprogramm heraus, siehe AVR-GCC-Tutorial) bedienen.
In Pseudocode sieht das so aus
main
spi initialisieren
Endlosschleife
1. Prüfe KURZ, ob an SPI was anliegt
es liegt was an, dann behandeln
es liegt nichts an, dann nix machen
2. Rest vom Programm machen
Zurück zu Endlosschleife
Im Moment machst du durch
while (!(SPSR & (1<<SPIF))); //Warten
eine ggf. LANGE Schleife, bis was an SPI anliegt und dadurch kann sich
die Abarbeitung von
2. Rest vom Programm machen
verzögern. Der Teil aus dem Pseudocode
1. Prüfe KURZ, ob an SPI was anliegt
es liegt was an, dann behandeln
könnte so z.B. aussehen (ungeprüft, nur dein Code umorganisiert)
if ( (SPSR & (1<<SPIF)) )
{
spi();
}
In der Funktion spi() handelst du dann die SPI Kommunikation ab.
Ich bi jetzt mit meinem Latein ziemlich am Ende...ich habe das Programm
aufs allernötigste Kondensiert, den AVR wieder zurück aufs STK
strafversetzt und die Komprimierung ausgeschaltet und trotzdem hängt das
Programm noch in der while (!(SPSR & (1<<SPIF))), und läuft ohne
wunderbar...
Versteht das Jemand? Bitte...
@Stefan
Wenn ich es so mache, wie Du sagst, also
if ( (SPSR & (1<<SPIF)) )
{
spi();
}
dann würde sich der weitere Ablauf meines Programms natürlich nicht
verändern. Allerdings sehe ich dann doch auch noch weniger, warum SPI
nicht funzt. Dann bleibt der Controller zwar nicht hängen, wird aber
wohl auch kaum auf einmal in die if-Bedingung springen, und das ist ja
was ich will. So sehe ich halt wenigstens genau, dass er wegen dieser
einen Zeile hängt...
Wenn das vollständige Byte übertragen worden ist durch
SPDR=0xFF;
MUSS doch SPIF gesetzt werden, völlig unabhängig davon, ob irgendwo was
anliegt oder nicht, richtig? Ich habe ja auf dem STK auch MOSI/MISO gar
nicht irgendwo angeschlossen, aber das ist doch fürs Flag nicht
relevant. Also muss doch der Fehler schon beim Ausbleiben des
ClockSignals lieben, so das das Byte gar nicht erst übertragen
wird...zumindest ist das mein Wissen. Ich werde aber gerne korrigiert,
vor allem wenn danach mein Programm läuft :-)
Nun ja, das SPCR Bit7 brauch ich ja nur wenn ich überhaupt Interrupts
aktiviere möchte...hier läuft ja (theoretisch) alles im Polling-Betrieb,
dafür brauchts keine IR...
Auf meiner Platine wäre das ne Möglickeit, aber auf dem STK?? Es steht
auch extra in der Anleitung das das SPI Kabel nicht abgenommen werden
muss...und Abnehmen ändert leider auch nix, hab ich auch probiert :-(
Jetzt läufts irgendwie...aber nur, wenn ich den /SS Pin als EINGANG
konfiguriere (sprich: nicht DDRB |= (1<<PB4) setze), was IMHO dem
Datenblatt widerspricht???
Kann mir das Jemand erklären? Ich wäre sehr dankbar!
Der gedanke kam mir eben beim Mittagessen auch...und siehe da: es geht!
Also Problem gelöst! Nur verstehe ich nicht, warum das so sein muss, wo
andere Leute SPI benutzen, ohne den Poort zu setzen...naja.
Danke Euch allen!!
>>SPCR &= ~(1<<SPI2X) &~ (1<<SPR0);
Die ganze Zeile sieht böse aus. Was wird da wann in
welcher Reihenfolge berechnet.
Wenn schon falsch dann bitte richtig:
SPCR &= ~((1<<SPI2X) | (1<<SPR0));
@holger
Recht hast Du. Nur leider ändert das wie mans dreht und wendet nur die
Frequenz (Bit 0 ist in SPSR und SPFR für Frequwnz zuständig).
Und das mit der Syntax finde ich eigentlich logisch! Die beiden
Ausdrücke sind doch equivalent. Ob Du nun die Bits einzeln negierst,
oder den Gesamtausdruck...
danke trotzdem
hmmm... n8
Auf die Idee, das "SPCR"-Register nacheinander zu beschreiben, wäre ich
nicht gekommen. Mit als Bleistiel unten genannter Schreibweise hatte ich
noch nie Probleme. (geklauter Code)
1
SPCR=(0<<SPIE)|/* SPI Interrupt Enable */
2
(1<<SPE)|/* SPI Enable */
3
(0<<DORD)|/* Data Order: MSB first */
4
(1<<MSTR)|/* Master mode */
5
(0<<CPOL)|/* Clock Polarity: SCK low when idle */
6
(0<<CPHA)|/* Clock Phase: sample on rising SCK edge */