MicroController Register Manipulation (3 / 6 steg)

Steg 3: ChipKIT Microcontrollers med PIC32 marker


Låt oss börja med min personliga favorit familj av mikrokontrollers, chipKIT. (Om du vill, den förkortade skissen för Arduino UNO är i nästa steg, men logiken förklaras här.) Använda mikrochips PIC32 32-bitars processorer, chipKIT har långt mer minne, nästan dubbelt så många I/O pins, och går mycket snabbare än jämförbara Arduino styrelser, så om du behöver det extra glans, jag skulle rekommendera du titta på att få en. (Det är också en bra idé att bekanta dig med så många enheter som möjligt att göra själv så användbar som möjligt för en arbetsgivare, om det är ditt mål.)

Varje i/o pin på en mikrokontroller är ansluten till minst tre olika register. (Stift som har flera funktioner förknippade med dem. har flera mer, e.g. PWM och I2C/SPI/UART.) Av tre vi handlar, är en TRISx registret som avgör om PIN-koden är en ingång och en utgång, där "x" designerar som TRIS arbetar vi med eftersom det finns flera ( pinMode() -funktionen anger TRISx). Ställa in lite i TRISx som en 1 kommer in motsvarande stift som indata, och det följer att ställa in det som en 0 kommer att ange PIN-koden som en utgång. Nästa är LATx registret, vilket är där vi tilldelar en PIN-kod anges som en utgång vara hög (1) eller låg (0) (digitalWrite() anger LATx). Sist är PORTx registret, och det är där vi kan läsa det aktuella läget för PIN-koden när den är inställd för indata (digitalRead() läser PORTx). Lite '1' i PORTx visar att det motsvarande ingångsstiftet är att upptäcka en logik högt värde. Varje register uppdateras med perifer buss klockan medan koden körs så din input/output status blir verklig tid. Tekniskt du kan läsa/skriva till alla tre av dessa register, men du verkligen bara vill skriva till TRISx registrera en gång i din setup() uttalande i början av din skiss. Du kan hämta både LATx och PORTx och använda data som behövs, men skriver en 1 till LATx registret för ett stift som designeras som indata kommer inte eftersom det kan spara (du satt upp som en ingång med TRISx registret). Förvirrad ännu?

Hålla på lastbilstransporter, det är meningsfullt.

För att initiera TRISx i installationsprogrammet(), måste du först veta vilka register och bitar är knutna till vilket stift. Med hjälp av pin-ut tabellen (se bifogad PDF-fil nedan) för chipKIT Uno32, kan vi se att stift 26→33 mappas mycket fint för att registrera E, bitar 0→7. (Jag tycker det är lättare att använda sekventiell bitar i ett register. Senare kommer vi att göra några bitvis operationer, och det förenklar saker.) Det ska vara meningsfullt sedan att vi kommer att sätta TRISE, bitar 0→7. Tittar tillbaka på koden, vi fast beslutna att stift 26→29 vore lysdioder och 30→33 skulle vara växlarna. Stift 26→29 karta till TRISE bitar 0→3. Lysdioder är utgång, så bits 0→3 få en 0. Stift 30→33 karta till TRISE bitar 4→7. Växlar är input, så bits 4→7 få en 1. Titta på registret bit för bit, behöver vi de sista 8 bitarna i TRISE att vara 1111 0000. Ta en sekund att se till att du förstår varför.

Vi kunde bara tilldela värdet, antingen med en hex värde av 0xF0 eller ett binärt värde av 0b11110000, direkt till TRISE med linjen

TRISE = 0XF0;

men vi riskerar att oavsiktligt ändra de andra mer signifikanta bitarna i registret. Kom ihåg att vi har att göra med 16-32 bitars register med PIC32. (Från tabell 4-27 på pg 73 i databladet för PIC32MX320F128, jag vet att TRISE bara ger mig tillgång till de 10 minst signifikanta bitarna, men jag väljer att skydda hela 16-bitars register som en fråga om goda metoder.) Vi måste se till att vi bara sätter exakta bitar vi behöver medan de andra bitarna i vilken stat de är för närvarande på så vi inte av misstag jack grejer upp. För att göra detta, använder vi en teknik som kallas maskering och vissa bitvisa logiska operatorer. Låt oss säga att TRISE börjar med ett värde av 0b1101 0010 1001 1011. Med hjälp av operatorn bitvisa logiska eller "|", vi eller TRISE med 0b0000 0000 1111 0000 (0x00F0). När vi eller, där det finns en '1', resultatet kommer alltid att vara en man. Om det finns en '0', kommer resultatet att fastställas av den andra operanden. Tillbaka till vårt exempel, om vi OR 0b1101 0010 1001 1011 med 0b0000 0000 0000 1111 vi sluta med 0b1101 1111 0010 1011. Vi kan se att bitar 4→7 är nu alla 1, vilket är vad vi ville.

Med liknande logik och AND-operatorn, vi tar sedan TRISE och och den med 0b1111 1111 1111 0000. Varje gång vi och med en '0', resultatet är alltid en 0. ANDing med en '1' resultat av den andra operanden. Så vi har 0b1101 0010 1111 1011, och det med 0b1111 1111 1111 0000 och resultatet är 0b1101 0010 1111 0000. De sista fyra bitarna, 0→3, är nu 0, vilket återigen vad vi ville. Observera att de 8 mest signifikanta bitarna lämnas orörd. De två operationerna (eller) kan vändas utan att påverka resultatet. De två raderna i koden för detta är följande:

TRISE = TRISE | 0x00F0; 0b0000 0000 0000 1111

TRISE = TRISE & 0xFFF0; 0b1111 1111 1111 0000

Om det gör det lättare, kan hex/bin värdena tilldelas som int variabler innan installationsprogrammet().

Nu när vi har TRISE in, (pinMode()), kan vi nu skriva våra loop() uttalande. Ser tillbaka på den kortare, förenklad versionen av koden i det sista steget, Lägg märke till att vi läser tillståndet för ingångsstiftet (digitalRead() = PORTE) och mappa den till produktionen stift (digitalWrite() = sen). Så sen = PORTE, men med en liten justering. Kom ihåg att knapparna är knutna till PORTE bitar 4→7 och lysdioderna är bundna till sena bitar 0→3. Om vi skriver sent = PORTE, vi skriver tillståndet i PORTE bitar 4→7 till sena bitar 4→7, inte sena bitar 0→3. Vi måste skifta PORTE data över till höger 4 utrymmen så att den matchar bit placeringen i sena. Annorlunda uttryckt, om PORTE läser 0b0010 1101 1111 0000, bitar 4→7 är alla höga. Vi flytta data rätt av 4 bitar (0b0000 0010 1101 1111) och tilldela sen, bitar 0→3 hög och alla 4 lysdioder lyser upp denna nya värde. En bitvis SKIFT är enkel för processorn att göra och påverkar inte de aktuella uppgifterna på PORTE. PORTE data kopieras faktiskt till ett tillfälligt register och det är en som är manipulerad om det behövs. Det enda sättet för PORTE ändra värden är att ändra knapplägen. Här är kodraden:

SENT = PORTE >> 4.

Du kommer att märka att jag inte försöker göra någon maskering här när du tilldelar sen PORTE. Anledningen är att sen används inte för något annat än produktionen, och om den specifika biten i TRISE inte har angetts som en utgång, en 1 på den biten i sen kommer inte att ha någon effekt. Samma sak gäller för PORTE när du försöker läsa den. Du kan koppla en knapp till något lite i PORTE, men om du tilldelar PORTE som indata i TRISE, trycka på knappen kommer inte att ändra värdet i registret. Alla ändringar är vandrande och slumpmässiga eftersom den PIN-kod har ingen pull-up resistor/ner.

Genom att använda 4 sekventiella bitar i PORTE, är extrahera data en enkel sak att bitvis skiftande, vilket är en löjligt billig verksamhet vad beträffar chipet är av tid och resurser som behövs. Om vi hade använt utspridda bitar och register runt bordet, vi skulle behöva göra några maskering och ANDing och ORing, men vi kunde få data. Vi har även undvikit ringer pinMode(), digitalRead()och digitalWrite(), så vår kod bör ta upp mindre plats på chip eftersom filerna bakgrund behöver inte laddas. Låt oss se hur mycket utrymme behöver vi nu.

Här är koden:

/ * chipKIT registrera manipulation med 4 växlar och 4 lysdioder
* Uno32/uC32 - 4 växlar på stift 30-33, 4 lysdioder på stift 26-29.
* Max32 - 4 växlar på stift 30-33, 4 lysdioder på stift 34-37.
* DP32 - 4 växlar på stift 0-3, 4 lysdioder på stift 5-8.
* CMOD - 4 växlar på stift 35-38, 4 lysdioder på stift 20-23.
*/
void setup()
{
Uno32, Uc32 och Max32
TRISE = TRISE & 0xFFF0; Digital stift 26 -> 33 (37 -> 30 Max32) karta till
TRISE = FÖRSÖK | 0x00F0; Registrera dig E, bits 0 -> 7, respektive. EN '1'
definierar pin som ingång, "0" som utgång.
Vi använder den bitvis AND (&) först för att ställa in bitar
0-3 som 0 (output) och sedan bitvis OR (|) till
Ange bitar 4-7 som indata. Detta gör att de återstående
BITS vara opåverkad och undvika oönskade drift
och endast de 8 stift som vi vill. Du kan skriva
TRISE = 0xnnnn om du vill ange bara de bitar du vill ha
(där n är ett hexadecimalt tal) men det finns inget sätt
att veta hur andra bitar i registret
kommer att påverkas. Det kanske inte gör något, det kan inte.

DP32 endast
TRISB = TRISB & 0x17FF; Digital stift 0 -> 3 och 5 -> 8 karta till
TRISB = TRISB | 0x03A0; Registrera dig B, bits 5,7 -> 9 och 11,13 -> 15
respektive. Samma logik som ovan gäller
här med inställning registrera av TRIS.

CMOD endast
TRISB = TRISB & 0xFFF0; Digital stift 20 -> 23 och 35 -> 38 karta att registrera,
TRISB = TRISB | 0x01E0; BITS 0 -> 3 och 5 -> 8 respektive. Samma logik
som ovan gäller här med att sätta TRISx
Registrera dig.
}

void loop()
{
Uno32, Uc32 och Max32
SENT = PORTE >> 4. skriva status av växlar på PORTE till
Lysdioderna på sena, men lite skiftat rätt av 4 bitar.
Så RE7-4 karta till RE3-0.

DP32 endast
LATB = PORTB << 6.

CMOD endast
LATB = PORTB >> 5.
}

Denna kod tar 10 linjer utan kommentarer, och de flesta som är de nödvändiga setup() och loop() strukturerna. Det finns bara 3 rader av kod. 3.

Sammanställningen av detta i MPIDE för chipKIT Uno32 kräver 4792 byte, en minskning av 1532 byte från den kortare versionen i föregående steg som kostar 6324 byte.

Nästa steg visar samma kod men specifikt för ATMEL chip.

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