Stap 4: Software
De truc
Ja, net als alles, er is een truc. De truc is dat er nooit meer dan 8 LEDs verlicht op een bepaald moment.
Voor dit goed te werken, een beetje crafty programmering nodig. Het concept dat ik heb gekozen is het gebruik van een timer-interrupt. Hier is de werking van de interrupt display in plain Engels:
- Timer telt tot een bepaald punt, wanneer de interrupt service routine bereikt wordt uitgevoerd.
- Deze routine beslist welke rij is de volgende dia moet worden weergegeven.
- De informatie voor de volgende rij wordt opgezocht in een buffer en verschoven naar het kolom-stuurprogramma (deze informatie is "vergrendeld", dus het is niet nog niet weergegeven).
- De rij-stuurprogramma is uitgeschakeld, geen LEDs zijn momenteel verlicht.
- Het stuurprogramma van de kolom is "vergrendeld" maken in de informatie die we verschoven in twee stappen geleden de huidige informatie weer te geven.
- De rij-driver biedt dan huidige naar de nieuwe rij die we bekijken.
- Het programma voor interrupt service routine wordt beëindigd en keert terug naar normale doorstroming tot de volgende interrupt.
Dit gebeurt heel erg snel. De interrupt wordt gegenereerd elke 1 mSec. Dit betekent dat we de hele weergave over eens elke 8 bent vernieuwd mSec. Dit betekent een display-tarief van ongeveer 125Hz. Er is enige bezorgdheid met betrekking tot helderheid omdat we in wezen de LED's op een 1/8 duty cycle (ze zijn uitgeschakeld 7/8 van de tijd) worden uitgevoerd. Ik krijg in mijn geval een voldoende helder display met geen zichtbare knipperen.
De volledige LED-display in een array is uitgestippeld. Tussen onderbreekt de array kan worden gewijzigd (Wees bewust van atomiciteit) en zal tijdens de volgende interrupt verschijnen op het display.
De specifieke kenmerken van het schrijven van code voor de AVR microcontroller en over het schrijven van code om te praten met de shift-registers valt buiten het bestek van dit instructable. Ik heb de broncode (geschreven in C en gecompileerd met AVR-GCC) opgenomen evenals het hex bestand rechtstreeks programmeren. Ik heb alle code gereageerd zodat u kundig voor toepassing zulks zitten moet te helderen eventuele vragen over hoe om gegevens in het register van de verschuiving en hoe de rij vernieuwen werkt.
Houd er rekening mee dat ben ik met behulp van een lettertypebestand dat kwam met de ks0108 universele C bibliotheek. Die bibliotheek kan hier worden gevonden: http://en.radzio.dxp.pl/ks0108/
Update:
Shift Registers: Hoe
Ik heb besloten om toe te voegen een beetje over hoe te programmeren met shift registers. Ik hoop dat dit wist dingen voor degenen die nog niet gewerkt met hen voor.
Wat ze doen
Shift Registers nemen een signaal van een draad en output die informatie op veel verschillende pinnen. In dit geval is er één draad van de gegevens die in de gegevens en 8 pinnen die zijn gecontroleerd, afhankelijk van welke gegevens heeft ontvangen. Om dingen beter, is er een outpin voor elke shift register dat kan worden aangesloten op de ingang pin van een ander shift register. Dit heet trapsgewijze en maakt de uitbreiding potentiële een bijna onbeperkte vooruitzicht.
De Control pennen
Shift registers hebben 4 pinnen van de controle:
- Klink - deze pin vertelt het shift register wanneer het tijd is om over te schakelen naar de nieuw ingevoerde gegevens
- Gegevens - de 1's en 0's vertellen het shift register welke pinnen te activeren worden ontvangen op deze pin.
- Klok - dit is een puls verzonden vanaf de microcontroller die vertelt het shift register naar de volgende stap in het communicatieproces gaan en neem een lezing van gegevens
- Inschakelen uitgang - dit is een aan/uitschakelaar, hoog = op, laag = Off
Het maken van het doen van uw biedingen:
Hier is een spoedcursus in de werking van de bovenstaande controle pinnen:
Stap 1: Set klink, Data en Clock laag
- De klink laag instelt vertelt het shift register, dat wij zijn bezig met het schrijven.
Stap 2: Instellen Data pin aan de logica-waarde die u wilt verzenden het Shift register
Stap 3: Klok instellen pin hoog, vertellen de Shift Register te lezen in de huidige waarde van de Data-pin
- Alle andere waarden op dit moment in het Shift Register wordt verplaatst door 1 plaats, ruimte voor de huidige waarde van de logica van de Data pin.
Stap 4: Instellen van de klok pin laag en herhaal stap 2 en 3 totdat alle data is verstuurd naar het shift register.
- De pin klok moet laag worden ingesteld voordat u naar de volgende gegevenswaarde. Deze pin tussen hoge en lage wisselen is wat creëert de "klok pulse" de verschuiving registreren moet weten wanneer te verplaatsen naar de volgende stap in het proces.
Stap 5: Set klink hoge
- Dit vertelt het shift register alle van de gegevens die heeft verschoven in te nemen en gebruik deze om het activeren van de pennen. Dit betekent dat u niet gegevens ziet zoals het verschuift in; geen verandering in de output pinnen tot de hendel optreden zullen hoog is ingesteld.
Stap 6: Instellen in staat stellen uitvoer hoge
- Er zullen geen pin-uitvoer tot de uitvoer van de pagina is ingesteld op hoog, ongeacht wat er gebeurt met de andere drie pinnen controle.
- Deze pin kan altijd worden overgelaten aan hoge indien gewenst
Trapsgewijs
Er zijn twee pennen die u voor trapsgewijze, Os en Os1 gebruiken kunt. OS is voor snel stijgende klokken en Os1 is voor langzaam stijgende klokken. Haak deze pin aan de pin van de gegevens van het volgende shift register en de overloop van deze chip zal worden opgenomen in de volgende.
Einde van update
Aanpakken van het display
In het voorbeeldprogramma die ik heb gemaakt een array van 8 bytes, genaamd [row_buffer]. Elke byte correspondeert met één rij van de 8 x 8 display, rij 0 wordt de onderkant en rij 7 wordt de top. De minst significante bits van elke rij ligt aan de rechterkant, de meest significante bit aan de linkerkant. De weergave aanpassen is net zo eenvoudig als het schrijven van een nieuwe waarde aan de array van die gegevens, de interrupt service routine zorgt ervoor dat de weergave wordt vernieuwd.
Programmering
Programmering zal niet hier in detail besproken worden. Ik zou u geen gebruik van een DAPA programmeer kabel volgens dat u zal zitten onvermogend voor de chip program, als het eenmaal op 12MHz draait te waarschuwen. Alle andere standaard programmeurs moeten werken (STK500 MKII, Dragon, Parallel/serieel programmeurs, enz.).
Zekeringen:
Zorg ervoor dat de zekeringen te gebruiken van de 12MHz kristal program
hfuse: 0xC9
lfuse: 0xEF
In actie
Eenmaal je programma de chip het scherm moet schuiven een 'Hello World!'. Hier is een video van de LED-matrix in acties. De videokwaliteit is vrij laag, zoals u dit met de VideoEigenschap van de mijn digitale camera's en niet een goede video of webcam heb ik gemaakt.