PCB Christmas tree (3 / 10 steg)
Steg 3: Prototyp på skärbräda + testprogram
Naturligtvis ville jag veta om detta är allt möjligt, så jag var tvungen att testa några saker. Först, programmering ATmega utan klockan; och för det andra tester 3 x 8 ledde multiplexing.
För att starta, kollade jag guide på Arduino webbplats om hur man programmerar en fristående ATmega som är ganska omfattande, och fungerar för det mesta. Det finns 2 huvudsakliga steg: med en Arduino som programmerare bränna bootloader, och sedan ladda upp programmet. Det finns en hake, men det är om du har en ATmega chip som redan har konfigurerats för att använda en extern klocka (e.g. tas ur en Arduino), då det enda sättet att programmera detta chip är att ge en externa klocksignalen på XTAL1. Även om du vill konfigurera chip för att använda den interna klockan senare, är detta ett nödvändigt steg innan du kan göra något. Så det finns två alternativ: Anslut en crystal till ATmega; eller om du inte har en kristall, kan du också använda ArduinoISP2 program av Adafruit som faktiskt kommer att generera en klocksignal på pin 9. Till slut valde jag detta alternativ, eftersom jag inte hade en extra kristall som jag kunde använda. När du har konfigurerat chip för att använda den interna klockan, kan den programmeras utan att behöva en extern kristall, eftersom burning bootloader också anger lämplig säkringarna.
Efter bootloading fungerade, byggde jag en liten prototyp på skärbräda med endast 12 lysdioder, bara för att se hur den multiplexing skulle fungera. Först försökte jag det med hjälp av funktionen digitalWrite() , men det visade sig vara för långsam, så jag var tvungen att ändra den och ställa in PIN-koden registren direkt. Detta är lite mer omständigt, men lyckligtvis är det mycket väl dokumenterat på Arduino webbplats.
Först bör några globala variabler definieras:
CONST int NR_ANODE = 3;
CONST int NR_CATHODE = 4;
PIN valet beror endast på hur lysdioderna är kopplad till registeransvarige
CONST int anodePins [NR_ANODE] = {3, 4, 5}; Arduino stift 3, 4, 5
CONST int cathodePins [NR_CATHODE] = {7, 6, 1, 0}; Arduino stift 7, 6, 1, 0
stift 3 4 5
CONST int anodeBits = B00111000;
stift 6 7 0 1
CONST int cathodeBits = B11000011;
osignerade långa int loopCounter = 0;
Och en matris att lagra ljusstyrkevärden LED:
int val [NR_ANODE] [NR_CATHODE] = {{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}};
Sedan i de viktigaste loop, loopCounter ökas efter varje iteration och dess resten av 50 jämförs med varje element i matrisen värde , som avgör om lampan är på eller av för att upprepningen. Jag valde 50, eftersom det fortfarande fungerade utan något flimmer och gav redan en tillräckligt bra upplösning för vad jag behövde.
rem = loopCounter % 50;
Jag = loopCounter % NR_ANODE; vid varje iteration Använd en annan anod
Aktivera katod pins hög, detta kommer att stänga av alla lysdioder
PORTD = PORTD | cathodeBits;
Aktivera anod pins låg
PORTD = PORTD & ~ anodeBits;
vända anode_pins [i] hög - Välj ror jag
PORTD = PORTD | (1 << (3 + jag));
vända katod pins låg om rem > = motsvarande val
PORTD = PORTD & ~ (((rem < val[i][0]) << cathodePins[0]) |
((rem < val[i][1]) << cathodePins[1]) |
((rem < val[i][2]) << cathodePins[2]) |
((rem < val[i][3]) << cathodePins[3]));
loopCounter ++;
På denna punkt försökte jag bara programmet genom att skriva fasta värden i matrisen val att se om det fungerar utan problem, och när jag var nöjd med det jag började PCB design, eftersom jag visste tillverkning skulle ta lite tid och jag kunde avsluta resten av programmet sedan.