Mina 2 - holoclock (2 / 6 steg)
Steg 2: Ljusreglering algoritmen - charliplexed pulse bredd modulering
Se videon för en demonstration. I middleis är nya mina klockan, till höger den äldre mina. Märke hur mycket trevligare den nya är.
(FYI den andra visas i bakgrunden är min Minicray superdator statusvisning och min fångade Nebulon partikel som driver Minicray i ett antimateria magnetisk inneslutning fält. Se här:
http://www.youtube.com/watch?v=bRupDulR4ME
för en demonstration av nebulon isolering kammaren)
Om du ser i koden, öppna filen display.c. Notera det finns fyra matriser för kartläggning av tris/port värdena för att belysa eventuella särskilda array och två matriser (en mer än mikro koden) för att definiera vilka lysdioder bör belysas för något särskilt mönster av lysdioder.
t.ex.:
LED1 LED2 LED3.. .unsigned char LEDS_PORTA [31] = {0x10, 0x00, 0x00,.. .unsigned char LEDS_TRISA [31] = {0xef, 0xff, 0xff,.. .unsigned char LEDS_PORTB [31] = {0x00, 0x02, 0x04,.. .unsigned char LEDS_TRISB [31] = {0xfd, 0xf9, 0xf9,.. .unsigned char nLedsA [30], unsigned char nLedsB [30].
För att lysa upp LED1 till exempel, måste du ange TRIS register TRISA:B = 0xef:0xfd och PORT register PORTA:B = 0x10:0x00 och så vidare. Om du skriver ut tris värdena i binär noterar du att åt gången, det finns bara två utgångar aktiveras. Den andra är redo att Tri-state (därav TRIS register). Detta är centralt för charlieplexing. Du kommer också att notera att en utgång är alltid en logisk '1' och den andra är alltid en logisk '0'... riktningen som tänds LED infaller mellan dessa två utgång linjer.
Det senaste värdet i port/tris matriser är ett null-värde till vända på ingen LED alls.
I mikro cyklade funktionen update_display kontinuerligt genom en annan array (nLeds[]) att se om det särskilt LED var som skall belysas. Om det var, då var motsvarande tris/port värden set och LED belysta under en tid. Annars värdet null skickades till PICs TRIS/PORT registrerar och ingen LED var upplyst under en tid. När gjort tillräckligt snabbt detta gav ett mönster. Resten av programmet skulle regelbundet läsa RTC värden och göra upp en trevlig slumpmässiga mönster i arrayen... och så displayen ändras.
För att göra en ljusreglering funktion, utökades detta något så att efter 30 lysdioderna var antingen upplyst (eller inte) sedan extra perioder skulle spenderas på att skicka null-värden om displayen var att vara nedtonade... för full ljusstyrka då ingen extra perioder skulle spenderas. När upprepade om det fanns en massa null perioder till de belysta lysdioderna, skulle den vara dim. I praktiken är multiplexering pulse bredd modulering... eller eftersom hårdvaran är konfigurerad i en charlieplex arrangemang, sedan charlieplexed puls bredd modulering.
Det andra diagrammet nedan visar den grundläggande installationen för detta. Jag kallar detta en scan ram. De första 30 perioderna till ram används för att gå igenom lysdioderna... och ett varierande antal extra perioder definiera hur dim skärmen kommer att vara. Denna cykel upprepas. Mer null perioder innebär mindre tid för en LED att vara på per bildruta (eftersom antalet perioder ökade). Observera den vertikala axeln inte betyder jämn spänning. Stiften kommer att lysdioderna verkliga tillstånd varierar beroende på den position i de charlieplex array... i diagrammet det betyder bara på eller av.
Detta innebar också den totala längden på ramen i tid också ökat, vilket minskar uppdateringsfrekvensen. Lysdioderna fick dimmer, skulle de börjar flimra alltså. Så är denna metod användbar endast i omfattningen. För klockan var det OK.
En funktion kallas intermittantly som läser A/D-omvandlare på bild och anger detta ljusstyrkan. Om du läser koden, också kontrollerar den om LED närmaste LDR är på, och inte gör någon nivå fastställa om så är fallet, detta stannar visningen oväntat brighting när mönstret ändras.
Argt blekna nästa funktion.