Gast
#13097
Hallöchen!
Ich muß nochmal wegen meiner SPI-geschichte nerven. Irgendwie klappt das
ganze nicht. Jetzt bastel ich heute schon den dritten Tag da dran rum
und ich kriegs ums verrecken nicht hin. :-(
Disen Code hab ich mal eben verzapft:
Init:
; **** Stack Pointer Setup Code ****
ldi temp,$02 ; Stack Pointer Setup
out SPH,temp ; Stack Pointer High Byte
ldi temp,$5F ; Stack Pointer Setup
out SPL,temp ; Stack Pointer Low Byte
; **** Register Setup (statische Werte) ****
ldi zero, $0
ldi allon, $FF
; **** Port B Setup Code ****
ldi temp,0b10111111 ;
out DDRB,temp ; Ausgabe in "Data Direction Register B"
ldi temp,0b11111111 ;
out PORTB,temp ; Ausgabe an PortB
; **** Port D Setup Code ****
ldi temp,0b11111111 ;
out DDRD,temp ; Ausgabe in "Data Direction Register D"
ldi r17,0b00000000 ;
out PORTD,r17 ; Ausgabe an PortD
rcall delay ; Pause
;****************************** MAIN PROGRAM
************************************
main:
ldi temp, 0b11011001 ; SPI enable, Master, f/16, no Interr.
out SPCR, temp ; -> SPI Control Register
ldi temp, 0b10100110 ; Wert zum Übertragen
out SPDR, temp ; -> senden...
waitsend:
in temp, SPSR ; lese SPI Status Register
eor r17, allon ;
out PortD, r17
sbrs temp, 7 ; wenn Bit 7 gesetzt = Übertragung Ende
rjmp waitsend ; ... wenn nicht Ende, noch warten
rcall delay ; Pause
ende:
rjmp main ;Endlosschleife....
Wenn ich nun mit meinem OscilloscopeInit:
; **** Stack Pointer Setup Code ****
ldi temp,$02 ; Stack Pointer Setup
out SPH,temp ; Stack Pointer High Byte
ldi temp,$5F ; Stack Pointer Setup
out SPL,temp ; Stack Pointer Low Byte
; **** Register Setup (statische Werte) ****
ldi zero, $0
ldi allon, $FF
; **** Port B Setup Code ****
ldi temp,0b10111111 ;
out DDRB,temp ; Ausgabe in "Data Direction Register B"
ldi temp,0b11111111 ;
out PORTB,temp ; Ausgabe an PortB
; **** Port D Setup Code ****
ldi temp,0b11111111 ;
out DDRD,temp ; Ausgabe in "Data Direction Register B"
ldi r17,0b00000000 ;
out PORTD,r17 ; Ausgabe an PortB
rcall delay ; Pause
;****************************** MAIN PROGRAM
************************************
main:
ldi temp, 0b11011001 ; SPI enable, Master, f/16, no Interr.
out SPCR, temp ; -> SPI Control Register
ldi temp, 0b10100110 ; Wert zum Übertragen
out SPDR, temp ; -> senden...
waitsend:
in temp, SPSR ; lese SPI Status Register
eor r17, allon ;
out PortD, r17
sbrs temp, 7 ; wenn Bit 7 gesetzt = Übertragung Ende
rjmp waitsend ; ... wenn nicht Ende, noch warten
rcall delay ; Pause
ende:
rjmp main ;Endlosschleife....
Eigentlich sollte dieses Programm in einer Endlosschleife immer wieder
ein "Test-Byte" über die SPI-Schnittstelle senden. Wenn ich mit meinem
Oszilloskop allerdings an den Pins PB5 /6 /7 (also den 3 SPI-Pins)
messe, hab ich dort keinerlei Signale. Nur eine gleichbliebende Spannung
nahe der Betriebsspannung (5V).
Im Debugger (AVR-Studio 4.04) allerdings klappt es. Als Testboard
benutze ich das STK500.
Das einzige, was ich feststellen kann, ist, daß die SPI-Schnittstelle
scheinbar irgendwas tut. Jedenfalls wird die Schleife, wo auf das
"Übertragungs-Ende-Bit (SPIF)" im SPSR-Register gewartet wird, nach
etwas über 1 Sekunde beendet. Denn während der Pausenroutine (nicht mit
im Listing) schalte ich zur Kontrolle die LEDS (am PortD) ein/aus, und
zur Laufzeit blinken diese.
Also wird eine Sekunde lang auf das Übertragungsende gewartet (ziemlich
lange, oder?), dann wird dieses mit dem SPIF-Bit angezeigt und eine
Pause von 1 Sekunde eingelegt, bevor erneut das Byte gesendet wird ( /
werden sollte).
Warum zum Teufel kann ich an den Ausgangspins des uC die SPI-Signale
nicht messen??? Hat einer ne Idee?
ciao,
Andi