Stap 2: Lezen en schrijven van Registers
Manipuleren van AVR registreert tijdens het hardlopen
Om een lijst van alle bekende registers op je Arduino, typt u:
print registers
en je krijgt een afdruk uitziet...
I know about the following registers: TIFR0 PORTC TIFR1 PORTD TIFR2 DDRD PCIFR DDRB EIFR DDRC EIMSK PINB EECR PINC EEDR PIND SREG EEARL GPIOR0 EEARH GPIOR1 GTCCR GPIOR2 TCCR0A TCCR0B TCNT0 OCR0A OCR0B SPCR SPDR ACSR SMCR MCUSR MCUCR SPMCSR WDTCSR CLKPR PRR OSCCAL PCICR EICRA PCMSK0 PCMSK1 TIMSK0 TIMSK1 TIMSK2 ADCL ADCH ADCSRA ADCSRB ADMUX DIDR0 DIDR1 TCCR1A TCCR1B TCCR1C TCNT1L TCNT1H ICR1L ICR1H OCR1AL OCR1AH OCR1BL OCR1BH TCCR2A TCCR2B TCNT2 OCR2A OCR2B ASSR TWBR TWSR TWAR TWDR TWCR TWAMR UCSR0A UCSR0B UCSR0C UBRR0L UBRR0H UDR0 PORTB root
Om te zien hoe de individuele bits zijn ingesteld in een register, de kat of echo opdracht te gebruiken:
cat %GPIOR0
Ik vraag hier het opdrachtverwerkingsprogramma echo, de inhoud van het algemene doel i/o-Register #0, of weer. Opmerking het procentteken (%) voor de registernaam. U moet dit om aan te geven naar de shell dat dit een gereserveerde sleutelwoord identificeren een register. Het voorbeeld van de uitvoer uit een echo opdracht ziet er zo uit:
GPIOR0(0x0) set to [00000000]
De output toont de naam van het register, de hexadecimale waarde die wordt gevonden in het register en de binaire vertegenwoordiging van het register (het tonen van elke bit een 1 of 0). Gebruik de "index of" operator [] om een bepaalde bit in een register. Bijvoorbeeld, laten we zeggen dat ik wil de 3de bit een 1.
%GPIOR0[3] = 1
en de shell zal u een antwoord met zijn actie en het resultaat:
GPIOR0(0x0) set to [00000000] --> (0x8) set to [00001000]
Dont' vergeet het procentteken te vertellen van de shell je werkt met een register. Merk ook op dat door de 3de bit, dat is 4 bits in omdat het onze AVR gebruiken een op nul gebaseerde index. Met andere woorden, tellen tot de 3de bit u rekenen 0, 1, 2, 3, oftewel de 4e plaats, maar de 3de bit. U kunt een beetje op dezelfde manier wissen door een beetje op nul instellen.
Door het instellen van de bits zoals dit kunt u de werking van uw AVR op de vlieg. Bijvoorbeeld door het veranderen van de CTC timer overeenkomen met de waarde die wordt gevonden in OCR1A. Ook kun je peek in specifieke instellingen die u in uw code, zoals de UBBR waarde voor uw baud-rate moet programmatisch controleren.
Werken met DDRn, PORTn en PINn
De I/O pinnen zijn ook toegewezen aan registers en kunnen worden ingesteld op precies dezelfde manier, maar een speciale syntaxis is opgericht om te werken met deze soorten registers.
In code, er is een normaal proces voor, zeg, draaien op een LED of ander apparaat dat een digitale hoog of laag vereist. Het vereist instellen van de Data richting Register om aan te geven de pin voor uitvoer en dan het schrijven van een 1 of een 0 met de bepaalde bit in de juiste poort. In de veronderstelling dat we een LED die aangesloten op digital pin 13 (PB5) en wij willen schakelen, hier is hoe dat te doen terwijl uw AVR wordt uitgevoerd:
set pin pb5 outputwrite pin pb5 high
De output, naast de mogelijkheid om te zien uw LED kom op, zou er zo uitzien:
root set pin pb5 outputSet pb5 for outputroot write pin pb5 highWrote logic high to pin pb5
De "root is de shell-prompt die aangeeft dat het bereid is te aanvaarden opdrachten van u. De LED om uit te schakelen, zou u gewoon een lage schrijven naar de pin. Als u lezen de digitale ingang van een pin wilt, opdracht Lees. Met behulp van onze bovenstaande voorbeeld:
root read pin pb5Pin: pb5 is HIGH
Alternatief, enkel echo het pin-register dat die pin poort besturingselementen. Bijvoorbeeld, als wij hebben de dip-schakelaars aangesloten op digital pin 7 en 8 (PD7 en PD8), kon u de opdracht verzenden:
echo %PIND
en de shell zou dan wordt de inhoud van het register, tonen u alle van de Staten van de input/output van de aangesloten apparaten en of de stand van de schakelaar in- of uitschakelen.