Mitt svar på WS2811 med en AVR sak (3 / 5 steg)

Steg 3: Bit Banging och spara några fler klockcykler



OK. Lite smällar.

800khz på en 16Mhz AVR är 20 klockcykler.

20 klockcykler på en AVR är mycket. Vi talar inte om PIC12 / 16C här med 4 fästingar per instruktion och enda riktiga register. AVR mycket per klocka cykel. Om det inte fanns kravet att blanda RGB ordning gör AVR denna följetong jobb utan att bryta en svett.

I själva verket förändras det enda AVR inte skiner på bitar i I/O register. Detta tar två klockcykler som visas i Detaljer för SBI instruktionen nedan. Processorn har att läsa registret, ändra den och skriva det tillbaka. Det är en av de få icke-förgrening instruktionerna i AVR ta två klockor. (Obs: AVR XMega har fastställt denna fråga och nu är endast 1 klocka)

Använda denna instruktion i tid kritiska linjer är inte mycket kul som alanerna kod visade. Han var tvungen att hoppa och hoppa över platsen för att utjämna den sökväg längden.

sbrc r19, 7. testa Hej lite klart
rjmp 3f; sant, skippa pin Hej -> lo
CBI % [port], [pin]; falsk, pin Hej -> lo
3: sbrc r19, 7. utjämna fördröjning av båda kodsökvägar
rjmp 4f
4: nop; puls timing fördröjningen

Så om de faktiska CBI och SBI instruktionerna kommer att ta 2 klockcykler ändå och då måste man slösa 2 klockcykler för att utjämna den sökväg längden, varför inte bara Läs ändra skriva själv. Detta kommer att ta 3 cykler totalt.

I R16, PortX; Läs det aktuella läget i registret
ORI R16, PinX; Ange Xth bit hög
UT PortX, R16; Skriv det nya värdet till registret

Nästa sak du kan göra för att spara tid är flytta allt utanför loopen du kan. Eftersom den här koden använder 100% av CPU-tid, det finns ingen risk något annat kommer att ändra PortX. Eftersom ingen annan kod körs kan vi också använda så många CPU register som vi gillar.

Så gör detta IN-ning och AND/OR-ning sätt utanför loopen.

I PinLo, PortX; Gör en kopia av byten i PortX
ANDI PinLo, 0xFE; Ändra det så att det värde att skriva att göra pin lo
I PinHi, PortX; Gör en kopia av byten i PortX
ORI PinHi, 0x01; Ändra det så att det värde att skriva att göra pin Hej

Slinga:
bla
bla
ut PortX, PinLo; Ställa in utgångsstiftet låg
bla
bla
rjmp Loop:

Detta har nu gjort hela lite togglande, seriell SKIFT, lite räkna och looping ta bara 9 klockor. Detta lämnar 11 klockor gratis för inläsning av data och blanda.

Igen skulle detta vara massor av tid om inte för det i ordning RGB. På grund av den i ordning RGB sak kan vi inte bara behandla varje byte läsa som nästa gång går ut. Vi måste göra ett beslut om var du vill spara den nya Läs byten till en buffert och var från en buffert för att få den nästa byten att skicka.

Det är där instruktionen IJMP kommer till undsättning. Sin sida från AVR instruktionsuppsättning visas ovanför. Vi använder det som ett fall/switch uttalande i en software-tillståndsdator. I varje stat kan vi ställa in vad nästa tillstånd bör utan att behöva göra några utvärderingar.

Vi kan göra detta eftersom vi alltid vet vilken färg den nästa byten kommer att vara

Om vi för närvarande bearbetar den röda byten blir den nästa byten grön
Om vi för närvarande bearbetar den gröna byten blir den nästa byten blå
Om vi för närvarande bearbetar den blå byten blir den nästa byten röd

t.ex. I det röda tillståndet kan vi helt enkelt säga

STATE = GRÖN

Vi behöver inte säga

om (något) sedan staten = grön annan stat = blå

Detta sparar några klockor inte behöva utvärdera något.

Hela koden visas som en bild här. Igen skicka mig ett PM om du vill att jag ska maila det till dig.

Kommentarerna i koden är förhoppningsvis tillräckligt även låta någon obekant med AVR-ASM förstår.

Se Steg
Relaterade Ämnen

16-nyckel knappsatsen avkodning med en AVR MCU

detta instructable visar dig hur gränssnittet en 16-nyckel knappsats till din AVR microcontroller och läsa nyckeln när en tangent är nedtryckt. Jag ska presentera knappsatsen först, sedan 74HC922 16-nyckel dekodern IC som pin-saving mekanism, sedan s...

Med Minimus AVR med Arduino IDE

The Minimus AVR är en USB-ansluten mikrokontroller, som använder ATMEL 90USB192 mikrokontroller. Dess en billig åter programmerbara mikrokontroller med 21 digital input/output stift.De har använts av människor som mod spelkonsoler konsoler, för att l...

Hur du använder Dragon Rider 500 med din AVR Dragon

detta instructable är en snabbkurs i hur man använder några av funktionerna av Dragon Rider 500 från Ecros Technologies. Tänk att det finns en mycket detaljerad Användarhandbok tillgänglig på webbplatsen Ecros.Dragon Rider är ett gränssnittskort för...

Kör en Stepper Motor med en AVR mikroprocessor

fick några Rota stepper motors från skrivare/disk drives/etc liggande?Vissa sondering med en ohmeter, följt av lite enkel förare kod på din mikroprocessor och du kommer att kliva i stil.Steg 1: Få veta Steppers i princip, du kommer att behöva räkna u...

Hur man styr en 16 x 2 LCD med en AVR ATtiny2313

om du bara får in microcontrollers finns det mycket att veta som du har sannolikt fått reda. Det finns en hel del bra online tutorials för Atmel AVR och chansen du har ser några av dem nu. Jag nyligen kom in mikrokontroller och visste inte jack om de...

Hur man använder en 74HC595 SKIFT Register med en AVR ATtiny13

om du har spelat med mikrokontroller och elektronik så du har förmodligen sett LED dot matrix-displayer och andra projekt som använder SKIFT register som 7-segment visar och mer. Detta instructable går över en snabb intro till 74HC595 8-bitars serail...

Läs binär/Hex miniatyrhjul växla med en AVR Microcontroller

detta instructable visar dig hur att läsa antalet på en binär pushwheel eller miniatyrhjul växla med lysdioder eller en AVR microcontroller (jag använder en ATmega328p men detta kan anpassas för alla AVR eller förmodligen en annan mikrokontroller för...

Styra allt med en AVR pin

detta instructable visar hur man styr en grupp av lysdioder med en mikroprocessor utgång.Jag kommer att använda micro är en Atmel Attiny2313.Steg 1: Delar och verktyg Parts:Attiny2313 (fick 5 gratis prover från Atmel)20-pin uttagMotstånd (alla storle...

Kom igång med Atmel AVR och BASCOM

Jag har sett massor av Instructables visar hur man kan arbeta med mikroprocessorer, men de alla antar att du har arbetat med dem tidigare och vet vad du gör. Jag har inte sett en Instructable som tar dig från ingenting och bygger på varje steg.Vad vi...

Mitt åttonde projekt: Robotarm med smarta Tank chassi och Bluetooth

Robotarm är en mycket intressanta saker. Det kan flytta och hålla något, men det är bara på en viss plats. Vad sägs om om vi sätter det på en robotbil och låt bilen ta robotarm att göra vissa jobb? Detta är en uppfattning om detta projekt.Steg 1: del...

Tre LED projekt... Eller vad man ska göra med döda saker

detta Instructable är egentligen tre separata projekt. Jag kommer att visa hur man brink liv i döda ting. Alla projekt görs först och sedan bestämde jag mig att göra dem Instructables. Alla är mycket enkla, behöver medium erfarenhet med vissa verktyg...

Fånga mygga med dina gamla saker

Jag gjorde en variabel spänningsregulator och jag installerade 4 blå led på toppen av lådan i serie med en 1 K resistor. För att indikera det är på eller av men vad jag hittat är förvånande för mig. Idon't vill göra någon slags pest styra men det byg...

Tidningen Bead armband med krånglig sak

detta är min Instructable so... yeah... Jag gjorde detta armband slumpmässigt eftersom min skola har denna anda dagen sak och vi måste bära vit så jag använde bara en lång bit krånglig garntjocklek grejen för omslag runt en USB-kabel och några tidnin...

Reparera din slitna lödning spets (eller göra en ny) med hushålls saker

I detta instructable jag visar dig hur du kan reparera din gamla lödning spets! Om du har 3-6mm diameter koppar stav kan du även göra en ny.Vad du behöver:-Gamla lödning spets eller använda en tjock koppartråd (de flesta lödning tips diameter är 3-6m...

Lätt ATTiny seriell kommunikation med liten AVR programmerare

ATTinies (som ATTiny 85) är super awesome! De är super billig, låg effekt, och de gör vad de flesta Arduino projekt utföra ändå (ge en enkel utgång eller ta i en enkel ingång).En svårighet kan snabbt se vad som händer med deras interna för enkel fels...

Kanel russin valnöt Cookies - American Style Cookies

norra Europeiska bakning använder mycket kanel; ibland till grad där det potentiellt skulle kunna vara oro för hälsan. De flesta av nyheterna om 2013 jul kanel reglerande krisen var allmänt i anti-EU-publikationer eller amerikanska "kan du tro vad de...

Återvunnet T-shirt krans

jag har experimenterat med att göra garn av återvunnet t-shirts. Du kan följa de två första stegen för att göra din egen t-shirt garn... möjligheterna för vad du kan göra med det är oändliga! Och eftersom min man äger om hundra t-shirts, min leverans...

AVR fuse grunderna: kör en avr med en extern klocka

säkringar är bland de svåraste ämnen som jag stött på samtidigt lära sig om programmering microcontrollers. Även efter att söka och läsa flitigt, kunde jag fortfarande inte lyckas rensa mitt begrepp om dem. Men sedan jag började lära dem ta en i tage...

Kom igång med ubuntu och AVR dragon

här är vad jag gjorde för att komma igång med AVR draken till programmet ATMEGA8 microcontrollers använder ubuntu (detta riktar sig till nybörjare, jag själv också är en nybörjare, så några förbättringar från mer erfarna användare är mycket uppskatta...