SlideShare a Scribd company logo
Arduino:
Anatomia di un’istruzione - 1
Enrico Colombini (Erix)
µhackademy 21 Ottobre 2016
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(LED_BUILTIN, HIGH);
Ma cosa c’è sotto?
Semplice, no?
digitalWrite(13, 1);
#define LED_BUILTIN 13
#define HIGH 0x1
(per Arduino Uno)
Sostituzione costanti
Il numero 13 è arbitrario
Pin di I/O
digitalWrite(13, 1);
Non è una funzione standard C(++)
Da dove sbuca?
/hardware/arduino/avr/cores/
arduino/wiring_digital.c
Aggiunta dal linker
Libreria
Comodità, semplicità
Portabilità (parziale)
Isolamento dall'hardware
Inefficienza, scarso controllo
Dipendenza
Isolamento 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
digitalWrite(13, 1);
Argomenti
Valori passati alla funzione
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
Memory-mapped I/O (ATmega328P)
Registro PORTB
8 uscite o ingressi binari
Collegamento elettrico
(scelta arbitraria)
Bit di I/O
Nel nostro caso è un’uscita: 0 V / 5 V
Isolare un bit
Mettere un bit a 1
Senza toccare gli altri
Data
Mask
Result
(bit 5)
*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
Dereferencing
Indirizzo e dato
viamazzini23
*viamazzini23
l'indirizzo della casa
chi ci abita
*out = *out | bitmask;
(in questo caso è lo stesso)
OR bitwise in C, abbreviato
*out |= bitmask;
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 PORTB
bit bitmask
Mettere un bit a 0
Senza toccare gli altri
Data
Mask
Result
(bit 5)
Invertire la maschera
Complemento a 1
OR
mask
AND
mask
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
Dal software all'hardware
Uscita digitale (in teoria...)
Uscita digitale (un po’ più realistica)
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
Next time...
Stay tuned!
Comandare il LED direttamente
Macro dietro le quinte
Ma davvero conviene l'assembly?
Ottimizzazioni

More Related Content

ODP
Anatomia di un'istruzione in Arduino Pt.2
PDF
Fare Musica con Arduino
PDF
Workshop su Arduino
PDF
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0
PPT
Presentazione
PDF
Workshop arduino e sensori
PPSX
Assembly1
PDF
Esercizi in linguaggio Assembly 8086
Anatomia di un'istruzione in Arduino Pt.2
Fare Musica con Arduino
Workshop su Arduino
Arduino PLC : Modulo 1 programación Arduino Rev. 2.0
Presentazione
Workshop arduino e sensori
Assembly1
Esercizi in linguaggio Assembly 8086

Similar to Anatomia di un'istruzione in Arduino Pt.1 (20)

PPTX
Il cuore di Arduino: Un sistema di sviluppo basato su microcontrollore Atmel ...
PDF
Introduzione ad Arduino del Maker DevLab
PDF
Workshop Arduino by Fiore Basile
PDF
Italian Agile Day 2011 - Corso di cucina fusion elettro-agile con Arduino
PPTX
Arduino ICT2016 [IT]
PDF
Lezione 2 arduino - corso 20 ore
PDF
Arduino&Raspberry
PDF
Corso Arduino Base - Basi Pratiche con Arduino Genuino
PDF
Open Hardware: Arduino, un prodotto italiano
PDF
Review4 u arduino duemilanove scheda di sviluppo compatibile 2010-11-11
PDF
Programmare raspberry pi - Cowo42 - Osimo (AN)
PDF
Localizzatore GPS satellitare
PDF
Internet delle cose
KEY
Introduzione ad Arduino
PDF
Lezione 3 arduino - corso 20 ore
PDF
Arduino 2- Slide descrizione Architettura
PDF
Microcontrollori
DOC
Arduino & raspberry pi - Un connubio stimolante
PPTX
Il pic 16 f84a
PPTX
Arduino - Cosa sono e come funzionano i display
Il cuore di Arduino: Un sistema di sviluppo basato su microcontrollore Atmel ...
Introduzione ad Arduino del Maker DevLab
Workshop Arduino by Fiore Basile
Italian Agile Day 2011 - Corso di cucina fusion elettro-agile con Arduino
Arduino ICT2016 [IT]
Lezione 2 arduino - corso 20 ore
Arduino&Raspberry
Corso Arduino Base - Basi Pratiche con Arduino Genuino
Open Hardware: Arduino, un prodotto italiano
Review4 u arduino duemilanove scheda di sviluppo compatibile 2010-11-11
Programmare raspberry pi - Cowo42 - Osimo (AN)
Localizzatore GPS satellitare
Internet delle cose
Introduzione ad Arduino
Lezione 3 arduino - corso 20 ore
Arduino 2- Slide descrizione Architettura
Microcontrollori
Arduino & raspberry pi - Un connubio stimolante
Il pic 16 f84a
Arduino - Cosa sono e come funzionano i display
Ad

More from µhack (11)

PDF
Presentazione processing 04/11/2016
PDF
Presentazione processing 21/10/2016
ODP
Stampa 3D e Regolazione del Piatto
ODP
Intro to-spice
PDF
Car diagnose - Pt. 1
PDF
8-Bit Music - Pt. 1
PDF
Combat robotics - Pt 2
PDF
Joomla! Override
PDF
Combat robotics - Pt 1
PPTX
Flyer µhackademy Pirate 2016
ODP
A.A.A Hackerspace inventasi : 1 anno insieme
Presentazione processing 04/11/2016
Presentazione processing 21/10/2016
Stampa 3D e Regolazione del Piatto
Intro to-spice
Car diagnose - Pt. 1
8-Bit Music - Pt. 1
Combat robotics - Pt 2
Joomla! Override
Combat robotics - Pt 1
Flyer µhackademy Pirate 2016
A.A.A Hackerspace inventasi : 1 anno insieme
Ad

Anatomia di un'istruzione in Arduino Pt.1