Slutföra kretskort Lab & POV visitkort (13 / 13 steg)
Steg 13: Programmera PIC
BILDEN kan programmeras antingen i C++ eller assembler. Jag har valt C++, mest för att spara tid, men också eftersom jag inte nödvändigtvis vill begå denna arkitektur och visserligen, församlingen språk är inte roligt! För enkelhetens skull utvecklat jag styrelsen med dopp PIC12F509, som är pin kompatibla med 508. Det är också större och lättare att manipulera för att testa, och jag fann att det hade mer minne än jag behövde, så jag var kunna nedgradera chip för slutprodukten.
Hur POV kortet fungerar
_______________________________________________________________________
Kortet är avstängd tills den ögonblickliga på switch hålls ner. Strömmen upp simulerar programmet en liten rullande boll med en binär räknare som rullar in och ut med lutningen på kortet. Efter ungefär fyra lutar fram och tillbaka, det och sedan växlar till Persistence Of Vision läge och cyklar genom en serie av programmerade mönster. För närvarande, står det mitt namn, följt av ett snyggt fyrkantsvåg mönster som fungerar som en avgränsare och sedan mitt telefonnummer. När växeln tilt stängs programmet känner igen som i början av en våg, och spelar nuvarande mönster en gång igenom, sedan väntar tills en annan våg börjar. Så länge vågen inte dubbel tillbaka för tidigt, och mönstret inte är för lång, blir det ingen överlappning som mönstret blir tom förrän det återställs.
Mönster
_______________________________________________________________________
Varje mönster är en matris av byte som varje byte en kolumn i sekvensen. Den tid som varje kolumn (ram) i mönstret är kvar på och tiden mellan ramar bestämmer hastigheten på displayen, och hur nära ramarna är fördelade när kortet är vinkade. I grunden ändrar bredden på karaktärerna och mönstret som helhet. Dessutom spelar den hastighet med vilken du vinkar kortet också en roll i avståndet, men inte tillräckligt för att göra det oläsligt; sedan det ändringar ramar med en konstant hastighet, variationen inte räcker för att fråga, men är nog att det ser dynamisk. Snyggt, va?
För att skapa mönster, ändrade jag ett skript som jag hittade skriven av Andrew Mason. Min version är anpassade för alternativa byte formatering och antal lampor, men LED placeringen är fast, för närvarande. Du kan göra något mönster som du vill, förutsatt att det är liten nog att passa i PICs-minnet. Den hastighet med vilken mönstret spelar tillbaka på kan ändras i koden, liksom.
Programmet
_______________________________________________________________________
Koden är mycket enkel. Utan PWM eller avbrott fanns det inte mycket många knepiga saker jag kunde göra, även om jag ville. Bevara utrymme och optimera gjorde det lite mer intressant, dock, med tanke på den tweaking behövs för att göra koden passa i bilder mycket liten minne.
För att spela ett mönster, PIC helt enkelt kontrollerar för växeln tilt aktiveras, sedan loopar igenom ett mönster. Det uppsättningar GPIO utgångarna till den nuvarande byten i arrayen, vilket utgör en ram, väntar en fastställd period, då ökar matrisen. När mönstret har spelat hela vägen igenom, blanketter i displayen och väntar tills växeln tilt har aktiverats. Detta tyder på en annan våg har startat, och den går igenom mönstret igen.
Frame koden ser ut så här, utan citationstecken: "0b00000000,". 0b skisserar en byte och semikolonet särskiljer varje byte från nästa. Detta är alla placerade inuti en rad konstanter, eftersom det inte kommer att förändras under uppspelning och som kommer att spara RAM. Fem bitar i matrisen anger en LED utgång, medan en är oanvända och en är lite skrivskyddad används för input stift. De bitar som används är: 0bXX12X543, där siffran anger PIN-koden.
Koden
_______________________________________________________________________
#include < htc.h >
#include < stdlib.h >
__CONFIG (MCLRE_OFF & WDT_OFF & CP_OFF & OSC_IntRC);
constchar vågform [] = {/ * 0bXX12X543 - anger pin nummer, att produktionen hög, t.ex.: 0b00100111, slutföra array koden utelämnas för utrymme; se bifogade .c fil för komplett kod * /};
constchar binärt [] = {/ * koden utelämnas * /};
constchar namn [] = {/ * koden utelämnas * /};
voidinit(void) {
ALTERNATIV = 0b01000111;
uppsättningar pin 2,3,5,6,7 utgång, stift 4 ingång
TRIS = 0b00001000;
} voiddisplay_roll (constchar p [], constchar pattern_length) {char jag = 0;
för (unsigned int j = 0; j < 350; j ++) {//plays mönster framåt eller bakåt beroende på tiltif (GP3 == 0 & & jag < pattern_length) {i ++;} ElseIf (GP3 == 1 & & jag > 0) {i--;}
GPIO = p [i]; anger LED utgångar till aktuell bildruta i nuvarande mönster
_delay(16000); Frame försening i antalet cpu-cykler}} voiddisplay_pattern (constchar p [] constchar pattern_length, constchar loopar, constchar hastighet) {för (char jag = 0; jag < loopar; i ++) {//exits visas antingen på swing restartfor (char j = 0; j < pattern_length & & GP3 == 1; j ++) {
GPIO = p [j];
utforma dröjsmål i multiplar av 10 mikrosekunder:) för (char k = 0; k < hastighet; k ++) {_delay(40);}}
GPIO = 0b00000000; Tom utdata så att mönstret inte överlappar samtidigt svänga tillbaka till startwhile (GP3 == 1); om fortfarande viftande, vänta tills swing omstarter och switch kontakter
_delay(5000); lata debounce}}voidmain(void) {
init();
display_roll (binär, 31).
samtidigt (1) {/ * funktionen variabler är: Mönsternamn, längden på mönster (i byte/frames), antal loopar, hastigheten på display/framerate * /
display_pattern (namn, 69, 110, 25);
display_pattern (vågform, 71, 100, 25);
display_pattern (nummer, 61, 110, 25);
}}
Programmering i styrelsen
_______________________________________________________________________
All kod skrevs i Notepad ++, en utmärkt gratis multi-language editor. Du behöver också MPLAB IDE med en kopia av HI-TECH C-kompilator. Båda finns i gratis versioner.
Du behöver en kopia av mikrochips PICKit 2 programmering programvara. Med chip ansluten och iCP01 inkopplad, ange enhet familjen att "Baseline" och välj PIC12F508 från listan för enheten. Sedan läsa in hex filen och tryck på knappen Skriv.
Referenser
- PIC12F508/509/16F505 datablad
- Hi-Tech C 9.81 Compiler User Guide
- POVgen online LED Pattern Generator
- Hi-Tech C Compliler
- Integrerad utvecklingsmiljö MPLAB
Verktyg & tillbehör
- PIC12F508 jag / SN SOIC eller PIC12F508 jag / P dopp mikrokontroller
- USB-In-Circuit Serial programmerare (iCP01)
- Skärbräda
- 8-pin SMD IC breakout styrelsen eller extra obefolkade PCB