Atmel start 3: Binky en-PORT, PIN, DDR och LED (4 / 12 steg)
Steg 4: Atmel hemlighet: DDR och portar och stift
Här aktuella steget tar en paus från konstruktion och test. Människor ofta fråga (och bör be) hur man växla spänningsnivån (dvs logik state) på en MCU port pin man gör en LED blinkar (figur 1) och hur man läser en digital ingång.
Ofta en mikrokontroller (MCU) eller processor talar en av "porten" vilket innebär att en grupp av kablar som antingen ger data ur MCU eller till MCU. För en integrerad krets se "trådarna" fysiska stiften på IC. Atmel AVR MCU har i allmänhet portar med 8 stift eftersom MCU använder 1 byte stort data bussar. Hamnarna benämns ofta som Input-Output portar eller IO portar eller bara IO; Detta är digital IO portar. Atmel MCU kan ha många sådana IO portar som är märkta A, B, och så vidare. En finner ofta Atmel nyckelord PORTA, PORTB, PORTC, PORTD. Behaga läsa om denna punkt och märker att en fysisk port avser fysiska stiften på IC. Atmel använder nyckelorden för PORT och PIN (Obs caps) med hänvisning till Output och Input och register. Form av definition är ett register [14] en typ av minnesplats (kanske bättre kallas "lagringsplats") med särskilda förbindelser/sammankoppling till maskinvara. Registret är inte anses vara en del av programmet och variabel minne även om det kan vara möjligt att läsa, skriva, manipulera och överför register innehållet.
Här är nu del av hemligheten. Atmel jargong refererar ordet PORT (som används i PORTB till exempel) till en digital utgångsport whereby MCU genererar en spänning på trådarna spännande MCU. Atmel ordet PIN (som används i PINB till exempel) innebär MCU förlägger gruppen av fysiska ledningar i en hög impedans och MCU kan läsa digitala spänningar (0 eller Vcc där Vcc = 5 för experimenter's board inställningarna). Kanske mer viktigt, PORTB och PINB hänvisar till samma grupp av fysiska ledningar på MCU. En liknande kommentar gäller PORTA och PINA förutom fysiska stiften kommer allmänna skiljer sig från dem som PORTB och PINB hänvisar. Så hur avgör man om en fysisk pin på MCU är en ingång och en utgång för MCU?
Låt oss säga detta igen med andra ord. Det finns en skillnad mellan PORT och stift i ATMEL med C/C++. Ordet hamn refererar till ett register som ger utgångar till MCU fysiska stift. PORT registret lagrar 1: or och 0: or och MCU översätter dessa logiska värden för spänningar av Vcc och noll, respektive, på de fysiska pins. Ordet PIN refererar till ett register som tar emot indata från en grupp av fysiska stift. MCU kommer att översätta spänningar Vcc och noll på fysiska stiften till logisk 1: or och 0: or, respektive, för PIN registret. Observera ordet fysiska syftar till faktiska kort ledningarna utskjutande från MCU-paketet. Vi använder ofta ordet "port" med hänvisning till insamling av 8 stift; Detta bör läsas som fysisk port och fysiska stift.
OK, så hur gör man specificera om en fysisk pin är en ingång och en utgång för MCU? Atmel AVR använder begreppet Data riktning registrera DDR. Varje grupp av kablar bildar en fysisk IO port har sådan en DDR och märkta som DDRA, DDRB, DDRC, DDRD och så vidare. En DDR är ett 8-bitars register (dvs minne/lagring läge) liknar det motsvarande registret för 8-bitars IO portar. Värdet 1 i DDR stånd motsvarar en utgång för motsvarande fysiska stift. Värdet 0 ger en ingång på motsvarande fysiska PIN-koden. Till exempel motsvarar DDRB fysiska PortB. När DDRB bit #i har värdet av 1 sedan pin #i i fysiska PortB blir en utgång för MCU. Å andra sidan, när DDRB lite har #i ett nollvärde då fysiska pin #i i fysiska PortB kommer att vara en ingång. Kanske skulle mer konkreta exempel vara bättre.
Exempel 1: Enkel digital utgång och sju digitala ingångar
Överväga fysiska PortB på ATTiny2313A och anser att tabell 1 nedan. Den övre raden visar fysiska stiften på 20pin dopp paketet som visas på första sidan eller två av Atmel datablad. Den andra raden innehåller Atmel-namn för den fysiska stiftet.
Tabell 1: Exempel visar ATTiny2313A Pin 12 som en utgång och andra port B stiften som insatsvaror.
Fysiska Pins | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 |
Namn | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
DDRB | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Fysiska PortB | I | I | I | I | I | I | I | Ute |
Anta nu att vi först har satt DDRB = 1 som visas i den tredje raden i tabell 1. DDRB registret skulle normalt anges före läsning eller skrivning av PortB. MCU läser DDRB registret och anger det fysiska pin #12 som en utgång. Eftersom de andra bitarna i DDRB är noll, återstående fysiska stiften 13-19, som heter B1-B7, är alla ingångar. Vid denna punkt, programmet kan läsa eller skriva PortB sedan indata och utgångar har ställts in.
Exempel 2: Två produktionen stift och 6 ingångar
Tabell 2: Exempel med stift 13 och 14 som utgångar och resten ingångarna.
Fysiska Pins | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 |
Namn | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
DDRB = 00000110 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
Fysiska PortB | I | I | I | I | I | Ute | Ute | I |
Den tredje raden i tabell 2 visar att vi först har satt DDRB = 00000110 i binär. I C/C++ detta skrivs som DDRB = 0b110 där "0b" betyder "binär". De inledande nollorna har utelämnats för enkelhet att ingå "110" men de kan ingå i instruktionen C som DDRB = 0b00000110 om så önskas. Samma värde kan skrivas i decimalform som DDRB = 6. Och det kan skrivas i hexadecimal form som DDRB = 0x06 där "0 x" står för hexadecimalt. Den fysiska PortB har därför pin13 och stift 14 som utgångar och alla andra stift som insatsvaror.
Kommentar: De fysiska stift som är utgångar kommer att kunna generera endera av två stater, nämligen noll och Vcc. För vårt projekt, experimenter's styrelse använder Vcc = 5v medan livlina konstrueras i en plastlåda använder Vcc som batteriets spänning, som kan variera från 4,9 volt till 3 volt beroende på laddning av batterierna. Utspänningen kan sedan användas för att styra andra komponenter. Atmel fysiska stift kan antingen käll- eller diskbänken 40mA av strömmen. För att kontrollera, hänvisa till de elektriska egenskaperna i spec/data täcker till exempel http://www.atmel.com/Images/doc8246.pdf. Så utgångsstiftet kan ge (dvs källa) bias ström när den fysiska stiftet har på utspänning av + Vcc eller det kan ta emot ström (dvs sjunka) när den fysiska pin har 0v.
Exempel 3: Skriva värden till utgångar
OK så låt oss ta ett par exempel för att använda DDRB, PORTB och PINB. Först överväga PORTB.
Tabell 3: Ett exempel att göra IO Port B pins utgångar.
Fysiska Pins | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 |
Namn | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
DDRB | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Fysiska PortB | Ute | Ute | Ute | Ute | Ute | Ute | Ute | Ute |
PORTB = 0b0100100 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
Fysiska Pin resultatet | 0V | VCC | 0V | 0V | 0V | VCC | 0V | 0V |
I exemplet i tabell 3 har vi först ange DDRB = 0b11111111 = 0xFF = 255 decimal så att fysiska stift 12-19 är alla utgångar för MCU. Nästa antar vi skriver följande byte till utgång registret för B som PORTB = 0b0100100 som visas i den sjätte raden i tabell 3. Obs "PORTB =" sätt att ställa in PortB utgång register till ett värde – det är lättare att tänka på PORTB som en variabel och "PORTB =" sätt att ange variabeln som motsvarar ett värde, som MCU översätts till spänningar på fysisk port. När PORTB har logic '1', produktionen bör ställa ut det fysiska genomförandet av '1' som är Vcc eller, för våra experimenter's styrelse,
Logic 1 = > Vcc = + 5volts
Använder logik 1 på detta sätt kan för en stor många olika plattformar att använda samma kodning så länge MCU vet hur man förvandlar logik värdena till spänningar. Så jämför de sjätte och sjunde raderna i tabell 3 visar att de fysiska pins som en logik 1 har skrivits ställer ut en spänning på Vcc. De andra stiften har noll volt potentiella. VIKTIG punkt: Tecken "PORTB =" i detta fall innebär att skriva något till fysiska stiften i PortB (faktiskt detta först skriver att PORTB registrera dig och sedan logik värdena är översatt av spänning genererar kretsar i MCU). På detta sätt kan MCU styra externa kretsar.
Exempel 4: Läs värden från input pins
Nu överväga ett annat fall där vi först ange (i vårt program) DDRB = 0b00000000 (binära) = 0x00 (hex) = 0 (decimal) som i tabell 4. Här kommer alla fysiska stift 12-19 att ingångar på grund av alla nollorna i DDRB.
Tabell 4: Exempel på stift 12-19 är alla ingångar.
Fysiska Pins | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 |
Namn | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
DDRB | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Fysiska PortB | I | I | I | I | I | I | I | I |
Tillämpad volt till stift | 0V | 0V | 0V | 0V | 0V | VCC | 0V | VCC |
PINB innehållet | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
Vidare antar att några externa agent (som mig eller dig) gäller spänning att MCU fysiska stift 12-19 som visas i den sjätte raden i tabell 4. VIKTIG punkt: Använda "= PINB" betyder att läsa spänningar på fysiska stiften motsvarar IO PortB och konvertera dem till logik värden. Detta skulle användas i ett C/C++ tilldelningssats såsom "x = PINB". Innehållet i variabeln x (dvs PINB) kan ses i den sista raden i tabell 4 har värdet
x = 0b00000101 (binära) = 0x05 (hex) = 5 (decimal)
MCU konverterar Vcc på en ingångsstift att logik värdet 1 och noll annars. På detta sätt, kan MCU läsa påstår av externa kretsar.
Exempel 5: Blandade IO och Pull-up motstånd
Det finns fortfarande en annan möjlig situation där en IO-port har både indata och utdata och MCU utför skrivåtgärder till porten. Vad händer? För ett stift som är en ingång, skriva (med PORTB etc) kan aktivera eller inaktivera en inre pull-up resistor beroende på om motsvarande bit in Skriv är en 1 eller 0 respektive. Se start 4. Läsa en port (med PINB etc) av blandade IO (vissa stift i hamnen är utgång och resten är ingång) kommer att läsa indata när PIN-koden anges som indata och det läser tidigare skriftliga värde (som är fortfarande i PORTB register) om fysiska PIN-koden är en utgång. Referera till start 4 eller bruksanvisning för detaljer [0,1].
Nu till koden Blinky en projektet.