Notes
Outline
Verso l’utilizzo di un Microcontrollore
Oggi iniziamo una serie di “lezioni” ed esperienze di laboratorio che ci porteranno alla programmazione e utilizzo di un microcontrollore cioe` di un computer in miniatura. Il cuore di questo piccolo computer e’ il microprocessore.
Per poter arrivare a comprendere come utilizzare un microcontrollore abbiamo bisogno di qualche lezione ed esercitazione introduttiva per avere almeno un’idea di massima sulla struttura di un computer sia dal punto di vista Hardware (HW) che Software (SW).
     HW : “la plastica, gli integrati, l’alluminio...” tutto cio` che si puo` toccare (CPU, ROM, RAM, tastiera, mouse...).
     SW : i programmi che fanno fare qualcosa al computer (sistema operativo, drivers per le periferiche, compilatori, programmi applicativi...).
Schema generale
Motherboard e Bus
Collegamenti delle periferiche : le porte e i connettori
La porta che utilizzeremo (1/2)
La porta che utilizzeremo (2/2)
Il Software
Introduzione al linguaggio di programmazione C
Caratteristiche generali
Il C è un linguaggio: semplice (~30 keywords)
strutturato
procedurale
tipizzato
Basso livello (vicino all’architettura del sistema)
Grande flessibilità (adatto anche a grandi progetti)
...un linguaggio strutturato
...un linguaggio procedurale
Formattazione del listato
Il C è “case sensitive”: MyFunction ¹ myfunction
La formattazione è libera MA
gli spazi possono essere inseriti SOLO tra un “token” e l’altro!
è necessario almeno uno spazio tra due tokens che non siano delimitatori ( parentesi, “ , ‘ , …. )
Un programma compilabile
Le parentesi graffe { … } racchiudono un gruppo di istruzioni da trattare come una singola azione:
es.: corpo di una funzione, corpo di un ciclo, ecc..
Il punto e virgola chiude tutte le istruzioni
“Hello World!” At least!
Come fare funzionare un programma ...
Compilazione
Istruzioni per l’uso del compilatore
Le variabili
I tipi numerici del linguaggio C
Dichiarazioni e “scopo” delle variabili
Esempio sull’uso delle variabili
Le istruzioni di controllo (1/3)
Cicli (Loop):
Le istruzioni di controllo (2/3)
Cicli (Loop):
Le istruzioni di controllo (3/3)
Cicli (Loop):
Esempio ciclo for
#include <stdio.h>
int main() {
  int i;
  for(i=0;i<10;i++)
  {
  printf("Hello !\n");
  printf(“Lab III !\n");
  }
  return 0;
}
Esempio ciclo while
#include <stdio.h>
int main() {
  int i = 0;
  while(i <10)
  {
  printf("Hello !\n");
  printf(“Lab III !\n");
  i = i +1;
  }
  return 0;
}
Esempio ciclo do-while
#include <stdio.h>
int main() {
  int i = 0;
  do {
    printf("Hello !\n");
    printf(“Lab III !\n");
    i = i +1;
     }  while(i <10);
  return 0;
}
Esempio di uso di for (II)
Le istruzioni di controllo (2/3)
Maggior controllo sui cicli: istruzioni di salto
istruzione break;:
causa l’immediata uscita dal più interno dei cicli in cui si trova
istruzione continue;:
causa l’esecuzione immediata dell’istruzione di chiusura del ciclo, cui segue l’iterazione successiva del ciclo
istruzione goto label;:
salto incondizionato all’etichetta label:; consente l’uscita da molti cicli annidati
istruzione return espr_opz;
esce dalla funzione corrente ritornando opzionalmente il valore di espr_opz
Le istruzioni di controllo (3/3)
Istruzioni di scelta:
Esempio if-else if-else
Operatori (1/5)
Assegnamento: operatore  =
lvalue = espr;
significato: valuta l’espressione espr
assegna espr ad lvalue
ritorna espr
è associativo da destra a sinistra
per assegnare il valore 10 alle variabili a e b, si può scrivere: a = b = 10;
Operatori (2/5)
Tra tipi numerici:
moltiplicazione e divisione: *, /
resto della divisione : %  (es.: 20 % 9 fa 2)
addizione sottrazione: +, -
Non esiste un operatore di elevamento a potenza
Booleiani
Equivalenza (e non) di espressioni logiche: ==, !=
AND tra espressioni logiche: &&
OR tra espressioni logiche: ||
NOT di espressione logica: !
Operatori (3/5)
Operatori di manipolazione dei bit:
AND bit a bit: &
OR ed XOR bit a bit: |, ^
spostamento a sinistra e a destra: <<, >>
es.: a: 1000000010101101
a << 2: 10 0000001010110100
NOT bit a bit (complemento a 1): ~
Operatori relazionali:
minore e maggiore: <, >
minore o uguale, maggiore o uguale : <=, >=
Esempio uso operatori bit a bit
Operatori (4/5)
Espressioni di assegnamento in forma compatta:
a = (a + b);  si può anche scrivere
a += b;
L’operatore += si comporta come un operatore di assegnamento, e quindi ritorna il valore assegnato, es.:
c += a += b + 1; significa
a = a + (b + 1); c = (c + a);
Analogamente abbiamo:
-=, *=, /=, %=, &=, ^=,|=, <<=, >>=
Operatori (5/5)
Operatori di incremento e decremento:
notazione prefissa:
++a; incrementa a e ritorna il nuovo valore
--a; decrementa a e ritorna il nuovo valore
notazione postfissa:
a++; ritorna a e, dopo, lo incrementa
a--; ritorna a e, dopo, lo decrementa
Possono essere applicati a tutti i tipi interi (e ai puntatori)
Due operatori speciali
casting:
( type ) espr;
forza l’espressione espr ad essere interpretata come fosse di tipo type es.:
double f;
f = ( double ) 10;
sizeof:
ritorna la dimensione in bytes di un tipo
unsigned int size;
size = sizeof( float );
Vettori
Dichiarazione
Vettori: immagazzinamento in memoria
I vettori sono memorizzati in locazioni di memoria consecutive
L’indice del primo elemento è 0
Esempio uso di vettori
Le librerie standard
Tutte le istruzioni del linguaggio C sono di basso livello.
Le operazioni complesse (compreso l’I/O !) sono effettuate dalle funzioni delle “librerie standard” (abbiamo visto ad es.: printf(…))
Le librerie più comunemente usate sono:
Input e output: <stdio.h>
Manipolazione stringhe: <string.h>
Funzioni matematiche: <math.h>
Gestione della memoria ed altre utilità: <stdlib.h>
Per saperne di più
Per la parte di HW e struttura di Microprocessore :
    - P. Horowitz W. Hill, The Art of electronics.
Testo sacro:
B.W. Kernighan, D.M. Ritchie:
The C programming  language
Altri libri:
I. Pohl: A Book on C
M. Waite, S. Prata: New C Primer Plus (2nd. Ed.)
Materiale su www:
T. Love:
ANSI C for Programmers on UNIX Systems
(http://www.nd.edu/~cchen/teaching_C/node3.html)