Tengo un MAX7221 SPI 7-seg. Controlador LED vinculado a un microcontrolador AVR168P.
A veces, cuando se enciende, todo funciona como se espera. Otras veces la pantalla se pone en blanco y permanece en blanco. Otras veces, la pantalla ilumina todos los dígitos y permanece así "pegada".
¿Alguien me puede dar alguna sugerencia sobre lo que podría intentar solucionar esto?
Mi código:
.MACRO spiDeselect
SBI PORTB, pinCS3
SBI PORTB, pinCS2
SBI PORTB, pinCS1
.ENDMACRO
.MACRO spiSelect2
SBI PORTB, pinCS3
SBI PORTB, pinCS1
CBI PORTB, pinCS2
.ENDMACRO
.MACRO spiOut ; value in portReg
OUT SPDR0, portReg
spiOutWait:
IN portReg, SPSR0 ; Can't use SBIS for port > 31
ANDI portReg, (1 << SPIF0)
BREQ spiOutWait
.ENDMACRO
.MACRO setupSpi
; Prevent SlaveSelect acting as an input
; or it'll force SPI into slave mode
LDI portReg, (1 << pinSS) | (1 << pinCS1) | (1 << pinCS2) | (1 << pinCS3) | (1 << pinBlink)
OUT DDRB, portReg
SBI PORTB, pinSS
SBI PORTB, pinBlink
LDI portReg, (1 << SPE0) | ( 1 << MSTR0 ) ;| spiDivide128
OUT SPCR0, portReg
; Setup SCK and MOSI pins AFTER enabling SPI, to avoid
; accidentally clocking in a single bit
SBI DDRB, pinMOSI
SBI DDRB, pinSCK
spiDeselect
.ENDMACRO
.MACRO max7221SetRegister
spiSelect2
MOV portReg, regReg ; MAX7221 register to set
spiOut
MOV portReg, valReg ; value to set
spiOut
spiDeselect
.ENDMACRO
.EQU Max7221RegisterDecodeMode=0x09
.EQU Max7221RegisterIntensity=0x0A
.EQU Max7221RegisterScanLimit=0x0B
.MACRO setupMax7221
LDI valReg, 0
LDI regReg, Max7221RegisterDecodeMode
max7221SetRegister
LDI valReg, 0x2
LDI regReg, Max7221RegisterIntensity
max7221SetRegister
LDI regReg, Max7221RegisterScanLimit
LDI valReg, 7 ; display 8 digits
max7221SetRegister
LDI regReg, Max7221RegisterShutdown
LDI valReg, 1 ; shutdown mode = 0
max7221SetRegister
.ENDMACRO
progStart:
CLI
setupStackAndReg
setupSpi
setupMax7221
................
Gracias.