Hier meer informatie omtrent het scrollen.

Ik kwam terecht op deze simpele scroller formule:


adrs = counter + pointer


'adrs' is het register die het adres leest waar de data moet worden opgehaald, 'counter' is een bit-teller welke rondtelt van 0 t/m 4 (5 kolommen), en 'pointer' is het register welke om de zoveel beeldjes met een ophoogt. Het programma start vanaf nul, zodoende zijn 'counter' en 'pointer' beide nul in de eerste ronde, en wordt de eerste data van de rijen voor de eerste kolom gelezen van het eerste (0) adres. Wat ook moet gebeuren is een routine die ophoogt met een nadat 'counter' op nul komt, op dat moment is er een beeldje opgebouwd (1 beeldje = 1 karakter) en onthoudt dat getal telkens. De volgende ronde zal 'counter' 1 worden, en zal 'adrs' dus ook ophogen naar 1, omdat 'pointer' om de zeg 25 keer (25 beeldjes) ophoogt, dus na 25 keer zal 'pointer' een omhoog gaan, en dan zal de eerste ronde er zo uitzien: adrs = 0 + 1 = 1, in de tweede ronde zal dat 2 zijn, dus je ziet dat het lezen van het adres (EEPROM/flash) telkens een positie opschuift, omdat je om de 25 keer met 1 ophoogt (add). Je kan ook achterstevoren laten scrollen, verlaag (dec) simpelweg in de routine waar de 'pointer' word getelt elke zoveel beeldjes. Probeer ervoor te zorgen dat het hele programma er circa 25 msec over doet om te doorlopen, dit zal het display rond de 40Hz doen vernieuwen. Hieronder een aantal foto's van een scrollende 'R' over de display:


frame 1frame 2frame 3frame 4frame 5
Klik hier voor een animatie (124kB), of klik hier voor een AVI filmpje (1MB)


Zoals je ziet kon mijn webCAM (CAM snelheid ingesteld op 30 fps trouwens) het 4de beeldje niet geheel goed vastleggen, op dat moment verschoof de 'R' net een positie naar links (de 'pointer' hoogde op dat moment op met een) Wat je hier ziet zijn 10 EEPROM adressen gevult, zoals hieronder, met data:

.ESEG
table:

.db 0b00000000 ;address 0
.db 0b00000000 ;address 1
.db 0b00000000 ;address 2
.db 0b00000000 ;address 3
.db 0b00000000 ;address 4
.db 0b01111111 ;address 5
.db 0b00001001 ;address 6
.db 0b00011001 ;address 7
.db 0b00101001 ;address 8
.db 0b01000110 ;address 9

Ik heb de data 90 graden gedraaid in het EEPROM geheugen, zodat je heel simpel de data voor de rijen kan pakken, elk EEPROM adres is een rij data, dus een karakter heeft 5 adressen nodig (5 bytes) Deze data word dan op PORTB van de AT90S2313 geplaatst op het moment dat de kolom geaktiveerd is. Op het moment dat de 'R' op het display is gescrollt, scroll je em gelijk weer terug, zodat het karakter heen en weer gaat bewegen (zie animatie), je kan een heleboel truuken uithalen bijv. gewoon naar links scrollen laten (westerse tekst is links bewegend), achterstevoren, omhoog- en/of omlaag, zelfs diagonaal in elke richting is mogelijk, of je kan symbolen of ikonen ontwerpen welke bijv. bewegen onder het scrollen, de mogelijkheden zijn zowat eindeloos.



Hoe verkrijg je de volle intensiteit uit de displays ?

Het aftasten van de LED's (beeldpunten) van een dotmatrix display neemt 25 msec (40Hz herhaalfrekwentie) in beslag, zodoende is elke punt aan voor 5 msec (of uit als de data '0' is), omdat elke kolom voor 5 msec aan is. Elke punt heeft 10 mA constante stroom nodig, maar als deze aan en uit gaat met een hoge snelheid zal de intensiteit afnemen, dus zul je meer stroom door de beeldpunten moeten gaan voeren om hetzelfde effect te bereiken (zelfde als bij 0Hz) Het verhogen van de stroom kan worden gedaan met transistoren of een speciaal IC (zoals de ULN2803, etc.) De beeldpunten hebben een puls-pauze verhouding van 20%, elke punt is aan voor 20% van de totale herhaalfrekwentie (Tref = 25 msec), dus 5 msec aan en 20 msec uit (zie volgende afbeelding):

puls-pauze beeldpunten


Maar de aan / uit tijd van elke beeldpunt is 5 msec -> aan voor 5 msec, dus dat is maar 5/1000ste van een seconde! Hoeveel stroom is er nu nodig om dezelfde lichtintensiteit te verkrijgen ? Hier een formule die je kan gebruiken:

I-led = T-tot / Aan-tijd * Normale stroomsterkte


Waar T-tot = de tijd van begin ene puls naar begin opvolgende.
Aan-tijd = de tijd dat de beeldpunt (LED) werkelijk aan is.
Normale stroomsterkte = de stroom die de beeldpunt constant aan kan (zie datasheet dotmatrix display)

In dit projekt zal dat zijn:

De normale stroomsterkte = 10 mA per beeldpunt, de nieuwe stroomsterkte moet worden: 25 msec / 5 msec * 10 mA = 50 mA. Zodoende moet de stroom 5 keer hoger zijn om dezelfde LED instensiteit te krijgen. De spanning Vf over een beeldpunt, zal gemiddeld lager zijn (PBM type signaal op elke beeldpunt) Voor versterking kun je een simpele transistor nemen zoals de BC327/BC337. De weerstanden moeten worden berekend (niet nodig, heb ik al gedaan), omdat je geen kale transistor kan nemen, want de basisstroom moet binnen de perken blijven d.m.v. een weerstand, anders zal de transistor kapot gaan. Hier een schema voor het aansturen van een enkele beeldpunt:

stroomsterkte door een beeldpunt van een dotmatrix display


Je kan ook een voordelige transistor nemen (BC337 en R's) inplaats van de ULN2003A indien je echt voor low-cost wilt gaan, maar de print zal een stuk lastiger te ontwerpen zijn (meer spoortjes, aangezien elke transistor 3 pinnen heeft), het voordeel van de ULN2003A is dat dit IC tot max. 500 mA per poort kan voeren. De 74HC595 stuurt de kolommen (5 per dotmatrix display) via de ULN2003A stroomgever, de AVR de 7 rijen (karakter data), je kan niet rechtreeks de i/o poorten van de AVR pakken, omdat deze maximaal maar 20 mA kunnen geven, en de beeldpunten hebben 50 mA elk nodig, bij deze schakelsnelheid (40 Hz)

[terug naar boven]