Ik heb een schakelingetje gemaakt, waarbij ik gebruik maak van een printje met acht 7-Segment displays.
Daarbij is een MAX7219 aan boord, die 8 Digits kan aansturen.
Het werkt ook wel, maar ik worstel een beetje met opstartproblemen.
In de meeste gevallen gaat het goed, maar toch gebeurt het redelijk vaak dat bij Power On alle displays op '88888888' komen te staan.
Resetten van de PIC16F1847 helpt niet; het enige dat echt helpt is spanning er af, even wachten en dan opnieuw spanning er op.
Dan is het soms: 'nee, nóg niet, opnieuw. En na enkele pogingen, ja nu doet hij het.
Zo ook in onderstaand klein Mikro Basic programmaatje. Een simpele teller.
Nu vraag ik me af wat er fout gaat en/of hier überhaupt wel iets aan te doen is. Wellicht vanwege de Chinese kwaliteit? Mee leren leven en paar keer de spanning uit-aan doen? Is wel een beetje vreemd en komt niet echt betrouwbaar over.
Of kan ik toch nog iets doen?
De source van het progamma: (het projectje is ook als bijlage meegestuurd)
'====================================================================================================
Program Test7219 'Test 7-Segment - 8 Digits leds with MAX7219
'====================================================================================================
' Project name: Test7219
' MCU: PIC16F1847
' Oscillator: Internal 8 MHz
' Display: 7-Segment 8 pieces with Max 7219 (SPI1)
' SDO: LATB.2 Pin 8
' SCK: PORTB.4 Pin 10
' D/C: LATB.3 Pin 9
Dim Datapin As sbit at LATB.2 'Pin 8 SDO - SPI1
SCKPin As sbit at PORTB.4 'Pin 10 SCK - SPI1
D_C As sbit at LATB.3 'Pin 9 Data Command
Disp As Byte
Dsp As Byte [8]
Cnt As Byte
CntSec As Longword
i1 As LongWord
'====================================================================================================
Sub Procedure Max_Write(Dim pRow, pDig0 as Byte)
'====================================================================================================
D_C = 0
SPI1_Write(pRow)
SPI1_Write(pDig0)
D_C = 1
Delay_ms(2)
End sub
'====================================================================================================
Sub Procedure Max7219_Init()
'====================================================================================================
Max_Write(0x09, 0xFF) 'Decode Mode Code B-Digital digits 7-0
Max_Write(0x0B, 0x07) 'Scan Limit 0-7
Max_Write(0x0C, 0x01) 'Normal Operation
Max_Write(0x0A, 0x0C) 'Intensity
End sub
'====================================================================================================
Sub Procedure Write_Display()
'====================================================================================================
For Disp = 1 to 8
Max_Write(Disp, Dsp[Disp - 1])
Next Disp
End sub
'====================================================================================================
Sub Procedure Blank_Digits() 'Blank Digits Without Decimal point (0x7F)
'====================================================================================================
For Disp = 0 to 7
Dsp[Disp] = 0x7F
Next Disp
Write_Display()
Delay_Ms(20)
End Sub
main:
OSCCON = %01110000 '8Mhz Internal
ANSELB = %00000000 'All Port B Digital
ANSELA = %00000000 'All Port A Digital
TRISB = %00000001 'Port B.0 Input
TRISA = %00001111 'Port A0, A1, A2, A3 Input
SPI1_Init() 'Init SPI
Max7219_Init() 'Init MAX7219
Delay_ms(5)
Blank_Digits() 'Blank Displays
Delay_Ms(5)
i1 = 0
While True
Inc(i1)
Dsp[7] = i1 /10000000 mod 10
Dsp[6] = i1 /1000000 mod 10
Dsp[5] = i1 /100000 mod 10
Dsp[4] = i1 /10000 mod 10
Dsp[3] = i1 /1000 mod 10
Dsp[2] = i1 /100 mod 10
Dsp[1] = i1 /10 mod 10
Dsp[0] = i1 mod 10
Write_Display()
Delay_Ms(1)
Wend
End.