Anatomia di unistruzione in Arduino Pt.1
-
Upload
hack -
Category
Devices & Hardware
-
view
889 -
download
3
Transcript of Anatomia di unistruzione in Arduino Pt.1
Abbastanza semplice: 8 bit, poca RAM
Abbastanza complesso: c'è tanto da imparare!
Meno distrazioni per capire i meccanismi
Perché Arduino Uno?
void setup() { pinMode(LED_BUILTIN, OUTPUT);}
void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); }
Un LED lampeggia
digitalWrite(13, 1);
#define LED_BUILTIN 13
#define HIGH 0x1
(per Arduino Uno)
Sostituzione costanti
Comodità, semplicitàPortabilità (parziale)Isolamento dall'hardware
Inefficienza, scarso controlloDipendenzaIsolamento dall'hardware
GOOD
BAD
Dipende da cosa si deve fare
Librerie: pro e contro
void digitalWrite(uint8_t pin, uint8_t val){
uint8_t timer = digitalPinToTimer(pin);uint8_t bit = digitalPinToBitMask(pin);uint8_t port = digitalPinToPort(pin);volatile uint8_t *out;
if (port == NOT_A_PIN) return;
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
out = portOutputRegister(port);
uint8_t oldSREG = SREG;cli();
if (val == LOW) {*out &= ~bit;
} else {*out |= bit;
}
SREG = oldSREG;}
digitalWrite()
void digitalWrite(uint8_t pin, uint8_t val){
uint8_t timer = digitalPinToTimer(pin);uint8_t bit = digitalPinToBitMask(pin);uint8_t port = digitalPinToPort(pin);volatile uint8_t *out;
if (port == NOT_A_PIN) return;
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
out = portOutputRegister(port);
uint8_t oldSREG = SREG;cli();
if (val == LOW) {*out &= ~bit;
} else {*out |= bit;
}
SREG = oldSREG;}
Controllo che il pin non sia in uso
void digitalWrite(uint8_t pin, uint8_t val){
uint8_t bit = digitalPinToBitMask(pin);uint8_t port = digitalPinToPort(pin);volatile uint8_t *out;
if (port == NOT_A_PIN) return;
out = portOutputRegister(port);
uint8_t oldSREG = SREG;cli();
if (val == LOW) {*out &= ~bit;
} else {*out |= bit;
}
SREG = oldSREG;}
Blocco temporaneo degli interrupt
void digitalWrite(uint8_t pin, uint8_t val){
uint8_t bit = digitalPinToBitMask(pin);uint8_t port = digitalPinToPort(pin);volatile uint8_t *out;
if (port == NOT_A_PIN) return;
out = portOutputRegister(port);
if (val == LOW) {*out &= ~bit;
} else {*out |= bit;
}}
Parametri a 8 bit
void digitalWrite(uint8_t pin, uint8_t val){
uint8_t bit = digitalPinToBitMask(pin);uint8_t port = digitalPinToPort(pin);volatile uint8_t *out;
if (port == NOT_A_PIN) return;
out = portOutputRegister(port);
if (val == LOW) {*out &= ~bit;
} else {*out |= bit;
}}
bit mask, port address
*out = *out | bitmask;
Non confondere | con l'OR logico ||
OR bitwise in C
out
*out
l'indirizzo del registro (PORTB)
il dato contenuto nel registro
void digitalWrite(uint8_t pin, uint8_t val){
uint8_t bit = digitalPinToBitMask(pin);uint8_t port = digitalPinToPort(pin);volatile uint8_t *out;
if (port == NOT_A_PIN) return;
out = portOutputRegister(port);
if (val == LOW) {*out &= ~bit;
} else {*out |= bit;
}}
Tornando a digitalWrite
if (val == LOW) {*out &= ~bit;
} else {*out |= bit;
}
Tornando a digitalWrite
Mette un bit della porta a 1
out indirizzo di PORTBbit bitmask
if (val == LOW) {*out &= ~bit;
} else {*out |= bit;
}
Tornando a digitalWrite
Mette un bit della porta a 0
& AND bitwise in C~ NOT bitwise in C
Impostare la direzione del pin
Vale per gli AVR
void setup() { pinMode(LED_BUILTIN, OUTPUT);}
● DDR: data direction register
● DDRB bit 5 = ingresso / uscita
● DDR si usa come PORT