Stap 13: Een 10 stap animatie maken
Allereerst moeten we erachter te komen welke LEDs we willen op en welke LEDs uit bij elke stap. Als I 'm gonna een eenvoudig staafdiagram maken wil ik zal LED7, LED8 en LED9 om in te schakelen wanneer het geluid op niveau 1 (de onderste rij van blauwe LED's is). Wanneer het geluid op niveau 2 die ik wil LED7, LED8, LED9, LED12 is, LED13 en LED14 terwijl de rest inschakelen uitschakelen (de twee onderste rijen van blauwe LED's). Enzovoort enzovoort, tot we bij de 10e geluidsniveau waarin zal willen wij alle van de blauwe LEDs op. Dus is hier de functie die we zullen gebruiken:
VOID Bar_Graph(void)
{
uint16 niveau;
niveau = (0xF0 & (uint16) PORTD) << 2; Opslaan van de bovenste knabbelen van PORTD in 'level' in bits #9 - bit #6
niveau | = ((0xFC & PORTB) >> 2); Masker uit RB0 en RB1, beetje shift de gegevens rechts twee plaatsen en opslaan RB2 - RB7 in 'niveau'
schakelaar (niveau)
{
kast 0x03FF: SPI_Send_595(0x000000C0); breken; Geluidsniveau op 0
kast 0x03DF: SPI_Send_595(0xE00000C0); breken; Geluidsniveau 1
kast 0x03CF: SPI_Send_595(0xFC0000C0); breken; Geluidsniveau 2
kast 0x03C7: SPI_Send_595(0xFF8000C0); breken; Geluidsniveau 3
kast 0x03C3: SPI_Send_595(0xFFF000C0); breken; Geluidsniveau 4
kast 0x03C1: SPI_Send_595(0xFFFE00C0); breken; Geluidsniveau 5
kast 0x03C0: SPI_Send_595(0xFFFFC0C0); breken; Geluidsniveau 6
kast 0x01C0: SPI_Send_595(0xFFFFF8C0); breken; Geluidsniveau 7
kast 0x00C0: SPI_Send_595(0xFFFFFFC0); breken; Geluidsniveau 8
kast 0x0040: SPI_Send_595(0xFFFFFFCC); breken; Geluidsniveau 9
kast 0x0000: SPI_Send_595(0xFFFFFFCF); breken; Geluidsniveau 10
}
}
** Niet zorgen te maken over bits #7 en #6 waardoor het 0xC0 recht nog, haar uitgelegd onder de volgende paragraaf beet
U kunt zien dat op goed niveau 0 kom ik niet op alle LEDs, dus het stuurt 0x000000C0. Ik stuur op goed niveau 1 0xE00000C0 die LED7, LED8 en LED9 zal inschakelen. Ik stuur op goed niveau 2 0xFC0000C0 die LED7, LED8, LED9, LED10, LED11 en LED12 zal aanzetten. En zo verder. Zijn vrij eenvoudig, je gewoon uitzoeken die LEDs gewenste ingeschakeld of uitgeschakeld en welk niveau van geluid, dan gewoon zet het in de instructie switch.
Nu weet je het nog terug in stap #8 toen ik je vertelde dat we die 4 bovenste stukjes gegevens die wordt verzonden naar IC4 negeren? We gaan goed nu eigenlijk gebruik 2 van deze ongebruikte bits wanneer wij onze van de 32-bits gegevenswaarde aan SPI_Send_74HC595(*data*) doorgeven zijn. Je misschien hebt gemerkt in het schema dat zijn wij in staat om alle te controleren van de groene LED's als geheel en al de gele LEDs als geheel dankzij de 2 x IRL510 MOSFETs die in het circuit. Om te schakelen op alle van de groene LED's we gewoon een 1 (+ 5v) naar schrijven RC2 en om te schakelen op alle van de gele LEDs schrijven we een 1 to RC1. Hiermee schakelt u bij het toestaan van de IRL510 van huidige doorheen kan stromen, dus de verlichting van de LED's.
Om te schakelen de fles en citroen, wanneer u uw gegevens via de functie SPI_Send_595(*data*) u moet maken van bits #6 en #7 hoge bit verzendt. Beetje #6 bepaalt de fles en bits #7 regelt de citroen. In de SPI_Send_595 functie die ik masker uit bit #6 en #7 bit en zet de uitgang van RC1 en RC2 overeenkomstig de stand van die stukjes. Van de IRL510 zijn niet gecontroleerd door de shift-registers, don't get dat verward. Ik gebruik beetje #6 en #7 bit in software, ze nooit krijgen overgedragen aan van de 74HC595. Zoals u kunt zien krijgen zij gemaskeerd af wanneer we byte #4 sturen.
#define citroen PORTCbits.RC2
#define fles PORTCbits.RC1
VOID SPI_Send_595(uint32 data)
{
CITROEN = (gegevens >> 7) & 0x00000001; De citroen inschakelen als u bits #7 is hoog en schakel het uit als laag is beetje #7
FLES = (gegevens >> 6) & 0x00000001; Zet de fles als bit #6 hoog is en draai die het eraf beetje #6 laag is
SPI_Send (gegevens >> 24); SHIFT uit byte #1 (IC1) eerste
SPI_Send ((gegevens >> 16) & 0x000000FF); SHIFT uit byte #2 (IC2) volgende
SPI_Send ((gegevens >> 8) & 0x000000FF); SHIFT uit byte #3 volgende (IC3)
SPI_Send (data & 0x0000000F); SHIFT uit byte #4 (IC4) laatste
LAT_595 = 1; Klink op de uitgangen van de de 74HC595 van de gegevens
NOP();
LAT_595 = 0; Reset de hendel aan de standaardstatus
}
U kan ook opmerken dat zowel RC1 en RC2 PWM-uitgangen op de PIC18F4550. Ze hebben er in het geval dat iemand zou willen controle van de helderheid van de fles of de citroen is geplaatst. Ik denk dat het wel cool om het staafdiagram gebruiken voor een LED Animatie en voor elk niveau van geluid hebben een andere helderheid van het licht van de gele LEDs. Op die manier de citroen zou ook gaan op de beat van de muziek met de blauwe LED's.
Ik liep in de problemen wanneer ik ontwierp de eerste versie van de PCB en ik kan niet de LED fles en citroen afzonderlijk instellen. Ik heb niet mijn fout vinden totdat ik had al gemaakt en de PCB gemonteerd. Geen zorgen voor u echter ik vast die fout in de PCB-bestanden zodra ik vond het, dus als u mijn ontwerp te maken van deze VU-Meter gebruikt u zal zitten kundig voor controle van de fles en de citroen.
Uiteindelijk kreeg ik ziek van het uitzoeken van waarden voor specifieke LED's die ik inschakelen wilde, zodat ranselde ik samen een klein programma dat alles van de berekeningen voor ons zal doen. Alles wat we moeten doen is dat gegevens hex waarde en het in SPI_Send_595 zet (* gegevens hier *) en het zal oplichten elke LED die het toont op het programma. Het kan worden gedownload in het zip-bestand in stap #4. Voor zover ik betrokken ben is dit programma een het levensspaarder.