8x8 Lichtkrant met 2x 74HC595

Tinus016

Golden Member

Hoi mede Co users.

Ik ben ook weer eens aan het hobbyen met HC595 om een klein lichtkrantje te maken. Ik heb het al voor een deel werkend alleen vroeg ik mij af hoe ik mijn code simpeller kon maken. Na wat zoek werk kwam ik een post van sjors007 tegen. hij heeft iets gepost met arrays in grote lijnen kom ik hier wel uit, maar bij het verzenden van het spulletje loop ik vast. ik gebruik namelijk 2 HC595 ic's voor het aansturen van mijn display. Een voor de horizontale lijnen en een voor de verticale lijnen. Nou mijn vraag, zou iemand of hij zelf deze code nader toe kunnen lichten zodat ik het kan omturnen naar mijn situatie of heeft iemand een betere optie.

Dit is de post van sjors007 Klik

Dit heb ik Nu: Klik < Filmpje

En met deze code: Klik

Schema: van de HC595 Klik
www.tinuselectronics.nl Because DIY Electronics Matters!!!!
Tinus016

Golden Member

www.tinuselectronics.nl Because DIY Electronics Matters!!!!
De code is toch niet heel lastig? Ik vraag me alleen af waarom de for-next-lussen gebruikt worden. Volgens mij is dat alleen voor de vertraging en dan kan je beter een delay gebruiken.

De shout-functie is waarschijnlijk het deel dat je niet snapt...aangezien je wel de letters hebt kunnen wijzigen. De 595 werkt als volgt:
1. hoge of lage bit op datalijn
2. clock geeft een puls
3. volgende bit op de datalijn plaatsen
4. clock geeft weer een puls
enz.

Na 8 keer is één 595 gevuld. Aangezien je twee 595's gebruikt, moeten er in totaal 16 bits in en dus wordt door shout het bovenstaande 16 keer herhaald, zodat alle bits geladen zijn. Deze bits staan in een buffer en worden nog niet aan de uitgangen van de 595's doorgegeven. Dat gebeurt pas als je de latch even hoog maakt en dan weer laag. Het buffer wordt dan naar de uitgangen geplaatst en je leds gaan branden.

Om je programma een beetje compacter te houden, zou je de letters ook in de eprom van de pic kunnen zetten. Bij proton gebruik je daar edata voor. Vervolgens kan je de letters uit het eprom-geheugen halen met eread. Het grote voordeel van edata is dat het geen onderdeel is van het programma en dus het programmageheugen niet belast wordt met de letterdata. De edata-functie wordt door de programmer gebruikt tijdens het programmeren.De programmer plaatst dan de data in de eprom en niet het programma dat op de pic draait.
Als je alle letters van het alfabet wilt hebben, met grote en kleine letters heb je dus 52x8 bytes in het eprom-geheugen. Dit lukt dus helaas niet met een 628a.
Tinus016

Golden Member

Een delay werkt niet. Omdat je steeds er een nieuw rij er in moet laden en dat doe je met die FOR NEXT lus.

Over dat zenden met Sout, Dat lukt nu ook lekker. Ik zit alleen nog even met het probleem hoe een ik er een nieuwe letter in moet krijgen. Dat moet volgens mij bij karakterselecteren komen.

Kan iemand zeggen hoe je dat het handigst kan doen?

Dit is de code die ik nu heb:

pic basic code:
 
'****************************************************************
'*  Name    : LichtKrant                                        *
'*  Author  : Tinus                                             *
'*  Notice  : Copyright (c) 2011 www.electronicavantinus.nl     *
'*          : All Rights Reserved                               *
'*  Date    : 8-9-2011                                          *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEVICE 16F628A
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE
 
SYMBOL ON = 1 ;on
SYMBOL OFF = 0 ;Off
 
SYMBOL DataPin = PORTA.1
SYMBOL ClockPin = PORTA.0
SYMBOL latch = PORTA.7 
 
DIM Smily[9] AS BYTE
DIM LetterC[9] AS BYTE
DIM LetterO[9] AS BYTE
DIM Karakter[9] AS BYTE
 
DIM HC595a AS BYTE
DIM HC595b AS BYTE
DIM BD1 AS BYTE
DIM BD2 AS BYTE
DIM BD3 AS BYTE
DIM BD4 AS BYTE
DIM Rij AS BYTE
 
        ;01234567
PORTB = %00000000
TRISA = %00000000
TRISB = %00000000
 
CLEAR
 
;Arrays Vullen                      ;Arrays Vullen 
 
;Blij       12345678
Smily[1] = %00000000
Smily[2] = %01100110
Smily[3] = %01100110
Smily[4] = %00000000
Smily[5] = %00011000
Smily[6] = %01000010
Smily[7] = %00111100
Smily[8] = %00000000
 
;LetterC     ;12345678
LetterC[1] = %00000000
LetterC[2] = %01110000
LetterC[3] = %10001000
LetterC[4] = %10000000
LetterC[5] = %10000000
LetterC[6] = %10001000
LetterC[7] = %01110000
LetterC[8] = %00000000
 
;LetterO     ;12345678
LetterO[1] = %00000000
LetterO[2] = %01110000
LetterO[3] = %10001000
LetterO[4] = %10001000
LetterO[5] = %10001000
LetterO[6] = %10001000
LetterO[7] = %01110000
LetterO[8] = %00000000
 
 
GOTO Hoofdprogramma
 
;Subroutines
 
SelectRij:                          ;Rij selecteren
SELECT Rij            ;12345678
    CASE 1 : HC595b = %10000000
    CASE 2 : HC595b = %01000000
    CASE 3 : HC595b = %00100000
    CASE 4 : HC595b = %00010000
    CASE 5 : HC595b = %00001000
    CASE 6 : HC595b = %00000100
    CASE 7 : HC595b = %00000010
    CASE 8 : HC595b = %00000001
    END SELECT
RETURN
 
KarakterLaden:                      ;Karakters Laden
 
Karakter[1] = Smily[1]
Karakter[2] = Smily[2]
Karakter[3] = Smily[3]
Karakter[4] = Smily[4]              
Karakter[5] = Smily[5]
Karakter[6] = Smily[6]
Karakter[7] = Smily[7]
Karakter[8] = Smily[8]
 
RETURN
 
Scrollen:                           ;Scrollen
 
Karakter[1] = Karakter[1] << 1      ;Laatste bit in de rij, 1 plek terug zetten
Karakter[2] = Karakter[2] << 1      ;Laatste bit in de rij, 1 ....
Karakter[3] = Karakter[3] << 1      ;Laatste bit....
Karakter[4] = Karakter[4] << 1
Karakter[5] = Karakter[5] << 1
Karakter[6] = Karakter[6] << 1
Karakter[7] = Karakter[7] << 1
Karakter[8] = Karakter[8] << 1
 
RETURN
 
;Hoofdprogramma
 
Hoofdprogramma:                     ;Hoofdprogramma
 
GOSUB KarakterLaden                 ;Ga naar Karaktersladen
 
WHILE 1 = 1                         ;Oneindig herhalen
 
FOR Rij = 1 TO 8                    ;Uitvoeren totdat dispaly gevuld is. 
  INC BD1                           ;BD1 met één verhogen
    IF BD1 = 200 THEN               ;Als BD1 200 is dan..
    BD1= 0                          ;..BD1 is 0
    GOSUB Scrollen                  ;Naar Scrollen gaan
  ENDIF                             ;Einde Als
  GOSUB SelectRij                   ;Naar SelectRij gaan
  SHOUT DataPin, ClockPin, LSBFIRST, [HC595b, Karakter[Rij]]
  PULSOUT latch, 5                  
NEXT                                ;Volgende
 
WEND                                ;Terug naar Wend
 
END                                 ;Einde!!
 
www.tinuselectronics.nl Because DIY Electronics Matters!!!!
Ik bedoelde de for-next die 50x herhaald werd... Voor de verschillende rijen kan ik me voorstellen dat je een for-next neemt.

Zijn de problemen nu opgelost?

Voor de karakterselectie zou ik gebruik maken van de eprom...

[Bericht gewijzigd door Jeronimo_34 op 11 september 2011 00:39:38 (17%)]

Tinus016

Golden Member

O sorry verkeerd begrepen. Dat was om langere tijd het zelfde beeld te houden. Dat zou trouwens ook niet met een delay kunnen om dat het beeld gemultiplext wordt. En moet je dus met een een razend tempo de nieuwe regel steeds opnieuw door sturen.

Nee de problemen zijn nog niet opgelost.

Ik zit nog met het probleem hoe ik een nieuwe karakter moet selecteren en dan in de variable Karakter moet plaatsen. Verder werkt het scrollen ook nog niet zo lekker. De karakter de smily op dit moment, komt nu op in het midden en gaat dan naar links weg. Ik zou willen dat hij rechts binnen komt en dan links verdwijnt.

Later als dit werkt ga ik wel een alfabet op zetten en die dan in de eprom zetten. Maar ik wil het eerst zo proberen. kost misschien een paar regels code meer maar dat is nu nog niet zo erg. Of kan dat niet?
www.tinuselectronics.nl Because DIY Electronics Matters!!!!
Hey

Bedankt dat je mijn code gebruikt. Verder wil ik je graag helpen, als ik vanmiddag thuis ben zal ik het even duidelijk uitleggen. Uiteindelijk had ik het zo gemaakt dat ik op de computer d.m.v een eigen gemaakt programma de tekst kon invoeren in me programma. Ik zal thuis alles even uitleggen.

Mvg Sjors
...
Tinus016

Golden Member

Mooi! Super dat je dat wil doen! Ik wacht geduldig je antwoord af.
www.tinuselectronics.nl Because DIY Electronics Matters!!!!
Misschien kun je hier wat mee?

Ondanks de melding bovenaan is die code wel degelijk af en werkend, het is een "note to self" die ik vergeten ben te verwijderen...

Het is software voor op een MK124, dus zonder schuifregisters, maar hopelijk heb je er toch wat aan, wat betreft het letters opslaan/weergeven/tekst wijzigen gedeelte.
Eland Tgimboej / If a cluttered sign is the mind of... Let me order my desk first...
Tinus016

Golden Member

Bedankt Lucky Luke. Ik zal er morgen even naar kijken. Ik heb stiekem al wel gekeken maar morgen zal ik het nader bestuderen.
www.tinuselectronics.nl Because DIY Electronics Matters!!!!
Heey Tinus016

Het gene wat mijn programma doet is als volgt:


Dit is gewoon mijn 'Hoofdprogramma'
pic basic code:
    Main:
    For Row = 1 To 7
        Inc Teller
        If Teller = 200 Then
         Teller = 0
         GoSub Scrollen
         EndIf
         GoSub RowOn
         SHOut DataPin, ClockPin, msbfirst, [Variabele1[Row]] 
         PulsOut Latch, 5
         GoSub RowOut
    Next
GoTo Main


vanuit hier word 1 schuifregister voor de kolommen en 1 ULN2803 om de rijen aangestuurd. zoals je hier ziet is het een 'For..next' situatie die van 1 tot 7 telt. Dit zijn me rijen die om en om worden aangestuurd. afhankelijk van de teller stuur je elke rij dus aan maar ook welk ledje daarbij hoort. Dit word gedaan via 'Gosub Scrollen'

pic basic code:
Scrollen:
For Scroll = 1 To 7
    Select Tekst[Keuze]
     Case "A" : BD1 = LetterA[Scroll] : BitWaarde = 6
     Case "B" : BD1 = LetterB[Scroll] : BitWaarde = 6
     Case "C" : BD1 = LetterC[Scroll] : BitWaarde = 6
     Case "D" : BD1 = LetterD[Scroll] : BitWaarde = 6
     Case Else: BD1 = 0
    End Select
 
        Bitnr[0] = BD1.7
        Bitnr[1] = BD1.6
        Bitnr[2] = BD1.5
        Bitnr[3] = BD1.4
        Bitnr[4] = BD1.3
        Bitnr[5] = BD1.2
        Bitnr[6] = BD1.1
        Bitnr[7] = BD1.0                
 
        Variabele1[Scroll] = Variabele1[Scroll] << 1
        BD2 = Variabele1[Scroll] 
        BD2.7 = Bitnr[Loop]
        Variabele1[Scroll] = BD2
Next
 
    Loop = (Loop + 1)
    If Loop > BitWaarde Then 
     Loop = 0
     Keuze = (Keuze + 1)
     EndIf
    If Keuze > 4 Then Keuze = 0
Return


zoals je hier ziet is het weer een 'For..next' situatie. weer van 1 tot 7. dan komt het scrollgedeelte.
Het begint met 'Select tekst[keuze]' Tekst is de zin die je wilt laten zien op het display en keuze staat voor elke letter. Tekst moet dus een Array zijn, gevult met jouw tekst. Dus als je je display opstart staat keuze op 0. Stel dat je tekst = ABCD en keuze staat op 0 dan is dus de eerste letter die die pakt een A
Scroll is 1. Dus BD1 zoekt letter A, in dit geval is scroll 1, dus worden alle bitjes van letter A[1] in 'BitNr' gestopt.

Daarna kom je aan bij Variabele1 = Variabele1 << 1. Dit betekent dat alle bitjes in variabele1, 1 plek naar links schuiven, wat dus betekent dat je aan het scrollen ben. Na het verschuiven van 1 plek word het volgende bitje wat je dus heb geladen in 'BitNr' toegevoegd. Om ervoor te zorgen dat nu het 2e bitje van de letter komt is er een teller genaamd 'Loop' die bijhoudt welke 'BitNr' aan de beurt is.

pic basic code:
Case "A" : BD1 = LetterA[Scroll] : BitWaarde = 6

tevens word er achter elke letter een 'Bitwaarde' meegegeven. De bitwaarde bepaalt uit hoeveel bitjes een letter + spatie bestaat.
Als 'Loop' dus evengroot als 'Bitwaarde' is zal 'Keuze' dus met 1 worden verhoogt en zal loop weer 0 zijn. Nu Keuze is verhoogt zal de volgende letter op het display komen.

Uiteindelijk als Keuze groter is dan het aantal letters dat je in je zin heb zal deze weer opnieuw opstarten en kan je dus weer opnieuw beginnen.

Ik zelf had Keuze nog extra verhoogt zodat alle letters uit beeld waren. hoeveel je verhoogt is natuurlijk afhankelijk van hoeveel displays je hebt.

Verder lijkt het een gecompliceerd programma maar als je alle stappen goed leest en eventueel test zal je merken dat het opzich niet een heel moeilijk systeem is. Ik weet dat het misschien anders/makkelijker kan, maar ik heb hiervoor gekozen en het bevalt me goed.

Mijn lichtkrant werkt nog via dit systeem maar is wel hier een daar flink aangepast. had te maken met de Scroll manieren.
Mijn tekst was bij wijs van spreken zo opgebouwd: 'Hallo ik heet Sjors'

Voordat de tekst begon met scrollen had ik eerst geteld uit hoeveel letters me zin bestond. In dit geval 19 letters, dus is me keuze aantal is 19. Dan had ik zeg maar bij Sjors laten stoppen. dus bij keuze 14 moest ie wachten en dan na paar seconden liet ik Sjors naar beneden scrollen i.p.v. naar links. Zo zijn er natuurlijk vele mogelijkheden maar je moet eerst het idee erachter snappen.

De tekst werd ingevoerd via een eigen gemaakt computer systeem. Dit had ik gemaakt via Visual Basic. (helaas heb ik dit programma niet meer vanwege computercrash toen.) Maar het stelde niet veel voor hoor was alleen tekst invoeren en de Scroll tijd.
Het scrollen deed ik allemaal via het hoofdprogramma en de communicatie met PC deed ik via interrupts.

Mocht je nog meer vragen hebben dan hoor ik het wel.
Heb zelf de echte code ook niet meer vanwege crash maar ik kan je wel aardig eind op weg helpen. Uiteindelijk moet je gewoon paar dingen onthouden. Dat is welke letter je bent, daarvan moet je een weten welke bit je nodig heb. Als je hier een goede manier in vindt dan kan je allerlei manieren van scrollen verzinnen.

MVG Sjors
...
Tinus016

Golden Member

Allereerst bedankt! voor de moeite die je er in steekt/wil stekken.

Ik heb nu jou programma in mijn pic geprogrammeerd echter nu ik hem opstart gebeurt er helemaal niets. er gaat niet een led aan. Ik heb alle verbindingen ook al getjekt en een HC595 vervangen maar dat wil niet baten. wat kan het zijn?

Edit: Na wat metingen blijkt dat ik alleen op kanaal 8 van de hc595 signaal heb

[Bericht gewijzigd door Tinus016 op 14 september 2011 23:35:08 (12%)]

www.tinuselectronics.nl Because DIY Electronics Matters!!!!
Post eens welk stukje code je hebt gebruikt. Het stukje wat ik had neergezet is nog lang niet alles hoor.
Hoeveel display wil je gaan gebruiken? Ik wil wel een klein programmatje schrijven voor je maar je moet het idee achter scrollen snappen

Mvg Sjors
...
Tinus016

Golden Member

O Ik ging er deels van uit je code helemaal werkte. En dat scrollen snap ik nu al wat beter. Als het goed is doet het dit:

Eerst selecteert hij een karakter (letter) dan zet hij een bit in variabele1 1 of nul. deze wordt getoond Dan wordt deze een plek opgeschoven en zet hij er weer en bit in en dat doet hij bij alle 7 rijen. enzo....

Edit: Uit eindelijk is het de bedoeling hier 4 8x8 displays op aan te sluiten.


Dit is De Code.

pic basic code:
 
DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE         
 
 
SYMBOL AAN = 1
SYMBOL UIT = 0
 
SYMBOL Rij1         = PORTB.0
SYMBOL Rij2         = PORTB.1
SYMBOL Rij3         = PORTB.2
SYMBOL Rij4         = PORTB.3  
SYMBOL Rij5         = PORTB.4    
SYMBOL Rij6         = PORTB.5
SYMBOL Rij7         = PORTB.6
SYMBOL DataPin      = PORTA.2
SYMBOL ClockPin     = PORTA.1
SYMBOL Latch        = PORTA.0 
 
DIM Loop        AS BYTE
DIM Keuze       AS BYTE
DIM BD1         AS BYTE
DIM BD2         AS BYTE
DIM BD3         AS BYTE
DIM BitWaarde   AS BYTE
DIM Scroll      AS BYTE
DIM Row         AS BYTE
DIM Teller      AS BYTE
 
DIM LetterA[8]  AS BYTE
DIM LetterB[8]  AS BYTE
DIM LetterC[8]  AS BYTE
DIM LetterD[8]  AS BYTE
 
DIM Variabele1[8] AS BYTE
DIM Tekst[15]     AS BYTE
DIM Bitnr[8]      AS BYTE
 
TRISA = %00000000
TRISB = %00000000
 
Keuze = 0
Loop = 0    
 
STR Tekst = "ABCD"
 
GOSUB KaraktersLaden
 
Main:
    FOR Row = 1 TO 7
        INC Teller
        IF Teller = 200 THEN
         Teller = 0
         GOSUB Scrollen
         ENDIF
         GOSUB RowOn
         SHOUT DataPin, ClockPin, MSBFIRST, [Variabele1[Row]] 
         PULSOUT Latch, 5
         GOSUB RowOut
    NEXT
GOTO Main 
 
END
 
RowOut:
SELECT Row
    CASE 1 : Rij1 = UIT
    CASE 2 : Rij2 = UIT
    CASE 3 : Rij3 = UIT
    CASE 4 : Rij4 = UIT
    CASE 5 : Rij5 = UIT
    CASE 6 : Rij6 = UIT
    CASE 7 : Rij7 = UIT
    END SELECT
RETURN
 
RowOn:
SELECT Row
    CASE 1 : Rij1 = AAN
    CASE 2 : Rij2 = AAN
    CASE 3 : Rij3 = AAN
    CASE 4 : Rij4 = AAN
    CASE 5 : Rij5 = AAN
    CASE 6 : Rij6 = AAN
    CASE 7 : Rij7 = AAN
    END SELECT
RETURN
 
Scrollen:
FOR Scroll = 1 TO 7
    SELECT Tekst[Keuze]
     CASE "A" : BD1 = LetterA[Scroll] : BitWaarde = 6
     CASE "B" : BD1 = LetterB[Scroll] : BitWaarde = 6
     CASE "C" : BD1 = LetterC[Scroll] : BitWaarde = 6
     CASE "D" : BD1 = LetterD[Scroll] : BitWaarde = 6
     CASE ELSE: BD1 = 0
    END SELECT
 
        Bitnr[0] = BD1.7
        Bitnr[1] = BD1.6
        Bitnr[2] = BD1.5
        Bitnr[3] = BD1.4
        Bitnr[4] = BD1.3
        Bitnr[5] = BD1.2
        Bitnr[6] = BD1.1
        Bitnr[7] = BD1.0                
 
        Variabele1[Scroll] = Variabele1[Scroll] << 1
        BD2 = Variabele1[Scroll] 
        BD2.7 = Bitnr[Loop]
        Variabele1[Scroll] = BD2
NEXT
 
    Loop = (Loop + 1)
    IF Loop > BitWaarde THEN 
     Loop = 0
     Keuze = (Keuze + 1)
     ENDIF
    IF Keuze > 4 THEN Keuze = 0
RETURN
 
KaraktersLaden:
;Letter A
LetterA[1] = %00100000                
LetterA[2] = %01010000
LetterA[3] = %10001000
LetterA[4] = %10001000
LetterA[5] = %11111000
LetterA[6] = %10001000
LetterA[7] = %10001000
 
;Letter B
LetterB[1] = %11110000 
LetterB[2] = %10001000 
LetterB[3] = %10001000 
LetterB[4] = %11110000 
LetterB[5] = %10001000
LetterB[6] = %10001000
LetterB[7] = %11110000
 
'Letter C
LetterC[1] = %01110000
LetterC[2] = %10001000
LetterC[3] = %10000000
LetterC[4] = %10000000
LetterC[5] = %10000000
LetterC[6] = %10001000
LetterC[7] = %01110000
 
;Letter D
LetterD[1] = %11110000
LetterD[2] = %10001000
LetterD[3] = %10001000
LetterD[4] = %10001000
LetterD[5] = %10001000
LetterD[6] = %10001000
LetterD[7] = %11110000
RETURN
 
www.tinuselectronics.nl Because DIY Electronics Matters!!!!
sdk
Hoi, misschien heb je hier ook iets aan, in grote lijnen hoe je met double buffering en een interrupt routine een mooie smooth en flikkervrije scrolltekst kan maken:


code:

buffer 1:

  0 1 2 3 4 5 6 7 kolom
0 . . . . . . . . 
1 . . . . . . . . 
2 . . . . . . . . 
3 . . . . . . . . 
4 . . . . . . . . 
5 . . . . . . . . 
6 . . . . . . . . 
7 . . . . . . . . 
rij

buffer 2:

  0 1 2 3 4 5 6 7 kolom
0 . . . . . . . . 
1 . . . . . . . . 
2 . . . . . . . . 
3 . . . . . . . . 
4 . . . . . . . . 
5 . . . . . . . . 
6 . . . . . . . . 
7 . . . . . . . . 
rij

[hr]

karakter A:

  0 1 2 3 4 5 6 7 kolom
0 . . . X X . . . 
1 . . X . . X . . 
2 . X . . . . X . 
3 . X . . . . X . 
4 X . X X X X . X 
5 X . . . . . . X 
6 X . . . . . . X 
7 X . . . . . . X 
rij

-----------------------------------------------------------------

buffer, karakter: array[8]. array[0] is kolom 0, array[7] is kolom 7.

-----------------------------------------------------------------

A - main

0. i = 0; 
1. kopieer kolom i van karakter naar buffer 1 kolom 7.
2. zet buffer 1 als display buffer 
3. buffer2[x] = buffer1[x+1] voor x = 0 t/m 6.
4. i = i + 1
5. kopieer kolom i van karakter naar buffer 2 kolom 7.
6. zet buffer 2 als display buffer
7. buffer1[x] = buffer2[x+1] voor x = 0 t/m 6.
8. i = i + 1
9. als i<8 ga naar 1
10. wissel karakter.
11. ga naar 0


B - interrupt

display buffer herhaald naar buiten schrijven 

1. elk bit uit buffer(1 of 2)[x] naar register schrijven, daarna latchen, 
   voor x = 0 t/m 7



Je hebt twee buffers (1 en 2) waartussen steeds gewisseld wordt. Dit moet in de interrupt routine gedaan worden na elk compleet beeld.
Makkelijkst is om in de main een vlag te zetten 'wissel buffer', die steeds nadat de interrupt klaar is met een compleet beeld gechecked wordt. Als die vlag dan gezien is, veranderd de interrupt routine de buffer nummers, en wist de vlag weer. In de main wacht je, nadat je de vlag gezet hebt, totdat hij weer gewist is.

code:
buffer 1:

  0 1 2 3 4 5 6 7 kolom
0 . . . . . . . . 
1 . . . . . . . . 
2 . . . . . . . . 
3 . . . . . . . . 
4 . . . . . . . X 
5 . . . . . . . X 
6 . . . . . . . X 
7 . . . . . . . X 
rij

buffer 2:

  0 1 2 3 4 5 6 7 kolom
0 . . . . . . . . 
1 . . . . . . . . 
2 . . . . . . . X 
3 . . . . . . . X 
4 . . . . . . X . 
5 . . . . . . X . 
6 . . . . . . X . 
7 . . . . . . X . 
rij

buffer 1:

  0 1 2 3 4 5 6 7 kolom
0 . . . . . . . . 
1 . . . . . . . X 
2 . . . . . . X . 
3 . . . . . . X . 
4 . . . . . X . X 
5 . . . . . X . . 
6 . . . . . X . . 
7 . . . . . X . . 
rij

buffer 2:

  0 1 2 3 4 5 6 7 kolom
0 . . . . . . . X 
1 . . . . . . X . 
2 . . . . . X . . 
3 . . . . . X . . 
4 . . . . X . X X 
5 . . . . X . . . 
6 . . . . X . . . 
7 . . . . X . . . 
rij



enzovoort.

Edit:

De interrupt kun je beste op kolombasis maken. Stel je hebt 8 kolommen per beeld en het beeld moet met 100Hz ververst worden. Per kolom heb je dan 10ms/8 = 1.25ms. De interrupt moet dus op 800Hz (of wat daar in de buurt zit wat makkelijk is in te stellen met een timer-interrupt). Je selecteert de rij, klokt die kolom met een for lus in de 595 en latcht, hoogt de rij op, kijkt of het beeld klaar is, check de vlaggen, etc. - daar heb je met 1.25ms meer dan ruim de tijd voor.
'because you are good children, the monsters have looked forward to your make believe visit'
Mijn software werkt met 1 buffer, van 1 byte per kolom.

Er is een subroutine (zou ook een timer interrupt routine kunnen zijn) die de buffer op het scherm (de leds) laat zien.

Het programma kijkt in een lookuplist / eeprom array, waarin staat welke letter het moet hebben, of eigenlijk: Waar het die letter kan vinden. (pointer tabel)

Er is een 2e lookuplist maar nu in flash, waarin die letters staan. (font tabel)

Daarvan wordt dan telkens het door de 1e array aangewezen byte naar de buffer gekopierd, waarbij elk byte in de buffer 1 plaatje opschuift. (Door dat opschuiven wordt het scrolleffect verkregen).

En vervolgens wordt de sub aangeroepen die de buffer op de LED's laat zien.

De pointer tabel valt te wijzigen, zo valt de tekst in te stellen.

(Dit alles zonder terug te kijken naar m'n code dus foutjes voorbehouden)
Eland Tgimboej / If a cluttered sign is the mind of... Let me order my desk first...