MicroController Register Manipulation (5 / 6 steg)

Steg 5: Så vad är poängen då?


Det bör vara ganska klart att skriva direkt till registren kan spara utrymme i ditt chip minne. Den förkortade skissen tar också mindre tid att köra helt enkelt eftersom det finns inget bibliotek att leta upp till varje funktion samtal. För de allra flesta applikationer, kommer detta inte någon verklig användning eftersom att eliminera en funktion som pinMode() inte kommer att spara mycket utrymme eller tid i en komplex skiss. Men i vissa program handläggningstiden är ett stort bekymmer, och minska den bortkastad tid i biblioteksfiler gör det möjligt för fler klockcykler ska vara tillgängliga för andra saker. Vad jag menar med detta är att även om du måste inkludera ett bibliotek funktion, och därför tar plats i minnet med det, om du inte kalla det mycket ofta och i stället använda registren direkt, åtminstone du sparar tid (men inte utrymme) av inte tittar upp.

Ett annat alternativ är förmågan att använda stift på sätt de inte kan ha varit ursprungligen avsett, men utan några biverkningar. Till exempel jämföra stiften är associerad med PWM på den chipKIT Uno32 har en extra register knutna som knyter in i produktionen jämför modulen (OCMP) kallas output register (OCxR). OCMP har några fler register som handlar om tidpunkten för PWM-signal, men OCxR är faktiska signal output registret, liknande LATx (PIC32) eller PORTx (ATMEL) register. PWM perioden beräknas genom att multiplicera... (lätt men förvirrande matematiska saker här)... och att värdet matas in i perioden registrera (bända). Bända berättar timer register (TMRy) som driver de särskilda OCMP när du ska återställa tillbaka till 0, men du måste lägga till en extra 1. Intermittensen sedan skrivs till det sekundära jämför register (OCxRS), som är i grunden en buffert eftersom detta värde överförs nästan omedelbart till jämför (OCxR), men du kan inte skriva det direkt eftersom OCxR är skrivskyddad.

Exempel: om bända har värdet 5 och OCxRS är laddad med värdet 2, OCxR först laddas med 2 också. TMRy börjar räkna på 0. 1, OCx ger ett högt värde och stannar där. Vid tiden 2, ingenting förändras, OCx har varit hög för 1 räkning. Vid tiden 3 sjunker OCx lågt eftersom det har varit högt för 2 räknas. På tiden 3, 4 och 5 ingenting förändras men TMRy = bända, så att den återställs och börjar sedan tillbaka på 0 på nästa räkna. 1 klocka Markera passerar, som är räkna 0 igen, och vid räkna 1, OCx utgångar hög igen. Här är siffran 16-18 från avsnitt 16: utdata jämföra PIC32 familj referensmanual:



Att bända till 5 och OCxRS till 2 ger faktiskt en arbetscykel med 33% (2/6) och inte 40% (2/5). Det är där det extra 1 kommer in. Det får läggas till värdet av bända. Detta är bara ett enkelt exempel, och om bända och OCxRS var mycket större, skillnaden i %'s skulle vara mycket, mycket mindre.

Tja, det var enkelt var det? Ja, nr jag kunde höra kugghjulen lamslagits på "För exempel..." Du skulle ha sett utseendet på mina klasskamrater ansikten när professorn visade oss detta första gången. Men det är därför vi har bibliotek. Allt det här hanteras av biblioteken när vi berättar för servo att vända med en viss hastighet eller vi vill spela en melodi med olika toner. Men 1) vi är begränsade till endast att kunna använda PWM stift och 2) bibliotek tar plats i minnet. Vad gör vi om vi behöver fler PWM alternativ? Använda registren.

Följande skiss är en enkel tone generator. Jag tänker inte göra ett servo exempel eftersom jag rekommenderar inte att använda servon utan servo.h biblioteket, men med en del arbete det är definitivt möjligt. Det är alldeles för lätt att förlänga över servo bortom det är inre hållplatser. Om du vill göra det, måste du skriva alla bakgrunden saker att servo.h handtag i skissen, men längre skisser kommer att resultera i olika PWM perioder eftersom varje rad tar lite tid.

Innan vi ser skissen, några snabba enkla matte. Först bestämma hur produktionen ofta du vill. Dividera 1 med din frekvens för att få din period, och därefter dela det på mitten. Kontrollera att värdet är i mikrosekunder, sedan sätta värdet i båda delayMicroseconds() funktion implementeringar. Om vi vill generera en arbetscykel än 50%, multiplicera din Periodvärdet plikt cykel procentsats du hög. Ange det nya värdet till funktionen delayMicroseconds() inne om() uttalande. Ange resten i delayMicroseconds() -funktionen i den annan sats.

Exempel: Du vill ha en effekt på 1kHz. 1/1000 Hz = 1 millisekund = 1000 mikrosekunder = period. 1000μs/2 = 500 μs ⇒ delayMicroseconds(). Om du vill ha 60% intermittens: 1000μs * 60% = 600 μs ⇒ om() uttalande delayMicroseconds() värde. 1000μs - 600μs = 400μs ⇒ annat uttalande delayMicroseconds() värde. Trevlig och lätt.

Här är tone generator koden:

Enkla tongeneratorn inte använder förinställda PWM
stiften men använder registret manipulation

bool state = sant;

void setup()
{
chipKIT endast
Ange register E, bit 0 som en utgång (0)
PIN-26 Uno32/uC32; stift 37 Max32
TRISE = TRISE & 0xFFFE; 0b1111 1111 1111 1110

Arduino endast
Ange register B, bit 0 som en utgång (1)
stift 8 UNO
DDRB = DDRB | 0x01; 0b0000 0001
}

void loop()
{
om (state)
{
chipKIT endast
SENT = 0X0001;

Arduino endast
PORTB = 0X01;

State = false;
delayMicroseconds(500);
}
annat
{
chipKIT endast
SENT = 0X0000;

Arduino endast
PORTB = 0X00;

State = sant;
delayMicroseconds(500);
}
}

Nedan hittar du o-scope bilder utdata, först från chipKIT Uno32...

.. .och sedan från Arduino UNO.

Galen nog, dessa bilder har genererats med hjälp av registret manipulation skissen som visas ovan, och när jag testade standardfunktion skissen, exakt samma bild dök upp. Konstigt, rätt? Så jag tänkte jag skulle bespara er att slösa tid ute på en dubblett. Jag har också ingen aning om varför den Arduino UNO är ganska instabil vid peak utgång, så om någon har någon legitim förklaring, förtydliga vänligen i kommentarerna.

Se Steg
Relaterade Ämnen

Seg... pinne.

Gör det själv själv-balansera... saker... har funnits nästan lika länge som kommersiella självbalanserande saker. Uppenbarligen de hemlagade versionerna är inte som släta, tillförlitlig, eller felsäkra som äkta, men de är fortfarande ganska fängsland...

Atmel start 2: Microcontroller kretsar och säkringar

M. A. Parker c2015Kretsar och säkringar konstruerar en enkel men viktig krets på en experimenter's skärbräda som ska användas som grundläggande plattform för många microcontroller projekt och för att ange parametrarna mikrokontroller (dvs säkringar)....

BITS & Byte magic manipulation

Hej duSå att du påbörjat resan av programmering och känner lust att lära sig magi bits och Bytes. Väl se längre vilket jag hoppas att upplysa er i fungerar och, eller inte och flytta.Om du har arbetat med Arduino som du kanske vet lite om detta men j...

Multiplexering 7 Segment visar med Arduino och SKIFT register

i detta instructable, jag kommer att lära grunderna i multiplexing 7 segmenterar skärmar med en Arduino och ett par av SKIFT register. Detta projekt är väl lämpad för att Visa numeriska information eller om du vill styra en massa lysdioder. För nybör...

Ledde matrisen projektet använder SKIFT register och pic16f628a mikro

detta är aproject att flytta orden på led matrisdisplayVi använder1-pic16f628a som mikrokontroller: billiga, programminnet 2k, har interna oscillatror, två portar A, B och en massa saker.2-ledde matrisen 8 * 8 rader gemensam anod och kolumner gemensa...

Hur man gränssnitt 16 X 2 LCD med AVR Microcontroller

här är Kopplingsschemat hos gränssnitt 16 X 2 LCD till AVR Microcontroller. I denna krets, att kristalloscillator ge klockan till mikrokontroller. Kondensatorerna ansluten till crystal ska fungera som filter och hjälpa kristallen att genljuda och svä...

Att få mer I/O pins på ATTiny med Skift register

Om du tidigare arbetat (eller arbetar) med små 8-bitars mikrokontroller, som ATTiny eller PIC12, du har förmodligen inträffat ett grundläggande problem för att inte ha tillräckligt GPIO pins för dina behov eller projektets krav.Uppgradera till en stö...

LEDDE matrisen med hjälp av SKIFT register

detta instructable är tänkt att vara en mer fullständig förklaring än andra tillgängliga online. Detta kommer bland annat ge mer hårdvara förklaring än finns i LED markeringsramen instructable av led555.MålDetta instructable presenterar begreppen med...

Hela världen microcontroller länk för under $20

kontrollera termostaten hem från jobbet. Slå på en sprinkler från någonstans i världen genom att snärta en switch. Detta Instructable visar hur du länkar två eller flera $4 mikrokontroller med ryggraden i internet och några enkla VB.Net-kod.Detta byg...

Arduino powered 7 seg LED-skärm med hjälp av SKIFT register - jag gjorde det på TechShop

sju segmenterade skärmar är bra. De är ganska enkla, inte ta mycket ström och har en stor flexibilitet när det gäller att Visa nummer. Men bortsett från 14 stift bara för att köra det är sådan smärta. Om bara det fanns ett sätt att använda dem utan a...

4 x 4 x 4 LED cube uppgradering med Skift register (74hc595)

projektet började med en påse med lysdioder som jag hade tagit bort från ficklampor, konvertera till UV ficklampor. Jag visste att jag skulle hitta något roligt för att använda dem med, men det var månader innan jag listade ut vad med dem att göra. N...

3D tryckt Microcontroller Dice Roller

Detta är ett bara-på-skoj projekt jag gjorde i Digilent MakerSpace. Oftast när jag spelar brädspel använder jag en tärning-rullande smartphone app eftersom tärningarna är så lätt att förlora. Jag tänkte jag skulle prova att göra min egen Hårdvaruvers...

5 skäl varför du är inte kompetent att programmet A Microcontroller

när börjar med microcontrollers du sannolikt att möta några problem i programmering din microcontroller och det finns inget mer frustrerande än slösa timmar att hitta problemet och stilla inte kunna. Jag har arbetat med olika typer av mikrokontroller...

Aleph 1,0 - Internet kontrollerad Mikroskop Roboten Manipulator

Aleph 1.0 är en avlägsen kontrollerade robotic manipulator för biologiska eller kemiska sonder. Idén kom från det faktum att forskare behöver ett säkert sätt att manipulera och analysera bioriskavfall eller giftiga ämnen eller att helt enkelt Observe...

Arduino Microcontroller och dess olika tillämpningar

Arduino microcontroller och dess olika tillämpningarSteg 1:...

Mångsidiga mobila Manipulator Mk 1

Kort beskrivning:Bygga din egen DIY giant robot som spelar piano, ritar bilder, förbereder mat, vatten växter, bedriver ljussabel dueller och mer. Den mångsidiga mobil Manipulator är en avancerad öppen källkod mänskliga-size mobil robotik plattform f...

Hur du ändrar fuse bitar av AVR Atmega328p - 8 bitars microcontroller med Arduino

I detta instructable du lära dig att ändra fuse bitar av Atmega328p mikrokontroller. Jag använder Arduino mega som programmerare till program Atmega328P-PU på bakbord. Den levereras med en standard 1MHz inre kalibrerad oscillator frekvens. Jag vill ä...

Använda allmänt tillgängliga program för att manipulera bilder

professionella grafiska designers använder dyra program som Photoshop och Illustrator för att arbeta med bildfiler. Det finns fria alternativ som Gimp och Inkscape, de är underbara, men det finns fortfarande en brant inlärningskurva och de är verklig...

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...