Stap 4: Software
De broncode in de 12F609 is echt ingewikkeld. Ik ben met behulp van ooit laatste geheugenlocatie! Alle 64 bytes hebben zijn verbruikt door mijn code. Ik heb een maar liefst 32 bytes van flash links over als reserve. Dus, ben ik met behulp van 100% van de RAM en 97% van de flitser. Echter, het verbazingwekkend hoeveel functionaliteit krijgt u voor alles wat complexiteit.
Mededeling aan elk licht is gearchiveerd door acht-byte gegevenspakketten te sturen. Elk gegevenspakket eindigt met een controlesom - dus echt, er is zeven bytes aan gegevens plus een definitieve controlesom. Met 9600 baud neemt een gegevenspakket iets meer dan 8 milliseconden te komen.
De truc is voor multitasking terwijl het pakje bytes is aankomst. Als een van de LED's zijn actief met een PWM-signaal, de output PWM moeten houden bijgewerkt zelfs tijdens het ontvangen van nieuwe packet bytes. Dat is de truc. Het kostte me weken en weken dit uitzoeken. Ik heb een enorme hoeveelheid tijd werken met mijn Logiport LSA proberen te volgen van elke bit. Dit is een aantal van de meest ingewikkelde code die ik ooit heb geschreven. Het is omdat de micro net zo beperkt is. Op de micros die meer krachtige er makkelijk los/eenvoudig code schrijven en hebben de snelle micro rip erdoor zonder klagen. Met de 12F609, een losse code met kost je veel. Alle micro broncode is geschreven in C met uitzondering van de interrupt service routine.
Waarom hebben dergelijke grote gegevenspakketten die kunt u vragen. Nou, omdat we willen dat de LEDs-oprit op en neer op hun eigen overeenstemming. Zodra een profiel van de oprit is ingeladen, kan de LED gaan uit en start speedramp zelfs terwijl nieuwe opdrachten ontvangen voor een andere LED. Elke lamp heeft ontvangen en decoderen van alle data packet verkeer, zelfs als het pakket is niet bedoeld voor het.
Een LED-profiel bestaat uit een niveau start, start wonen tijd, oprit tarief, top niveau, bovenaan nadruktijd, helling omlaag tarief, onderste niveau. Zie telpatroon gekoppeld. Wow, dat is veel voor een LED. Nu vermenigvuldig dat maal het aantal LEDs. Het wordt te veel - ik kon alleen bijhouden van drie LEDs met volledige oprit profielen. De vierde (witte LED op de dev-bord) heeft alleen helling van/naar vermogen. Het is een compromis. Neem een kijkje op de bijgevoegde foto van een helling-profiel.
Het PWM-signaal is gegenereerd uit een timer die wordt uitgevoerd op 64uS per teek. De 8-bits timer rolt over elke 16.38mS. Dit betekent dat het PWM-signaal wordt uitgevoerd op 61.04 Hz. Dit is niet goed voor video te onttrekken! Dus, ik gebruikte een truc van de software en sprong een paar van extra graven in de timer het strekken tot 60Hz. Dit maakt de video te onttrekken kijken veel beter.
Op elke roll-over van de PWM-timer (16.67mS) update ik de oprit Profiel(en). Daarom is elke oprit/dwell teek 1/60 van een seconde, of 60Hz. Het langste profiel segment (met behulp van een telling van 255) zal laatste 4,25 seconden en de kortste (met behulp van een telling van 1) duurt 17ms. Dit geeft een mooi bereik om te werken binnen. Neem een kijkje op de bijgevoegde foto van de logic analyzer. Wilt echt zien de detail in de foto, opent u de foto in hoge resolutiemodus. Dit duurt een paar extra kliks op de instructable website. Er is ook een tekening van een profiel hieronder.
Documenteren van het instructieprotocol is op mijn todolijst. Ik ben van plan om te schrijven een gegevensblad soort document om protocol volledig te beschrijven. Ik ben begonnen met een gegevensblad voor de chip - een voorlopige versie is nu op mijn website.