Först och främst vill jag säga att jag är nybörjare inom området


Jag håller på och bygger en binärklocka med hjälp utav en arduino(UNO, 328), tre stycken 74HC595N skiftregister och lysdioder. Jag har fått min krets att fungera och visa tiden korrekt, men nu försöker jag slipa lite på det rent estetiska och går bet. För tillfället använder jag mig av shiftOut() för att sända över dem tre bytes som representerar tiden till mina register. Det fungerar bra, men jag kan bara välja att ha lysdioderna på eller av. Jag vill kunna dimma dom! Dels för att få snyggare övergångar, men dels för att kunna bestämma ljusstyrkan efter hur ljust det är i rummet.
Så, lite efterforskningar visade att det verkar vara BAM(Bit Angle Modulation) som är den stiligaste lösningen på mitt problem. Jag hittade lite exempelkod, från en snubbe som använder denna metod för att styra en 8*8*8 led-kub(http://www.kevindarrah.com/download/8x8 ... _speed.ino ) och har tittat på denna för att försöka förstå hur jag ska bära mig åt.
Jag har pin10 på SR(Master reset, active LOW) kopplad till 5V
Jag har pin11 på SR(shift register clock) kopplad till pin13 på arduino
Jag har pin12 på SR( storage register clock, latch) kopplad till pin12 på arduino ///Här låg problemet: pin12 reserverad av SPI. Hade även en felaktig skrivning till denna pinne
Jag har pin13 på SR(Output enable, active LOW) kopplad till pin10 på arduino(blank_pin)
Jag har pin14 på SR(Serial Data) kopplad till pin11 på arduino.
(Här bör det inte vara något felaktig, då det fungerar utmärkt om jag kör med min ursprungliga kod.)
(För tillfället har jag bara ett skiftregister inkopplat för att minska felkällorna)
Kod: Markera allt
#include <SPI.h>
#define blank_pin 10
#define data_pin 11
#define latch_pin 12
#define clock_pin 13
int counter = 0;
int bam_bit = 0;
byte test = 0;
byte test0 = B00000000; //Trots att jag har nollor överallt
byte test1 = B00000000; //Så lyser alla lysdioder
byte test2 = B00000000;
byte test3 = B00000000;
void setup(){
SPI.setBitOrder(LSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV2);
noInterrupts();
TCCR1A = B00000000; //Dessa delar har jag inte riktigt förstått
TCCR1B = B00001011; //vad dom innebär. Kan det vara här något galet ligger?
//kopierat från Kevin Darrahs kod.
TIMSK1 = B00000010;
OCR1A = 30;
pinMode(latch_pin, OUTPUT);
pinMode(clock_pin, OUTPUT);
pinMode(data_pin, OUTPUT);
SPI.begin();
delay(500);
interrupts();
}
void loop(){
//delay(20);
}
ISR(TIMER1_COMPA_vect){
PORTB |= 1 << blank_pin; //Hög signal till Output enable på SR för att släcka LED
if (counter == 8){ //Logik för att justera bam_bit
bam_bit++;
}
else if (counter == 24){
bam_bit++;
}
else if (counter == 56){
bam_bit++;
}
counter++;
//Beroende på var i vår cykel vi är, så använder vi olika bytes.
switch (bam_bit){
case 0:
SPI.transfer(test0);
break;
case 1:
SPI.transfer(test1);
break;
case 2:
SPI.transfer(test2);
break;
case 3:
SPI.transfer(test3);
if(counter == 120){ //Om vi är i slutet på vår cykel börja om från början
bam_bit = 0;
counter = 0;
}
break;
}
PORTB |= 1 << latch_pin; //latch on
PORTB &= ~(1 << latch_pin); //latch off
PORTB &= ~(1 << blank_pin);//output enable låg för att visa ny data
pinMode(blank_pin, OUTPUT);
}
Det är även så att även om jag gör koden helt statisk, dvs inte ändrar några variabler någonstans. Så tänds och släcks det lite hur som om man låter det stå och ticka en stund.
Snälla hjälp!
