BmB
Frysk bloed tsjoch op! wol no ris brûze en siede, en bûnzje troch ús ieren om!
hadv
Just find out what you like and let it kill you
Op 26 augustus 2008 16:35:48 schreef Dutchboy.:
Vast iets fout gegaan
hier is de Link
en als dat niet wil zeg het dan maar dan mail ik wel even
werkt (nog steeds) niet, mail maar
Heb de dingen maar weer onder het stof gehaald en het resultaat van 400 regels code:
http://nl.youtube.com/watch?v=I0mLvZ_2YuA
nu nog ff programmeren dat het hele bord benut kan worden
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
Ik ben weer eens bezig met deze displays....
maar ik had zomaar een vraag.... ik heb hier en daar , dat pixels flauw mee gaan branden, terwijl ik ze niet aan stuur?
waar ligt dat aan, en kan ik daar ook iets aan doen?
Dat zal dan waarschijnlijk aan je aansturing liggen. Ik heb er hier ook een aantal en heb daar absoluut geen last van.
- edit;
Hier een stuk van de code die ik gebruik om het display aan te sturen. Het werkt prima, alleen is het veranderen van tekst of plaatje een monnikenwerk.
REPEAT
FOR Y = 0 TO 8 STEP 1
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$00, $00, $00, $00, $00, $00, $00, $00]
PULSOUT Strobe, 1, HIGH
PULSOUT OE, 1, HIGH
SHOUT LDAT, CLK, MSBFIRST,[$00, $00, $00, $00, $00, $00, $00, $00]
PULSOUT Strobe,1, HIGH
PULSOUT OE, 1, HIGH
SELECT Y
CASE 1
A2 = 0 : A1 = 0 : A0 = 0
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$00, $00, $00, $00, $00, $00, $00, $00]
PULSOUT Strobe, 1, HIGH
SHOUT LDAT, CLK, MSBFIRST,[$00, $00, $00, $00, $00, $00, $00, $00]
CASE 2
A2 = 0 : A1 = 0 : A0 = 1
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$44, $00, $00, $23, $80, $E3, $80, $00]
PULSOUT Strobe, 1, HIGH
SHOUT LDAT, CLK, MSBFIRST,[$7C, $02, $01, $0C, $07, $1C, $00, $00]
CASE 3
A2 = 0 : A1 = 1 : A0 = 0
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$44, $00, $00, $64, $49, $14, $40, $00]
PULSOUT Strobe, 1, HIGH
SHOUT LDAT, CLK, MSBFIRST,[$10, $02, $03, $10, $48, $A2, $00, $00]
CASE 4
A2 = 0 : A1 = 1 : A0 = 1
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$44, $E5, $80, $24, $49, $14, $42, $20]
PULSOUT Strobe, 1, HIGH
SHOUT LDAT, CLK, MSBFIRST,[$10, $e7, $01, $20, $48, $A2, $11, $00]
CASE 5
A2 = 1 : A1 = 0 : A0 = 0
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$44, $16, $40, $24, $41, $14, $42, $20]
PULSOUT Strobe, 1, HIGH
SHOUT LDAT, CLK, MSBFIRST,[$11, $12, $01, $3C, $08, $A2, $11, $00]
CASE 6
A2 = 1 : A1 = 0 : A0 = 1
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$44, $F4, $40, $24, $49, $14, $42, $20]
PULSOUT Strobe, 1, HIGH
SHOUT LDAT, CLK, MSBFIRST,[$11, $12, $01, $22, $48, $A2, $11, $00]
CASE 7
A2 = 1 : A1 = 1 : A0 = 0
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$29, $14, $40, $24, $49, $14, $42, $6C]
PULSOUT Strobe, 1, HIGH
SHOUT LDAT, CLK, MSBFIRST,[$11, $12, $41, $22, $48, $A2, $13, $60]
CASE 8
A2 = 1 : A1 = 1 : A0 = 1
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$10, $F4, $40, $73, $80, $E3, $81, $AC]
PULSOUT Strobe, 1, HIGH
SHOUT LDAT, CLK, MSBFIRST,[$10, $E3, $83, $9C, $07, $1C, $0D, $60]
ENDSELECT
INC Vertraging
NEXT
UNTIL Vertraging = TijdDit is dus voor 1 beeld. (met drie bordjes achter elkaar)
-edit 2:
Laat je ons weten wat jouw vorderingen zijn? Ik vind het wel leuk dat er weer iemand mee bezig is.
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
ik heb nu het onderstaande....
ik heb voor elke led (pixel) een nibble gereseveerd... zodat ik ze aan kan sturen is 16 tinten....
en dat werkt in principe goed.... en straks wil ik die array gaan vullen via rs232 vanuit de PC....
dus die eerste data_display[0]=$fe is dus de eerste pixel links boven... F is max aan... E is pixel 2, iets minder fel....
en een $0F is 1 pixel uit, 1 pixel vol aan...
snap alleen even niets van die schaduwpixels....
DEVICE = 18F2455
XTAL = 4
CONFIG_START
PLLDIV = 1 ; No prescale (4 MHz oscillator input drives PLL directly)
CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
USBDIV = 2 ; USB clock source comes from the 96 MHz PLL divided by 2
FOSC = HSPLL_HS ; HS oscillator, PLL enabled, HS used by USB
FCMEN = OFF ; Fail-Safe Clock Monitor disabled
IESO = OFF ; Oscillator Switchover mode disabled
PWRT = OFF ; PWRT disabled
BOR = OFF ; Brown-out Reset disabled in hardware and software
BORV = 0 ; Maximum setting
VREGEN = OFF ; USB voltage regulator disabled
WDT = OFF ; HW Disabled - SW Controlled
MCLRE = ON ; MCLR pin enabled; RE3 input pin disabled
PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CCP2MX = OFF ; CCP2 input/output is multiplexed with RB3
STVREN = OFF ; Stack full/underflow will not cause Reset
LVP = off ; Single-Supply ICSP disabled
XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
DEBUG = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
CP0 = OFF ; Block 0 (000800-001FFFh) not code-protected
CP1 = OFF ; Block 1 (002000-003FFFh) not code-protected
CP2 = OFF ; Block 2 (004000-005FFFh) not code-protected
CPB = OFF ; Boot block (000000-0007FFh) not code-protected
CPD = OFF ; Data EEPROM not code-protected
WRT0 = OFF ; Block 0 (000800-001FFFh) not write-protected
WRT1 = OFF ; Block 1 (002000-003FFFh) not write-protected
WRT2 = OFF ; Block 2 (004000-005FFFh) not write-protected
WRTB = OFF ; Boot block (000000-0007FFh) not write-protected
WRTC = OFF ; Configuration registers (300000-3000FFh) not write-protected
WRTD = OFF ; Data EEPROM not write-protected
EBTR0 = OFF ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
EBTR1 = OFF ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks
EBTR2 = OFF ; Block 2 (004000-005FFFh) not protected from table reads executed in other blocks
EBTRB = OFF ; Boot block (000000-0007FFh) not protected from table reads executed in other blocks
CONFIG_END
ALL_DIGITAL TRUE
TRISA = 0
TRISB = 0
SYMBOL TRUE=1
SYMBOL FALSE=0
SYMBOL strobe = PORTB.1
SYMBOL _oe = PORTB.7
SYMBOL clock = PORTB.0
SYMBOL a0 = PORTB.2
SYMBOL a1 = PORTB.3
SYMBOL a2 = PORTB.4
SYMBOL udat = PORTB.5
SYMBOL ldat = PORTB.6
SYMBOL T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
SYMBOL T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
SYMBOL GIE = INTCON.7 ' Global Interrupt Enable
SYMBOL PEIE =INTCON.6
SYMBOL T0PS0 = T0CON.0 ' Prescaler ratio bit-0
SYMBOL T0PS1 = T0CON.1 ' Prescaler ratio bit-1
SYMBOL T0PS2 = T0CON.2 ' Prescaler ratio bit-2
SYMBOL T0PSA = T0CON.3 ' Prescaler Assignment (1=assigned to WDT 0=assigned to oscillator)
SYMBOL T0SE = T0CON.4 ' fe/re T0cki pin
SYMBOL T0CS = T0CON.5 ' Timer0 Clock Source Select (0=Internal clock 1=External PORTA.4)
SYMBOL T08BIT = T0CON.6 ' Timer0 8-bit/16-bit timer counter
SYMBOL TMR0ON = T0CON.7 ' Timer0 Enables/stops
'SYMBOL RCIE = PIE1.5
'SYMBOL RCIF = PIR1.5 ' The USART receive buffer is full
DIM x AS BYTE
DIM y AS BYTE
DIM next_pixel AS BYTE
DIM dummy AS BYTE
DIM data_display[257] AS BYTE
DIM low_nibble_data AS BYTE
DIM High_nibble_data AS BYTE
DIM contrast AS BYTE
FOR dummy=0 TO 255
data_display[dummy]=$00
NEXT dummy
contrast=1
tel=0
y=1
'onderstaande array moet straks gevuld worden via rs232
data_display[0]=$fe 'bovenste display
data_display[1]=$dc ' een nibble per pixel 0=uit, 15= maximaal aan
data_display[2]=$ba
data_display[3]=$98
data_display[4]=$76
data_display[5]=$54
data_display[6]=$32
data_display[7]=$21
data_display[8]=$f1
data_display[9]=$f1
data_display[10]=$f1
data_display[11]=$f1
data_display[12]=$f0
data_display[13]=$f0
data_display[14]=$f0
data_display[15]=$f0
data_display[16]=$1f
data_display[17]=$f1
data_display[18]=$1f
data_display[19]=$f1
data_display[23]=$f1
data_display[25]=$f1
data_display[29]=$f1
data_display[30]=$00
data_display[31]=$ff
data_display[127]=$0f
data_display[128]=$F0 'onderste display!
'data_display[140]=$ff
data_display[250]=$33
data_display[255]=$f1 ' eind display data...
ON_INTERRUPT GOTO InterruptAfhandeling
GIE = 0 ' Turn off global interrupts
T0PSA = 0 ' Assign the prescaler to external oscillator
T0PS0 = 1 ' Set the prescaler
T0PS1 = 0 ' to increment TMR0
T0PS2 = 0 ' every 256th instruction cycle
T0CS = 0 ' Assign TMR0 clock to internal source
TMR0L = 0 ' Clear TMR0 initially
TMR0H =0
TMR0ON=1
PEIE = 1 ' PEIE (PEripheral Interrupt Enable) activeren
T0IE = 1 ' Enable TMR0 overflow interrupt
'RCIE =1 ' Enable the USART receive interrupt
GIE = 1 ' Enable global interrupts
hoofdmenu:
DELAYMS 1000
TOGGLE PORTA.0
GOTO hoofdmenu
END
display:
FOR x = 1 TO 16
High_nibble_data=data_display[next_pixel] & %00001111
low_nibble_data=data_display[next_pixel] >>4
udat=FALSE
ldat=FALSE
IF low_nibble_data>= contrast THEN
IF y<9 THEN
udat=TRUE
ELSE
ldat=TRUE
ENDIF
ENDIF
clock=FALSE
clock=TRUE
udat=FALSE
ldat=FALSE
IF High_nibble_data>= contrast THEN
IF y>9 THEN
ldat=TRUE
ELSE
udat=TRUE
ENDIF
ENDIF
clock=FALSE
clock=TRUE
next_pixel=next_pixel+1
NEXT x
_oe = 1'maak oe hoog(dit zet alle leds tijdelijk uit)
strobe=TRUE
strobe=FALSE
dummy=y-1
a0 = dummy.0 'zet [a2.. 0] naar y
a1 = dummy.1
a2 = dummy.2
_oe = 0 'maak oe laag
RETURN
;------------------------------------------------------------------------------------------------------------------
InterruptAfhandeling: 'Uitlezen en leegschuiven van buffer gebeurt in hoofdprogramma
'IF T0IF = 1 THEN ' Was it a Timer0 overflow that triggered the interrupt ?
T0IF = 0 'Clear the flag
y=y+1
IF y>16 THEN
y=1
next_pixel=0
contrast=contrast+1
IF contrast>16 THEN contrast=1:TOGGLE PORTA.1 ;
ENDIF
GOSUB display
CONTEXT RESTORE
'ENDIF
' IF PIR1.5 = 1 THEN ' USART triggered the interrupt
' HSERIN 7, Verder, [OntvangenData] ;Time out staat op 7mSec ingesteld
' FOR dummy = 0 TO 10 ;Buffer met plaats voor maximaal 10 bytes arrays (0...3)
' IF Buffer[dummy] = 0 THEN ;Bufferplaats nog leeg? Dan...
' Buffer[dummy] = OntvangenData ;...hierin de ontvangen data plaatsen, en...
' BREAK ;...uit de FOR...NEXT lus springen
' ENDIF
' NEXT dummy
' ENDIF
'Verder: ;In het geval van een time-out, hier verder gaan
' CONTEXT RESTORE ;Restore registers, ga terug naar plek waar interrupt ontstond
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
Deze versie had ik ook nog liggen... dit is met gewoon ledje aan/uit
dus in data_display[0]=%00000001 zitten dus de eerste 8 ledjes..
het scannen van het display hangt ook aan tmr0...
en ook hier moet straks de array gevuld worden dmv rs232....
DEVICE = 18F2455
XTAL = 4
CONFIG_START
PLLDIV = 1 ; No prescale (4 MHz oscillator input drives PLL directly)
CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
USBDIV = 2 ; USB clock source comes from the 96 MHz PLL divided by 2
FOSC = HSPLL_HS ; HS oscillator, PLL enabled, HS used by USB
FCMEN = OFF ; Fail-Safe Clock Monitor disabled
IESO = OFF ; Oscillator Switchover mode disabled
PWRT = OFF ; PWRT disabled
BOR = OFF ; Brown-out Reset disabled in hardware and software
BORV = 0 ; Maximum setting
VREGEN = OFF ; USB voltage regulator disabled
WDT = OFF ; HW Disabled - SW Controlled
MCLRE = ON ; MCLR pin enabled; RE3 input pin disabled
PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CCP2MX = OFF ; CCP2 input/output is multiplexed with RB3
STVREN = OFF ; Stack full/underflow will not cause Reset
LVP = off ; Single-Supply ICSP disabled
XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
DEBUG = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
CP0 = OFF ; Block 0 (000800-001FFFh) not code-protected
CP1 = OFF ; Block 1 (002000-003FFFh) not code-protected
CP2 = OFF ; Block 2 (004000-005FFFh) not code-protected
CPB = OFF ; Boot block (000000-0007FFh) not code-protected
CPD = OFF ; Data EEPROM not code-protected
WRT0 = OFF ; Block 0 (000800-001FFFh) not write-protected
WRT1 = OFF ; Block 1 (002000-003FFFh) not write-protected
WRT2 = OFF ; Block 2 (004000-005FFFh) not write-protected
WRTB = OFF ; Boot block (000000-0007FFh) not write-protected
WRTC = OFF ; Configuration registers (300000-3000FFh) not write-protected
WRTD = OFF ; Data EEPROM not write-protected
EBTR0 = OFF ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
EBTR1 = OFF ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks
EBTR2 = OFF ; Block 2 (004000-005FFFh) not protected from table reads executed in other blocks
EBTRB = OFF ; Boot block (000000-0007FFh) not protected from table reads executed in other blocks
CONFIG_END
ALL_DIGITAL TRUE
TRISA = 0
TRISB = 0
SYMBOL TRUE=1
SYMBOL FALSE=0
SYMBOL strobe = PORTB.1
SYMBOL _oe = PORTB.7
SYMBOL clock = PORTB.0
SYMBOL a0 = PORTB.2
SYMBOL a1 = PORTB.3
SYMBOL a2 = PORTB.4
SYMBOL udat = PORTB.5
SYMBOL ldat = PORTB.6
SYMBOL T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
SYMBOL T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
SYMBOL GIE = INTCON.7 ' Global Interrupt Enable
SYMBOL PEIE =INTCON.6
SYMBOL T0PS0 = T0CON.0 ' Prescaler ratio bit-0
SYMBOL T0PS1 = T0CON.1 ' Prescaler ratio bit-1
SYMBOL T0PS2 = T0CON.2 ' Prescaler ratio bit-2
SYMBOL T0PSA = T0CON.3 ' Prescaler Assignment (1=assigned to WDT 0=assigned to oscillator)
SYMBOL T0SE = T0CON.4 ' fe/re T0cki pin
SYMBOL T0CS = T0CON.5 ' Timer0 Clock Source Select (0=Internal clock 1=External PORTA.4)
SYMBOL T08BIT = T0CON.6 ' Timer0 8-bit/16-bit timer counter
SYMBOL TMR0ON = T0CON.7 ' Timer0 Enables/stops
'SYMBOL RCIE = PIE1.5
'SYMBOL RCIF = PIR1.5 ' The USART receive buffer is full
DIM x AS BYTE
DIM y AS BYTE
DIM next_8pixels AS BYTE
DIM dummy AS BYTE
DIM data_display[65] AS BYTE
FOR dummy=0 TO 65 ' alle pixels uit zetten
data_display[dummy]=0
NEXT dummy
next_8pixels=1
y=1
data_display[0]=%00000001
data_display[1]=%00000010
data_display[2]=4
data_display[3]=8
data_display[4]=15
data_display[5]=15
data_display[6]=15
data_display[7]=255
data_display[16]=81
data_display[24]=81
data_display[26]=51
data_display[30]=51
data_display[31]=1
data_display[32]=2
data_display[33]=4
data_display[60]=18
data_display[62]=%11111111
data_display[63]=%01010101
data_display[64]=%01010010
ON_INTERRUPT GOTO InterruptAfhandeling
GIE = 0 ' Turn off global interrupts
T0PSA = 0 ' Assign the prescaler to external oscillator
T0PS0 = 0 ' Set the prescaler
T0PS1 = 1 ' to increment TMR0
T0PS2 = 0 ' every 256th instruction cycle
T0CS = 0 ' Assign TMR0 clock to internal source
TMR0L = 0 ' Clear TMR0 initially
TMR0H =0
TMR0ON=1
PEIE = 1 ' PEIE (PEripheral Interrupt Enable) activeren
T0IE = 1 ' Enable TMR0 overflow interrupt
'RCIE =1 ' Enable the USART receive interrupt
GIE = 1 ' Enable global interrupts
hoofdmenu:
GOTO hoofdmenu
END
display:
FOR x = 1 TO 4
IF y<9 THEN
SHOUT udat,clock,MSBFIRST,[data_display[next_8pixels]]
ELSE
SHOUT ldat,clock,MSBFIRST,[data_display[next_8pixels]]
ENDIF
next_8pixels=next_8pixels+1
NEXT x
_oe = 1'maak oe hoog(dit zet alle leds tijdelijk uit)
strobe=TRUE
strobe=FALSE
dummy=y-1
a0 = dummy.0 'zet [a2.. 0] naar y
a1 = dummy.1
a2 = dummy.2
_oe = 0 'maak oe laag
RETURN
;------------------------------------------------------------------------------------------------------------------
InterruptAfhandeling: 'Uitlezen en leegschuiven van buffer gebeurt in hoofdprogramma
'IF T0IF = 1 THEN ' Was it a Timer0 overflow that triggered the interrupt ?
T0IF = 0
y=y+1
IF y>16 THEN
y=1
next_8pixels=1
ENDIF
GOSUB display
'Clear the flag
CONTEXT RESTORE
'ENDIF
' IF PIR1.5 = 1 THEN ' USART triggered the interrupt
' HSERIN 7, Verder, [OntvangenData] ;Time out staat op 7mSec ingesteld
' FOR dummy = 0 TO 10 ;Buffer met plaats voor maximaal 10 bytes arrays (0...3)
' IF Buffer[dummy] = 0 THEN ;Bufferplaats nog leeg? Dan...
' Buffer[dummy] = OntvangenData ;...hierin de ontvangen data plaatsen, en...
' BREAK ;...uit de FOR...NEXT lus springen
' ENDIF
' NEXT dummy
' ENDIF
'Verder: ;In het geval van een time-out, hier verder gaan
' CONTEXT RESTORE ;Restore registers, ga terug naar plek waar interrupt ontstond
Zooo, Das een stevig stukje code.. Wat mij zo op het eerste gezicht opvalt is het volgende stukje:
_oe = 1'maak oe hoog(dit zet alle leds tijdelijk uit)
strobe=TRUE
strobe=FALSE
dummy=y-1
a0 = dummy.0 'zet [a2.. 0] naar y
a1 = dummy.1
a2 = dummy.2
_oe = 0 'maak oe laag
RETURNAls je dat vergelijkt met mijn stukje:
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$00, $00, $00, $00, $00, $00, $00, $00]
PULSOUT Strobe, 1, HIGH
PULSOUT OE, 1, HIGH
SHOUT LDAT, CLK, MSBFIRST,[$00, $00, $00, $00, $00, $00, $00, $00]
PULSOUT Strobe,1, HIGH
PULSOUT OE, 1, HIGH
Dan zie je dat ik meermaals de oe aanspreek om alles even uit te zetten. Ik heb in het begin ook best wel wat problemen gehad om het goed te krijgen maar met proberen en testen ben ik hiertoe gekomen en dat werkt goed.
Hopelijk kun je er iets mee.
Het lijkt me leuk als jij het ook zo met rs232 aan de gang krijgt. Nog een leuk stukje software erbij en je kunt er echt iets mee gaan laten zien.
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
dat lijkt maar zo,.... denk ik...
jij stuur de data in aparte regels, ik in een for next lus....
dat van jouw is (wat wij programmeurs) niet echt een programma noemen.... althans... het werk, dus maakt verder niets uit.... maar
ik zal nooit tig keer onder elkaar het zelfde programeren...
ik zou dan altijd iets van een lus maken... data in een tabel... en dan via een lus die data lezen... en dan het gedeelt wat het naar het scherm stuurt ook in die lus... want het 2de programma ,welke met de led aan/uit werkt, is echt niet zo anders als jouw verhaal...
ik gebruik ook die SHout... alleen veel minder vaak als jij... (omdat tie in een lus zit...)
nog een voordeel van dit is, dat je programma kleiner word, en sneller....
alleen moet ik bij jouw ff kijken....
want waar zet jij a0,a1 en a2 dan...
want heb je 2 displays naast elkaar?
hmm maar volgens mij kan die pulsout onder de eerste Shout er uit...en die pulsout OE,q,high ook.... ja... nu klok je de bovenste regel 2x in....
verder is pulsout wel leuk, maar die geeft een puls van 1us? of 1ms?
terwijl hoog/laag zetten van de output volgens mij een veel kortere instruktie is.... maar misschien heb ik daarom die schaduwpixels wel...
volgens mij doet dit onderstaande het zelfde als jouw programma , alleen korter
REPEAT
FOR Y = 0 TO 8 STEP 1
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$00, $00, $00, $00, $00, $00, $00, $00]
SHOUT LDAT, CLK, MSBFIRST,[$00, $00, $00, $00, $00, $00, $00, $00]
PULSOUT Strobe,1, HIGH
PULSOUT OE, 1, HIGH
SELECT Y
CASE 1
A2 = 0 : A1 = 0 : A0 = 0
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$00, $00, $00, $00, $00, $00, $00, $00]
SHOUT LDAT, CLK, MSBFIRST,[$00, $00, $00, $00, $00, $00, $00, $00]
CASE 2
A2 = 0 : A1 = 0 : A0 = 1
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$44, $00, $00, $23, $80, $E3, $80, $00]
SHOUT LDAT, CLK, MSBFIRST,[$7C, $02, $01, $0C, $07, $1C, $00, $00]
CASE 3
A2 = 0 : A1 = 1 : A0 = 0
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$44, $00, $00, $64, $49, $14, $40, $00]
SHOUT LDAT, CLK, MSBFIRST,[$10, $02, $03, $10, $48, $A2, $00, $00]
CASE 4
A2 = 0 : A1 = 1 : A0 = 1
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$44, $E5, $80, $24, $49, $14, $42, $20]
SHOUT LDAT, CLK, MSBFIRST,[$10, $e7, $01, $20, $48, $A2, $11, $00]
CASE 5
A2 = 1 : A1 = 0 : A0 = 0
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$44, $16, $40, $24, $41, $14, $42, $20]
SHOUT LDAT, CLK, MSBFIRST,[$11, $12, $01, $3C, $08, $A2, $11, $00]
CASE 6
A2 = 1 : A1 = 0 : A0 = 1
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$44, $F4, $40, $24, $49, $14, $42, $20]
SHOUT LDAT, CLK, MSBFIRST,[$11, $12, $01, $22, $48, $A2, $11, $00]
CASE 7
A2 = 1 : A1 = 1 : A0 = 0
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$29, $14, $40, $24, $49, $14, $42, $6C]
SHOUT LDAT, CLK, MSBFIRST,[$11, $12, $41, $22, $48, $A2, $13, $60]
CASE 8
A2 = 1 : A1 = 1 : A0 = 1
PULSOUT Strobe, 1, HIGH
SHOUT UDAT, CLK, MSBFIRST,[$10, $F4, $40, $73, $80, $E3, $81, $AC]
SHOUT LDAT, CLK, MSBFIRST,[$10, $E3, $83, $9C, $07, $1C, $0D, $60]
ENDSELECT
INC Vertraging
NEXT
UNTIL Vertraging = Tijd
[Bericht gewijzigd door Arjan Swets op (47%)]
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
Ja ik weet dat het een oud topic is, maar ben ook al heel lang bezig....
en het begint aardig te lukken... zie ook dit forum...
http://www.vbib.be/PNphpBB2-viewtopic-t-7911.phtml
ik heb alleen ies raars? als ik de laatste led van een rij hoog zet, gaan ze allemaal aan....
dus
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 0000000X
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 0000000X
dus als ik 1 van die X ledjes aan stuurt
gaan alle ledjes aan van die laag...
dus als ik de bovenste x aanstuur krijg ik
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxX dus ik stuur alleen deze aan
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
x=aan, 0=uit
heeft iemand enig idee?
Er staan veel fouten in dit topic in diverse berichten.
Het volgende is van belang, daar heb je je niet aan gehouden als je schaduwpixels hebt.
Je hebt twee schuifregisters, een voor de bovenste en een voor de onderste rij display, 32 lang per module.
Je klokt dat vol door op serial in boven en onder de data aan te bieden en dan een klokpuls te geven. Opflank klokt hem in.
En wel en dat is belangrijk, de volgende rij dan die op dat moment op de display staat en daar blijft staan zolang je de latch=strobe niet hoog maakt EN TEVENS HET ADRES NIET WIJZIGT.
De schuifregisters hebben een latch die de dataoverneemt zolang de latch hoog is. Na de latch staan poorten die bepalen of de displayrij uit of aan is, die zijn verbonden met de enable pen op de connector.
Dit wetende is de noodzakelijke volgorde als volgt:
\*)
vul het schuifregister met nieuwe data voor het volgende adres MAAR LAAT HET ADRES OP DE OUDE WAARDE STAAN.
output disable
wijzig adres naar neiuwe waarde die hoort bij het zojuist gevulde schuifregister.
latch
output enable
terug naar \*)
Nergens delay loops nodig dus, en geen schadupixels
De displayduurvan een lijn is bijna gelijk aan de vulduur van het register met de volgende lijn.
[Bericht gewijzigd door Henry S. op (99%)]
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
Bedankt voor je antwoord, heb het 4 keer gelezen...
ik zal eens kijken , met jouw verhaal ernaast, waar ik nu de fout in gaat.....
want verder gaat het goed, alleen die laatste led doet raar....
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
display:
FOR x = 1 TO 4
IF y<9 THEN
SHOUT udat,clock,MSBFIRST,[data_display[next_8pixels]]
ELSE
SHOUT ldat,clock,MSBFIRST,[data_display[next_8pixels]]
ENDIF
next_8pixels=next_8pixels+1
NEXT x
_oe = 1'maak oe hoog(dit zet alle leds tijdelijk uit)
strobe=TRUE
strobe=FALSE
dummy=y-1
a0 = dummy.0 'zet [a2.. 0] naar y
a1 = dummy.1
a2 = dummy.2
_oe = 0 'maak oe laag
RETURN
maar wat is hier niet goed aan.... volgens mij doe ik toch wat jij beschrijf?
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
Ik snap het echt niet meer.... maar ik blijf met het verhaal zitten als ik de laatste pixel van een rij aan zet alles aan gaat...
echt niemand een idee waar dat aan zou kunnen liggen?
ik wordt er gek van.... voor de rest werkt het nu zo lekker... zolang ik maar niet die laatste pixel aan stuur?
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
Wat me gister wel opviel is , of ik die _oe nu hoog of laag maakt ik zie niets veranderen bij het aansturen van het display...
wat moet er eigenlijk gebeuren als ik _oe laag laat , of hoog laat?
want dat zo betekenen dat er iets in de hardware fout is?
Als de OE laag staat is de display altijd enabled, dat wil zeggen dat je in de korte tijd dat je eerst het adres wijzigt en dan de latch bedient, schaduwpixels kan krijgen. Als het snel genoeg gaat is de intensiteit zo laag gemiddeld dat je dat niet ziet, maar die OE zit er niet voor niks op.
Als je de OE continu hoog knoopt is de geadresseerde displayrij nooit zichtbaar.
Je kunt de display vervangen door een andere en kijken of je je probleem dan nog steeds hebt.
Je kunt ook met software alleen de rij met je probleempixel aansturen met een 1 gevolgd door 31 nullen op het juiste adres, en dan vervolgens een latch geven. Dan brandt alleen de laatste LED.
Het moet in de software zitten, want qua hardware is het niet mogelijk dat een laatste 1 in het schuifregister alle vorige enen hoog maakt.
Ik ken dat pic basic niet. Ik werk alleen met assembler. Probeer maar op een andere wijze met pic bsic die laatste rij aan te sturen met een 1 en dan 31 nullen. Laat die andere rijen maar met rust, en kijk of dan na een latch alleen de laatste led brandt. Je kunt ook de latch voortdurend hoog maken en de rij van een 1 en 31 nullen er langzaam inklokken, halve seconde per klok of zo, dan zie je de brandende led naar rechts wandelen.
Die omzetter van pic basic naar hardware zal wel raar doen.
[Bericht gewijzigd door Henry S. op (99%)]
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
jamaar ik bedoel ik heb in mij programma deze dus:
display:
FOR x = 1 TO 4
IF y<9 THEN
SHOUT udat,clock,MSBFIRST,[data_display[next_8pixels]]
ELSE
SHOUT ldat,clock,MSBFIRST,[data_display[next_8pixels]]
ENDIF
next_8pixels=next_8pixels+1
NEXT x
_oe = 1'maak oe hoog(dit zet alle leds tijdelijk uit)
strobe=TRUE
strobe=FALSE
dummy=y-1
a0 = dummy.0 'zet [a2.. 0] naar y
a1 = dummy.1
a2 = dummy.2
_oe = 0 'maak oe laag
RETURN
een zitten rommelen.... met _oe altijd hoog, en altijd laag... maar zag geen verschil op me display.... dus dat betekend misschien al dat er iets in me hardware niet goed zit....?
en dat die _oe helemaal niet binnenkomt op het display....
Maar dat zou niet kunnen verklaren dat de hele 8 rijen alles aan gaat?
want wat jij zeg heb ik al geprobeerd.... maar dat is het probleem nu juist...
als ik de laatste led aanstuur... gaan er 8 rijen aan....
en wat bedoel met de omzetten van picbasic naar hardware? de proton compiler? dat die het niet goed doet?
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Dat programma, voor zover ik dat begrijp, is niet volledig. Er is geen initialisatie van y, als y<9 blijft y dat dan, als hij door 0 negatief gaat? In het voorbeeld wordt die next 8 pixels variabele altijd verhoogd in elke loop hij wordt niet teruggezet op 0 of 1.
Ik bedoelde dat je een 1 rij aanstuurt (de onderste) als proef en de variatie in adres eruit laat, de andere rijen doen dan niet mee.
Die rij in een loop vullen met 31 nullen en een 1, dan een latch,
dan stoppen. Dan moet de rechtsonderled blijvend branden.
Vervolgens (dan pas) dat verhaal periodiek herhalen, en kijken of het dan blijft werken. Dus geen volle rij aan.
Daarna twee rijen aansturen , alleen de onderste en een na onderste.
Daarbij zoveel mogelijk van je huidige pic programma gebruiken en kijken of dan die 2 rijen vol aangaan als je alleen de laatste kolom op 1 zet.
Zo ja, dan eens kijken of je met een alternatieve aansturing dat effect ook krijgt, ik bedoel niet met die shout, maar 32 variabelen declareren, waarvan er 31 0 zijn en een stuks 1.
Van al die varuabelen beurtelings alleen het laatste bit daadwerkelijk inschuiven door de klok daadwerkelijk hoog en laag te maken.
Een schema van de display is op internet te vinden op
http://www.forum.vrza.nl/
Nee, als je oe altijd hoog laat mag de display geen licht geven.
[Bericht gewijzigd door Henry S. op (99%)]
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
Het moet op een of andere manier aan die SHOUT functie liggen...
en nu heb ik die Shout zelf geschreven, althans... ik heb het volgende gemaakt:
display:
FOR x = 1 TO 4
FOR xbit=1 TO 8
clock=0
pulsuit=0
udat=0
ldat=0
SELECT xbit
CASE 1
IF data_display[next_8pixels]& 128 =128 THEN pulsuit=1
CASE 2
IF data_display[next_8pixels]& 64 =64 AND xbit=2 THEN pulsuit=1
CASE 3
IF data_display[next_8pixels]& 32 =32 AND xbit=3 THEN pulsuit=1
CASE 4
IF data_display[next_8pixels]& 16 =16 AND xbit=4 THEN pulsuit=1
CASE 5
IF data_display[next_8pixels]& 8 =8 AND xbit=5 THEN pulsuit=1
CASE 6
IF data_display[next_8pixels]& 4 =4 AND xbit=6 THEN pulsuit=1
CASE 7
IF data_display[next_8pixels]& 2 =2 AND xbit=7 THEN pulsuit=1
CASE 8
IF data_display[next_8pixels]& 1 =1 AND xbit=8 THEN pulsuit=1
ENDSELECT
IF y<9 THEN
udat=pulsuit
ELSE
ldat=pulsuit
ENDIF
clock=1
NEXT xbit
next_8pixels=next_8pixels+1
NEXT x
OE = 1'maak oe hoog(dit zet alle leds tijdelijk uit)
strobe=TRUE
strobe=FALSE
dummy=y-1
a0 = dummy.0 'zet [a2.. 0] naar y
a1 = dummy.1
a2 = dummy.2
OE = 0 'maak oe laag
RETURN
;------------------------------------------------------------------------------------------------------------------
InterruptAfhandeling: 'Uitlezen en leegschuiven van buffer gebeurt in hoofdprogramma
CONTEXT SAVE 'Only needed for 16bits devices
IF T0IF = 1 THEN ' Was it a Timer0 overflow that triggered the interrupt ?
y=y+1
IF y>16 THEN
y=1
next_8pixels=1
ENDIF
GOSUB display
T0IF = 0 'Clear the flag
CONTEXT RESTORE
ENDIF
en dan gaat het wel goed met de laatst pixel?
iemand enig idee?
LAATMAAR HEB HET GEVONDEN...
FOR x = 1 TO 4
udat=FALSE
ldat=FALSE
IF y<9 THEN
SHOUT udat,clock,MSBFIRST,[data_display[next_8pixels]]
ELSE
SHOUT ldat,clock,MSBFIRST,[data_display[next_8pixels]]
ENDIF
next_8pixels=next_8pixels+1
NEXT x
dus alleen die Udat en Ldat even laag gemaakt....
en ik denk dat het er zelfs maar 1 hoeft te wezen...
[Bericht gewijzigd door Arjan Swets op (33%)]
Mooi,
ik weet niet wat die shout syntax is.
Je had het verschijnsel in twee velden zowel boven als onder, dan zul je wel beide ldat en udat laag moeten maken, niet?
Ik heb geen idee waarom het nu wel werkt, die ldat usat is een initialisatie die niks met het laatste led in de laatste rij te maken heeft. Kun je dat uitleggen?
Dan nog wat, OE had geen invloed, dat kan niet kloppen, als je die voortdurend hoog zet mag je geen licht op je display krijgen.
Zet je hem voortdurend laag dan heb je mogelijk schaduwpixels, want als je eerst het adres wijzigt en dan latched staat de oude regel heel even op de nieuwe plaats (adres) en als je eerst latched en dan het adres wijzigt, staat de nieuwe regel heel even op de oude plaats.
Tijdens de operaties latch en wijzig adres moet dus de output OE disabled zijn.
[Bericht gewijzigd door Henry S. op (98%)]
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
Die _oe deed het in de hardware niet goed.... , heb ik gemaakt... maar daarmee had ik nog steeds het probleem dat bij de laatste pixel alles ging branden....
toen heb ik die SHOUT udat,clock,MSBFIRST,[data_display[next_8pixels]]eens zelf geschreven, en toen was het probleem weg...
en ik dacht, misschien
IF y<9 THEN
SHOUT udat,clock,MSBFIRST,[data_display[next_8pixels]]
ELSE
SHOUT ldat,clock,MSBFIRST,[data_display[next_8pixels]]
ENDIF
next_8pixels=next_8pixels+1
NEXT x
als Y groter wordt als 9 (dus de tweede rij) en bij de laatste pixel van rij 1 is Udat hoog gezet, deze hoog blijf staan..
maar weet het ook niet precies wat er nu fout aan was... maar ben blij dat het nu opgelost is...
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
ja ik weet dat het een oud topic is, maar misschien zijn er nog steeds mensen mee bezig.... (althans ik wel)
ik heb het nu aardig aan de gang....
maar zou het eigenlijk wel sneller vinden...
hier een paar filmpjes:
http://www.youtube.com/watch?v=kDmLE-lywt8
http://www.youtube.com/watch?v=_Ud8C-eC9tc
de beelden komen serieel uit de PC... Op de PC draait een VB programma, welke (animated) gif in kan lezen, en dan beeldtje voor beeldtje laat zien....
tis alleen jammer dat het net niet wat sneller gaat, maar de seriele communicatie kan niet sneller...
denk dat ik het nu eens via USB ga proberen...
zie voor het VB programma ook dit forum: http://www.vbib.be/PNphpBB2-viewtopic-t-7911.phtml
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Ziet er leuk uit. De aanhouder wint. En die 18F2455 kan toch harder dan 4Mhz?
Of zit de bottleneck bij PC-uC communicatie?
Arjan Swets
cnc filmpjes op Http://www.arjan-swets.com
intern draait hij op 48 mhz... maar het is de seriele communicatie...
1 display werkt als een speer.... maar met 6 is dit te traag....
dus.. nu ga ik een kijken hoe het met USB gaat....

