DavidN
31.08.2007, 13:09
Ich versuche die SD Karte zu reseten, aber diese antwortet nicht mit 1 wie sie eigentlich sollte:
.def temp = r16
.def loop = r17
.org 0x000
rjmp RESET ;bei Reset
.org 0x002
rjmp EXT_INT0 ;INT0
RESET:
;----- Stack
ldi temp, low(RAMEND) ;Stackpointer
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
;----- Kontrolllampen an Port A
ldi temp, 0xFF
out DDRA, temp
;----- SPI
ldi temp, 0b10110000 ;Datenrichtung von PORTB
out DDRB, temp
ldi temp, 0b01010011 ;Master setzen und Takt
out SPCR, temp
sbi PORTB, 4
ldi temp, 0b00000000 ;SPI freigeben, Takt
out SPSR, temp
;----- Interrupts
ldi temp, 0b00000010
out DDRD, temp
ldi temp, 0b00000011 ;Interrupt Reaktionsimpuls einstellen
out MCUCR, temp
ldi temp, 0b01000000 ;Interrupts enablen
out GICR, temp
sei ;Interuppts aktivieren
IDLE:
rjmp idle
EXT_INT0:
sbi PORTA, 0 ;Led einschalten (Signal) ##################################
rjmp RESET_SD
reti
;---Reset-----------------------------------------------------------------------
RESET_SD:
sbi PORTA, 1 ;Led einschalten (Signal) ##################################
ldi temp,0xFF ;10 Bytes Zeit
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
cbi PORTB, 4 ;Reset Befehl -> 6 bytes
ldi temp,0x40
rcall SEND_SPI
ldi temp,0x00
rcall SEND_SPI
ldi temp,0x00
rcall SEND_SPI
ldi temp,0x00
rcall SEND_SPI
ldi temp,0x00
rcall SEND_SPI
ldi temp,0x95
rcall SEND_SPI
RESET_WAIT: ;auf Antwort warten
sbis PINA, 7 ; blinken während schleife ##########################################
sbi PORTA, 7
sbic PINA, 7
cbi PORTA, 7
ldi temp, 0xFF
rcall SEND_SPI
cpi temp, 0x01
out PORTA, temp
brne RESET_WAIT
cbi PORTA, 0 ;Led ausschalten (Signal) #######################################
sbi PORTB, 4
ldi temp,0xFF
rcall SEND_SPI
ret
SEND_SPI: ;SPI Daten senden (von temp)
out SPDR, temp
SPI_WAIT:
sbis SPSR, SPIF
rjmp SPI_WAIT
in temp, SPDR
ret
Durch die Leds, weiß ich dass er in die schleife reinläuft, aber der brne nie aktiviert wird.
angeschlossen ist wie auf ulrich radigs seite beschrieben
habs versucht so übersichtlich wie nur irgend möglich zu schreiben, aber verstehe nicht, wo die antwort bleibt.
.def temp = r16
.def loop = r17
.org 0x000
rjmp RESET ;bei Reset
.org 0x002
rjmp EXT_INT0 ;INT0
RESET:
;----- Stack
ldi temp, low(RAMEND) ;Stackpointer
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
;----- Kontrolllampen an Port A
ldi temp, 0xFF
out DDRA, temp
;----- SPI
ldi temp, 0b10110000 ;Datenrichtung von PORTB
out DDRB, temp
ldi temp, 0b01010011 ;Master setzen und Takt
out SPCR, temp
sbi PORTB, 4
ldi temp, 0b00000000 ;SPI freigeben, Takt
out SPSR, temp
;----- Interrupts
ldi temp, 0b00000010
out DDRD, temp
ldi temp, 0b00000011 ;Interrupt Reaktionsimpuls einstellen
out MCUCR, temp
ldi temp, 0b01000000 ;Interrupts enablen
out GICR, temp
sei ;Interuppts aktivieren
IDLE:
rjmp idle
EXT_INT0:
sbi PORTA, 0 ;Led einschalten (Signal) ##################################
rjmp RESET_SD
reti
;---Reset-----------------------------------------------------------------------
RESET_SD:
sbi PORTA, 1 ;Led einschalten (Signal) ##################################
ldi temp,0xFF ;10 Bytes Zeit
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
ldi temp,0xFF
rcall SEND_SPI
cbi PORTB, 4 ;Reset Befehl -> 6 bytes
ldi temp,0x40
rcall SEND_SPI
ldi temp,0x00
rcall SEND_SPI
ldi temp,0x00
rcall SEND_SPI
ldi temp,0x00
rcall SEND_SPI
ldi temp,0x00
rcall SEND_SPI
ldi temp,0x95
rcall SEND_SPI
RESET_WAIT: ;auf Antwort warten
sbis PINA, 7 ; blinken während schleife ##########################################
sbi PORTA, 7
sbic PINA, 7
cbi PORTA, 7
ldi temp, 0xFF
rcall SEND_SPI
cpi temp, 0x01
out PORTA, temp
brne RESET_WAIT
cbi PORTA, 0 ;Led ausschalten (Signal) #######################################
sbi PORTB, 4
ldi temp,0xFF
rcall SEND_SPI
ret
SEND_SPI: ;SPI Daten senden (von temp)
out SPDR, temp
SPI_WAIT:
sbis SPSR, SPIF
rjmp SPI_WAIT
in temp, SPDR
ret
Durch die Leds, weiß ich dass er in die schleife reinläuft, aber der brne nie aktiviert wird.
angeschlossen ist wie auf ulrich radigs seite beschrieben
habs versucht so übersichtlich wie nur irgend möglich zu schreiben, aber verstehe nicht, wo die antwort bleibt.