Stap 13: Program de PIC
De PIC kan worden geprogrammeerd in C++ of assembler. Ik koos C++, voor meestal om tijd te besparen, maar ook omdat ik niet per se wil verbinden aan deze architectuur, en toegegeven, programmeertalen zijn niet leuk! Voor eenvoud ontwikkeld ik het bord met behulp van de DIP-PIC12F509, die compatibel is met de 508 pin is. Het is ook groter en gemakkelijker te manipuleren voor testdoeleinden, en ik vond dat er meer geheugen dan ik nodig had, dus ik was in staat om te downgraden de chip voor het eindproduct.
De werking van de POV-kaart
_______________________________________________________________________
De kaart is uitgeschakeld totdat de kortstondige op schakelaar ingedrukt wordt gehouden. Op inschakelen simuleert het programma een weinig rollende bal met een binaire teller die in en uit te met de schuine stand van de kaart rollen. Na ongeveer vier kantelt heen en weer, het dan schakelt over naar de modus Persistence Of Vision en doorloopt een aantal geprogrammeerde patronen. Momenteel staat mijn naam, gevolgd door een nette blokgolf patroon dat als een scheidingsteken, waarna mijn telefoonnummer fungeert. Wanneer de tilt schakelaar sluit, wordt dat door het programma herkent als het begin van een golf, en speelt de huidige patroon een keer door, dan wacht tot een andere golf begint. Zolang de golf doet niet dubbel terug te vroeg, en het patroon niet te lang is, zal er geen overlapping zoals het patroon zal niet leeg totdat het herstelt.
De patronen
_______________________________________________________________________
Elk patroon is een matrix met bytes, elke byte van een kolom in de reeks. De tijd die elke kolom (frame) in het patroon nog aan en de tijd tussen frames bepaalt de snelheid van het scherm, en hoe dicht de frames gelijkmatig verdeeld wanneer de kaart wordt gezwaaid. In feite, verandert de breedte van de tekens en het patroon als een geheel. Bovendien, de snelheid waarmee u de kaart golf speelt ook een rol in de afstand, maar niet genoeg om het onleesbaar; Aangezien het veranderingen frames met een constante snelheid, de variatie is niet genoeg om de materie, maar is genoeg om het dynamische kijken. Nette, hè?
Het om patronen te maken, ik heb een script die ik gevonden, geschreven door Andrew Masongewijzigd. Mijn versie is aangepast zodat alternatieve byte opmaak en aantal LEDS, maar de plaatsing van de LED is vastgesteld, voor het moment. Elk patroon die u wilt, kun je mits het is klein genoeg om te passen in het geheugen van de foto's. Het tarief dat het patroon speelt terug bij kan worden gewijzigd in de code, evenals.
Het programma
_______________________________________________________________________
De code is erg eenvoudig. Zonder PWM of onderbreekt waren er niet veel lastige dingen die ik doen kon, zelfs als ik wilde. Behoud van ruimte en optimaliseren maakte het een beetje meer interessant, echter gezien de tweaken nodig om de code in de PICs tiny het geheugen passen.
Om te spelen een patroon, controleert de PIC gewoon voor de tilt-switch wordt geactiveerd, dan een patroon doorlopen. De GPIO output wordt ingesteld op de huidige byte in de array, die een frame vertegenwoordigt, wacht een ingestelde periode, dan verhoogt de matrix. Zodra het patroon heeft gespeeld helemaal door, het blanks het scherm en wacht totdat de tilt schakelaar heeft geweest geactiveerd. Dit betekent een nieuwe golf van start gegaan, en het gaat door het patroon nogmaals.
De frame-code ziet er als volgt, zonder aanhalingstekens: "0b00000000,". De 0b bakent een byte en de komma scheidt elke byte van het volgende. Dit ligt allemaal binnen een matrix van constanten, aangezien het zal niet tijdens het afspelen veranderen en dat RAM bespaart. Vijf van de bits in de matrix geven een LED uitgang, terwijl een ongebruikte is en een een beetje van het alleen-lezen voor de invoer pin gebruikt is. De bits die gebruikt zijn: 0bXX12X543, waar het cijfer de pin geeft.
De Code
_______________________________________________________________________
#include < htc.h >
#include < stdlib.h >
__CONFIG(MCLRE_OFF & WDT_OFF & CP_OFF & OSC_IntRC); constchar waveform[] = {/* 0bXX12X543 - sets pin at number, to output high, e.g.: 0b00100111, complete array code omitted for space; see attached .c file for complete code */}; constchar binary[] = {/* code omitted */}; constchar name[] = {/* code omitted */}; voidinit(void) { OPTION = 0b01000111; //sets pin 2,3,5,6,7 output, pin 4 input TRIS = 0b00001000; }voiddisplay_roll (constchar p[], constchar pattern_length) {char i = 0; for (unsigned int j = 0; j < 350; j++) {//plays pattern forwards or backwards depending on tiltif (GP3 == 0 && i < pattern_length) { i++; }elseif (GP3 == 1 && i > 0) { i--; } GPIO = p[i]; //sets LED outputs to current frame in current pattern _delay(16000); //frame delay in number of cpu cycles}}voiddisplay_pattern (constchar p[], constchar pattern_length, constchar loops, constchar speed) {for (char i = 0; i < loops; i++) {//exits display either at swing restartfor (char j = 0; j < pattern_length && GP3 == 1; j++) { GPIO = p[j]; //frame delay in multiples of 10 microseconds :)for (char k = 0; k < speed; k++) { _delay(40); }} GPIO = 0b00000000; //blank output so pattern doesn't overlap while swinging back to startwhile (GP3 == 1); //if still waving, wait until swing restarts and switch contacts _delay(5000); //lazy debounce}}voidmain(void) { init(); display_roll(binary, 31); while (1) {/* function variables are: pattern name, length of pattern (in bytes/frames), number of loops, speed of display/framerate */ display_pattern(name, 69, 110, 25); display_pattern(waveform, 71, 100, 25); display_pattern(number, 61, 110, 25); }}
Programmering van de Raad van bestuur
_______________________________________________________________________
Alle code is geschreven in Notepad ++, een uitstekende vrije meertalige redacteur. U moet ook de MPLAB IDE met een kopie van de HI-TECH C Compiler. Beide zijn beschikbaar in de gratis versies.
U moet een kopie van de Microchip PICKit 2 programmeersoftware. Verbonden met de chip en de iCP01 aangesloten, stelt u de apparaat-familie "Baseline" en selecteer PIC12F508 uit de dropdown apparaat. Vervolgens laad het hex bestand en druk op de Schrijf knop.
Verwijzingen
- PIC12F508/509/16F505 gegevensblad
- Hi-Tech C 9.81 Compiler User Guide
- POVgen Online LED patroon Generator
- Hi-Tech C Compliler
- MPLAB Integrated Development Environment
Tools & Supplies
- PIC12F508 ik / SN QFN of PIC12F508 ik / PDIP microcontroller
- USB-In-Circuit Serial Programmer (iCP01)
- Breadboard
- 8-pins SMD IC breakout board, of extra onbewoonde PCB