al meer nieuws? ik heb ook zo'n scherm thuis :)

Op 26 augustus 2008 16:35:48 schreef Dutchboy.:
Vast iets fout gegaan :S
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

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 = Tijd

Dit 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.

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

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
 
RETURN

Als 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.

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%)]

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%)]

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....


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?

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?

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%)]

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?

Als ik zo je verhaal hoor, dan denk ik aan een kortsluiting in de hardware.

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%)]

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%)]

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...

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...

http://www.arjan-swets.com/photos/display_groot.jpg

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

Ziet er leuk uit. De aanhouder wint. En die 18F2455 kan toch harder dan 4Mhz?
Of zit de bottleneck bij PC-uC communicatie?

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....