Stap 4: Atmel geheim: DDRs of poorten en PINs
Deze huidige stap neemt een pauze van bouw- en test. Mensen vaak vragen (en moet) hoe om te schakelen van het spanningsniveau (dat wil zeggen, logica staat) op een MCU poort pin te maken van een LED knipperen (figuur 1) en hoe om te lezen van een digitale ingang.
Vaak met betrekking tot een microcontroller (MCU)-processor of spreekt men van 'poort', wat betekent dat een groep van draden dat ofwel brengt gegevens uit de MCU of in het MCU. Voor een geïntegreerde schakeling verwijzen de 'draden' naar de fysieke pinnen op de IC. De MCU Atmel AVR's hebben over het algemeen poorten met 8 pinnen elke aangezien de MCU 1 byte breed gegevens bussen gebruikt. De poorten worden vaak aangeduid als Input-Output poorten, als IO poorten of als enkel IO; Dit zijn de digitale IO poorten. De Atmel MCU's hebben veel dergelijke IO poorten die worden geëtiketteerd als A, B, enzovoort. Vaak vindt men de Atmel sleutelwoorden van PORTA, PORTB, PORTC, PORTD. Gelieve te herlezen van dit lid en merken dat een fysieke poort naar de fysieke pinnen op de IC verwijst. Atmel maakt gebruik van de sleutelwoorden van de haven en PIN (Opmerking caps) met betrekking tot de Output en Input en registers. Bij wijze van definitie is een register [14] een soort geheugenlocatie (misschien beter 'opslagplaats' genoemd) met speciale betrekkingen/interconnectiviteit aan hardware. Het register wordt niet beschouwd als deel van het programma en variabele geheugen hoewel het mogelijk is om te lezen, schrijven, bewerken en breng de inhoud van het register.
Nu hier deel van het geheim is. In Atmel jargon verwijst het woord poort (zoals gebruikt in PORTB bijvoorbeeld) naar een digitale uitvoerpoort waarbij de MCU genereert een spanning op de draden verlaten de MCU. Het woord van de Atmel PIN (zoals gebruikt in PINB bijvoorbeeld) de MCU betekent plaatst de groep van fysieke draden in een hoge impedantie-staat en de MCU vindt de digitale spanningen (0 of Vcc waar Vcc = 5 voor de installatie van de Raad van bestuur van de experimentator). Misschien nog belangrijker is, PORTB en PINB verwijzen naar dezelfde groep van fysieke draden op de MCU. Een soortgelijke opmerking geldt voor PORTA en PINA behalve de fysieke pinnen algemene zullen afwijken van die PORTB en PINB betrekking hebben. Dus hoe men bepalen of een fysieke pin op de MCU een invoer of een uitvoer voor het MCU is?
Laten we zeggen dat dit opnieuw met andere woorden. Er is een verschil tussen haven en PIN in ATMEL met behulp van C/C++. Het woord poort verwijst naar een registreren waarmee uitgangen naar de fysieke pinnen van MCU. 1s en 0s worden opgeslagen in het register van de haven en de MCU vertaalt deze logische waarden spanningen van Vcc en nul, respectievelijk op de fysieke pinnen. Het woord PIN verwijst naar een register dat de invoer uit een groep van fysieke pinnen ontvangt. De MCU zal het vertalen van de spanningen van de Vcc en nul op de fysieke pinnen aan logische 1s en 0s, respectievelijk voor de PIN-register. Zoals u ziet, dat het woord fysieke verwijst naar de werkelijke korte draden uitsteken van de MCU-pakket. We gebruiken vaak het woord 'haven' verwijzing naar de collectie van de 8 pinnen; Dit moet worden gelezen als fysieke poort en fysieke pinnen.
OK, dus hoe geeft één of een fysieke pin is een invoer of een uitvoer voor het MCU? Atmel AVR gebruikt het concept van de Data richting registreren DDR. Elke groep van draden vormen een fysieke IO-poort heeft een dergelijke DDR en aangeduid als DDRA, DDRB, DDRC, DDRD, enzovoort. Een DDR is een 8-bit register (dat wil zeggen, geheugenopslag/locatie) vergelijkbaar met het bijbehorende register voor de 8 bit IO poorten. Een waarde van 1 in een DDR-standpunt komt overeen met een uitgang voor de corresponderende fysieke pin. Een waarde van 0 produceert een ingang op de corresponderende fysieke pin. Als voorbeeld, DDRB komt overeen met fysieke PortB. Wanneer DDRB-bits #i heeft de waarde 1 dan pin #i in fysieke PortB zullen een output voor de MCU. Aan de andere kant, als DDRB beetje heeft #i een waarde nul kan fysieke pin #i in fysieke PortB zal een ingang. Meer concrete voorbeelden zou misschien beter zijn.
Voorbeeld 1: Één digitale uitgang en zeven digitale ingangen
Overwegen fysieke PortB op de ATTiny2313A en overwegen van tabel 1 hieronder. De bovenste rij bevat de fysieke pinnen op de 20pin duik pakket zoals op de eerste pagina of twee van de Atmel data sheet. De tweede rij bevat de naam van de Atmel voor de fysieke pin.
Tabel 1: Voorbeeld ATTiny2313A Pin 12 als een uitgang en de andere poort B-pinnen als ingangen.
Fysieke pinnen | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 |
Naam | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
DDRB | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Fysieke PortB | In | In | In | In | In | In | In | Uit |
Stel nu dat we eerst hebben vastgesteld DDRB = 1, zoals in de derde rij van tabel 1. Het DDRB-register zou normaal gesproken voorafgaand aan het lezen of wegschrijven van PortB worden ingesteld. De MCU leest het DDRB-register en de fysieke pin #12 ingesteld als uitgang. Omdat de andere bits in DDRB nul, de resterende fysieke pinnen 13-19, die heten B1-B7, zijn alle ingangen. Op dit punt, het programma kon lezen of schrijven van de PortB sinds de invoer en uitgangen zijn vastgesteld.
Voorbeeld 2: Twee output pinnen en 6 ingangen
Tabel 2: Voorbeeld met pin 13 en 14 als uitgangen en ingangen van de rest.
Fysieke pinnen | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 |
Naam | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
DDRB = 00000110 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
Fysieke PortB | In | In | In | In | In | Uit | Uit | In |
De derde rij van de tabel 2 laat zien dat we eerst hebben vastgesteld DDRB = 00000110 in binary. In C/C++ is dit geschreven als DDRB = 0b110 waar de '0b' betekent 'binair'. De voorloopnullen zijn weggelaten voor eenvoud deel uitmaken van de '110' maar ze kunnen worden opgenomen in de C-instructie als DDRB = 0b00000110 indien gewenst. Dezelfde waarde kan worden geschreven in decimale als DDRB = 6. En het kan worden geschreven in de hexadecimale notatie als DDRB = 0x06 waar de '0 x' staat voor de hexadecimale notatie. De fysieke PortB heeft daarom pin13 en pin 14 als uitgangen en alle andere pinnen als ingangen.
Commentaar: Deze fysieke pinnen die uitgangen zullen kunnen genereren een van twee staten, namelijk nul en Vcc. Voor ons project, gebruikt het de experimentator bestuur Vcc = 5v, terwijl de levenslijn worden geconstrueerd in een plastic doos gebruikt Vcc als de accuspanning, die van 4.9 volt tot 3 volt afhankelijk van de toestand van de lading van de batterijen variëren kan. De uitgangsspanning kan vervolgens worden gebruikt voor de bediening van andere apparaten. Atmel fysieke pinnen kunnen bron of sink 40mA van de huidige. Als u wilt controleren, verwijzen naar de elektrische kenmerken in de spec/gegevensbladen zoals http://www.atmel.com/Images/doc8246.pdf. Zodat de uitgang-pins kan leveren (d.w.z., bron) bias huidige wanneer de fysieke pin op uitgangsspanning van heeft + Vcc of het huidige kunt ontvangen (dat wil zeggen, zinken) wanneer de fysieke pin 0v heeft.
Voorbeeld 3: Schrijf waarden op de uitgangen
OK dus laten we eens een paar voorbeelden van het gebruik van DDRB, PORTB en PINB. Eerst overwegen de PORTB.
Tabel 3: Een voorbeeld maken van IO poort B-pinnen uitgangen.
Fysieke pinnen | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 |
Naam | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
DDRB | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Fysieke PortB | Uit | Uit | Uit | Uit | Uit | Uit | Uit | Uit |
PORTB = 0b0100100 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
Fysieke Pin resultaat | 0V | VCC | 0V | 0V | 0V | VCC | 0V | 0V |
In het voorbeeld van tabel 3, zetten we eerst DDRB = 0b11111111 = 0xFF = 255 decimale zodat de fysieke pinnen 12-19 zijn alle uitgangen voor de MCU. Vervolgens Stel dat we de volgende byte schrijven naar het register van de uitvoer voor B als PORTB = 0b0100100 zoals in de zesde rij van tabel 3. Opmerking ' PORTB =' register van de uitgang van de middelen om in te stellen van de PortB op een waarde-is het makkelijker om na te denken van PORTB als een variabele en ' PORTB =' middelen om in te stellen die variabele gelijk aan een waarde die de MCU naar de spanningen op de fysieke poort vertaalt. Wanneer PORTB logica '1' heeft moet de output vertonen de fysieke realisatie van de '1' oftewel Vcc of, voor onze experimentator van bestuur,
Logica 1 = > Vcc = + 5volts
Met behulp van logica 1 op deze manier zorgt voor een geweldig veel verschillende platformen de dezelfde codage zo lang als de MCU weet hoe om te zetten van de waarden van de logica in spanningen te gebruiken. Dus het vergelijken van het zesde en zevende rijen van tabel 3 toont dat de fysieke pinnen waarnaar een logica 1 heeft geschreven een spanning van de Vcc zal vertonen. De andere pennen hebben nul volt potentiële. BELANGRIJK punt: De tekens "PORTB =" betekent in dit geval om iets te schrijven naar de fysieke pinnen in PortB (eigenlijk dit eerst schrijft naar de PORTB registreren en vervolgens de waarden van de logica worden vertaald door spanning genereren van circuits in het MCU). Op deze manier kunt de MCU externe circuits.
Voorbeeld 4: Waarden lezen van input pins
Nu overwegen een ander geval waar we eerst (in ons programma instellen) DDRB = 0b00000000 (binair) = 0x00 (hex) = 0 (decimaal) zoals in tabel 4. Hier zullen alle van de fysieke pinnen 12-19 ingangen vanwege alle de nullen in DDRB.
Tabel 4: Voorbeeld tonen Pins 12-19 zijn alle ingangen.
Fysieke pinnen | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 |
Naam | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
DDRB | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Fysieke PortB | In | In | In | In | In | In | In | In |
Toegepaste volt tot en met Pin | 0V | 0V | 0V | 0V | 0V | VCC | 0V | VCC |
PINB inhoud | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
Verder stel dat sommige externe agent (zoals mij of jou) past spanningen aan het MCU fysieke pins 12-19 zoals aangegeven in de zesde rij van tabel 4. BELANGRIJK punt: Het gebruik van '= PINB' betekent om te lezen van de spanningen die aanwezig zijn op de fysieke pinnen overeenkomt met IO PortB en hen omzetten in logica waarden. Dit zou worden gebruikt in de instructie voor het toewijzen van een C/C++, zoals ' x = PINB'. De inhoud van de variabele x (bijvoorbeeld PINB) kunnen worden gezien in de laatste rij van de tabel 4 de waarde
x = 0b00000101 (binair) = 0x05 (hex) = 5 (decimaal)
De MCU converteert Vcc op een invoer pin aan de waarde van de logica van 1 en nul anders. Op deze manier kan de MCU lezen de Staten van externe circuits.
Voorbeeld 5: Gemengde IO en Pull-up weerstanden
Er is nog een andere mogelijke situatie waarbij een IO-poort heeft beide Input en Output en de MCU voert een schrijven aan de poort. Wat gebeurt er? Voor een pin thats een inbreng het schrijven (met behulp van PORTB enz) kan in- of uitschakelen van een interne pull-up weerstand afhankelijk van de bijbehorende bit in het schrijven een 1 of 0 respectievelijk. Verwijzen naar opstarten 4. Een poort (met behulp van PINB enz) lezing van gemengde leest IO (sommige pinnen in de haven worden uitgevoerd en de rest zijn input) de input wanneer de pin is ingesteld als input en het zal het lezen van de eerder getypte waarde (die is nog steeds in het register PORTB) als de fysieke pin een output is. Verwijzen naar opstarten 4 of de gebruikershandleiding voor details [0,1].
Nu om te coderen de Blinky één project.