vuoi
o PayPal
tutte le volte che vuoi
Informatica - Firmware
Inglese - Breve descrizione dei PIC
Storia - Nasciata dei Controller
Quali sono i linguaggi di programmazione che si possono
utilizzare nei PICMicro?
Il linguaggio di programmazione predefinito dei PICMicro è l’assembler. L’assembler è
sicuramente un modo molto potente di gestire il nostro microcontrollore ma non è certo il più
semplice da apprendere. Per programmare in assembler bisogna avere prima di tutto una profonda
conoscenza dell’architettura interna del PICMicro che stiamo utilizzando e una mente davvero
molto elastica: realizzare le cose in assembler richiede spesso davvero molte righe di codice, che
magari in C vengono scritte in maniera molto più semplice e/o intuitiva. Ma l’assembler in alcuni
rari casi è davvero necessario. Le istruzioni assembler disponibili per ogni PICMicro sono
contenute nel suo Datasheet, così come la descrizione della segmentazione della memoria e di tutte
le funzioni.
Il linguaggio, però, più semplice per la programmazione dei PicMicro è il C. I linguaggi C che
all’assembler e al C, esistono anche il Basic
seguono gli standard vengono chiamati ANSI-C. Oltre
e di recente anche il Pascal.
Quale programmatore utilizzare?
Personalmente mi sono servito di uno strumento ideato dalla Microchip: il PICKit2 (oggi giunto alla
versione 3):
Tale programmatore oltre a presentare il netto vantaggio di essere davvero piccolo e funzionante su
USB senza alimentazioni aggiuntive, ha anche altri lati positivi: costa poco, il firmware è
aggiornabile, lo si può utilizzare anche come tester per segnali digitali e ha un suo software di
programmazione realizzato dalla stessa Microchip.
Molti altri PicMicro hanno anche disponibile la funzione LVP (Low Voltage Programming) che
permette la programmazione a basso voltaggio (ovvero non dovremo più fornire i 13.5 V sul pin
ma richiede per la programmazione l’utilizzo di un pin aggiuntivo
MCLR ma soltanto 5V)
(contrassegnato come PGM, normalmente non utilizzato per la programmazione standard).
Altra buona modalità di programmazione di alcuni PIC è quella tramite BootLoader: si programma
per la prima volta il PIC in maniera normale, inserendo al suo interno un programma particolare che
prende il nome di Bootloader, che occupa poco spazio. Le volte successive, quando dobbiamo
riprogrammarlo, si farà utilizzo unicamente della porta seriale del PC: sarà il PIC, tramite le
funzioni svolte dal Bootloader, a capire se si deve mettere in modalità di programmazione oppure in
modalità di esecuzione programma. 4
Timer0 e Prescaler: cosa sono?
Una periferica sempre presente in tutti i PICMicro è il Timer0. Il Timer0 è un semplice contatore
ad 8 bit, il suo conteggio viene incrementato automaticamente di 1 (essendo ad 8 bit va da 0 a 255)
ad ogni ciclo di istruzioni.
Il ciclo di istruzioni in un PICMicro è pari alla frequenza di clock divisa per 4: ciò equivale a dire
che una singola istruzione (parliamo però di istruzioni assembler=linguaggio macchina e non di
istruzioni C) viene eseguita in 4 cicli di clock: indicando con Fosc la frequenza di clock (la
frequenza del quarzo o dell’oscillatore in genere), la frequenza di un ciclo di istruzioni è quindi pari
a Fosc/4.
In realtà, anche se la maggior parte delle istruzioni rispetta questa regola, ve ne sono alcune che
richiedono più di 4 cicli di clock per essere eseguite, ma per ora soprassediamo su questo
argomento. Quello che ci interessa sapere è che il Timer0 si incrementa di 1 unità ogni 4 colpi di
clock, ovvero con una frequenza di Fosc/4: se stiamo utilizzando un quarzo da 20Mhz, la frequenza
è l’inverso del
di esecuzione delle istruzioni è pari a 20/4 = 5MHz, sappiamo che la frequenza
eseguita nel tempo di 1/5 = 0,2 μS.
tempo (periodo) e per cui ogni istruzione sarà
Il Prescaler altro non è che un divisore di frequenza, ci permette cioè di dividere la frequenza (la
velocità) del nostro ciclo di istruzioni (Fosc/4) in valori più piccoli, facendoci ottenere tempi di
esecuzione più alti e quindi più facilmente gestibili o in ogni caso impostabili sui valori che
desideriamo. Ovviamente il prescaler non influisce sulla velocità di esecuzione di tutte le istruzioni,
le istruzioni continueranno ad essere eseguite ad una velocità di Fosc/4: esso difatti influisce
unicamente sull’incremento del Timer0.
I valori su cui possiamo impostare il prescaler (ovvero il divisore) sono : 2, 4, 8, 16, 32, 64, 128,
256. Come vedete il valore di 1 non è presente: in questo caso basta semplicemente non assegnare il
prescaler al Timer0. Interfaccia con LCD
è sicuramente un’interfaccia molto interessante e utile nei progetti utilizzanti i
Un display LCD
microcontrollori, questo perché può visualizzare una grande varietà di informazioni e rendere
quindi le cose più semplici agli utilizzatori per la creazione di menù, interfacce utente ecc. 5
I display più comuni sono quelli basati sull’arcinoto controller HD44780 prodotto dalla Hitachi.
“esterne”,
I display utilizzanti tale controller sono costruiti con varie caratteristiche tra le quali il
numero di righe e il numero di caratteri (o colonne) che il display è in grado di visualizzare (i più
diffusi sono i display 16×2 : 2 righe, ognuna delle quali può visualizzare 16 caratteri) e la
colorazione della retroilluminazione (la più comune è quella verde con caratteri neri, ma è molto
diffusa anche la retroilluminazione blu con caratteri bianchi o nera con caratteri bianchi).
Funzionamento dei display basati su controller HD44780 o compatibile
Vediamo innanzitutto come si presenta esternamente un classico display lcd 16×2:
Partiamo col dire che NON tutti i display presentano la piedinatura disposta in questo modo, anche
se questa è la più comune.
Di questi 16 pin, 14 sono per il funzionamento del display e i rimanenti 2 servono per la
retroilluminazione (che avviene mediante una matrice di led). Generalmente i due pin destinati alla
retroilluminazione sono gli ultimi 2: il 15 è collegato all’anodo, e richiede 4,2V, e il 16 è il catodo,
e quindi va a massa.
Su alcuni display i pin di retroilluminazione si trovano in posizione 1 e 2.
piedinatura “classica” è la seguente:
La Pin Denominazione Descrizione
1 Vss o Gnd Massa
2 Vcc +5V
3 Vo Regolazione contrasto
4 RS Register Select (selezione dati/istruzioni)
5 R/W Read/Write
6 E Enable (Abilitazione) 6
7 D0 Linea Dati, bit 0
8 D1 Linea Dati, bit 1
9 D2 Linea Dati, bit 2
10 D3 Linea Dati, bit 3
11 D4 Linea Dati, bit 4
12 D5 Linea Dati, bit 5
13 D6 Linea Dati, bit 6
14 D7 Linea Dati, bit 7
15 A Anodo Retroilluminazione (+4.2V)
16 K Catodo Retroilluminazione (Massa)
La libreria per il pilotaggio dell’LCD
La libreria (lcd.c) è necessaria per utilizzare un display LCD.
Tale libreria comprende numerose utili funzioni, basterà semplicemente includerla nel nostro
programma nel modo consueto:
#include "lcd.c"
Le funzioni disponibili sono:
LCD_INIT();
Serve ad effettuare l’inizializzazione del display, va richiamata una solta volta e prima di qualsiasi
altra funzione, altrimenti il display non sarà in grado di operare.
LCD_CLEAR();
Effettua la pulizia del display, ovvero cancella il contenuto della DDRAM e porta il cursore nella
prima posizione (riga 1, colonna 1).
LCD_CMD(char);
Invia un comando al display, tale funzione viene utilizzata, ad esempio, da LCD_CLEAR e da altre;
è anche possibile inviare comandi personalizzati, come ad esempio i codici numerici associati ai
vari entry mode, sarà comunque una funzione molto poco sfruttata direttamente.
LCD_GOTO(riga,colonna); 7
Posiziona il cursore per la scrittura alla riga e alla colonna specificata. La numerazione è in base 1,
per cui scrivendo:
LCD_GOTO(1,1);
il cursore si posizionerà alla prima riga, prima colonna.
LCD_PUTCH(char);
Scrive un unico carattere sul display, char ovviamente può essere immesso in qualsiasi formato
numerico (decimale, binario -anteponendo come sempre 0b-, esadecimale -anteponendo 0x- o
il carattere tra singoli apici ”-),
formato carattere -scrivendo è utile per scrivere quei caratteri che
non hanno corrispondenza del codice ascii sulla tastiera: basta avere sottomano la tabella con
l’elenco dei codici carattere del controller che abbiamo a disposizione sull’LCD. Esempio:
LCD_PUTCH(0b11110valore3); //scrive il simbolo omega
LCD_PUTS(“stringa”);
Scrive una stringa intera sul display. Se ci posizioniamo alla prima colonna della prima riga, e
abbiamo a disposizione un LCD 16×2 e in tale stringa scriviamo una parola superiore ai 16
caratteri, ovviamente i caratteri dal diciassettesimo in poi non saranno visibili, per cui stiamo attenti
quando utilizziamo questa funzione se non vogliamo avere effetti indesiderati sul display. Esempio:
LCD_PUTS("Ciao");
LCD_PUTUN(numero);
Scrive un numero privo di segno sul display, come numero sono accettati il formato CHAR (8bit) o
INT (16 bit), per cui sono ammessi numeri interi da 0 fino a 65535.
LCD_PUTSN(numero);
Scrive un numero compreso di segno. Per numeri positivi il segno non viene rappresentato, per
numeri negativi, viene anteposto il segno meno davanti al numero. Supporta sia CHAR che INT in
accettando un numero “signed” i valori ammissibili vanno da
ingresso, ovviamente -32768 a 32767.
8
Schemi di montaggio
-Alimentatore 5V (Trasformatore 220V-5V)
D1 VR1 7805
Vin Vout +5V
T1 2 1 GND
V+
AC C1 C2 C3
220V , 50 Hz 1000uF, 25V 10uF, 25V
AC 470uF, 25V
V-
4 3
Trasformatore 220V/12V
-Allarme Vcc
C2 R1 R2 R3 R4 R5 R6
Vcc U1
1 20
LED1 Vcc VDD VSS SW1
R7 2 19
RA5 RA0 SW2
R8 3 18
RA4 RA1
LED2 SW3
R9 4 17
RA3 RA2
BZ1 BUZZER 5 16
RC5 RC0
-
Vcc + Q1 6 15
RC4 RC1
R10 7 14
RC3 RC2 P1
8 13
LED3 RC6 RB4 P2
9 12
RC7 RB5 P3
R11 10 11
LED4
Vcc RB7 RB6
Q2 PIC 16F690
R12 R13 LED5 R14 Vcc
LED6
Q3 LCD1 DISPLAY LCD
9 8 7 6 5 4 3 2 1
16 15 14 13 12 11 10 Vcc Vcc R15
Vcc R16 9
Elenco componenti allarme
Riferimento Valore - Sigla - Descrizione
BZ1 BUZZER
C2 Condensatore 100 nF
LCD1 Display LCD 16x2
LED1 LED giallo
LED2 LED giallo
LED3 LED rosso
LED4 LED rosso
LED5 LED verde
LED6 LED verde
P1 Pulsante normalmente aperto
P2 Pulsante normalmente aperto
P3 Pulsante normalmente aperto
Q1 Transistor NPN C546B
Q2 Transistor NPN C546B
Q3 Transistor NPN C546B
10 KΩ
R1 Resistenza 10 KΩ
R2 Resistenza 10 KΩ
R3 Resistenza 10 KΩ
R4 Resistenza 10 KΩ
R5 Resistenza 10 KΩ
R6 Resistenza 220 Ω
R7 Resistenza 220 Ω
R8 Resistenza 10 KΩ
R9 Resistenza 4.7 KΩ
R10 Resistenza 100 Ω
R11 Resistenza 4.7 KΩ
R12 Resistenza 4.7 KΩ
R13 Resistenza 100 Ω
R14 Resistenza
5 KΩ
R15 Trimmer 5 KΩ
R16 Trimmer
SW1 SW-SPST
SW2 SW-SPST
SW3 SW-SPST
U1 PIC 16F690 10
Come si presentano
-Alimentatore 5V (Trasformatore 220V-5V)
-Allarme 11
PIC-ENGLISH
A microcontroller is a much more elaborate device than a microprocessor. A microprocessor is a
chip designed solely to perform calculations. A microcontroller contains an internal microprocessor
(CPU), plus many other devices that allow them to interact with the outside world, lines of
communication, a bit of memory to store data and programs, converters analog / digital etc.. So, a
microcontroller is in fact a complete computer system within an integrated circuit and we can
change the definition of the acronym PIC with "Programmable Intelligent Computer" even if the
classical definition is "Programmable Interface Controller ". When we speak about PICs and
PicMicros we refer to integrated circuits produced by a Microchip, but there is a wide variety of
microcontrollers, each one different in architecture, development, programming languages, costs,
etc..
A generic microcontroller is also identified with the initials MCU (Micro Controller Unit - Unit
microcontroller).
The PIC microcontrollers have a RISC architecture (Reduced Instruction Set Computer), in fact
those MCUs can perform all their functions by relying to a reduced set of instructions (between
35 and 77 instructions). 12
Il linguaggio C
Il C è un linguaggio di programmazione ad alto livello.
Il C è rinomato per la sua efficienza, e si è imposto come linguaggio di riferimento per la
realizzazione di software di sistema su gran parte delle piattaforme hardware moderne. La
standardizzazione del linguaggio (da parte dell'ANSI prima e dell'ISO poi) garantisce la portabilità