Programmare in mikroBasic
 
  Box
Elementi del linguaggio mikroBasic (2)

Sommario

Queste note vi aiuteranno ad imparare la sintassi del BASIC, con orientamento specifico alla programmazione dei microcontroller PIC.

Per le informazioni riferite a questo argomento e per compilare i programmi è stata usata la vers. 5.01 di mikroBasic Pro.
Altre versioni del compilatore potrebbero avere comportamenti diversi o non funzionare.

Separatori (punctuators)

I separatori mikroBasic includono le parentesi quadre, le parentesi tonde, la virgola, i due punti ed il punto.

dim alfabeto as byte[30]
' ...
alfabeto[2] = "c"

Parentesi quadre (Brackets)

Le parentesi quadre [ ] indicano un indice di matrice singolo o multidimensionale.
Vedere anche "Matrici (arrays)".

'Priorità sulla precedenza
  d = c *(a + b) 

'con istruzioni condizionali
  if (d = z) then ... 

'funzione senza argomenti
  func4() 

'Dichiarazione di funzione
 sub function func(dim n as word) 

Parentesi tonde (Parentheses)

Le parentesi tonde ( ) sono usate per raggruppare le espressioni,

isolare le espressioni condizionali,

indicare le chiamate di funzione e

le dichiarazioni di funzione.
Vedere "funzioni e procedure".

Lcd_Out(1, 1, txt)

dim i, j, k as word

const MESE as byte[12]=(31,28,31,
                        30,31,30,
                        31,31,30,
                        31,30,31)

Virgola (Comma)

La virgola (,) separa gli argomenti in chiamate di procedure,

separa gli identificatori nelle dichiarazioni,

separa gli elementi nelle liste di inizializzazione delle matrici di costanti.

start: nop
...
goto start

Due punti (Colon)

I due punti (:) sono usati per indicare un'etichetta.
Vedere anche "etichette".

persona.nome = "Aldo"

45.7843

PORTB.2

Punto (Dot)

Il punto (.) indica accesso al membro di una struttura.
Vedere anche "Strutture di dati".
Il punto è una parte necessaria delle costanti letterali a virgola mobile.
Inoltre, il punto può essere usato per l'accesso ai diversi bit dei registri in mikroBasic.

Accedere a Bit Individuali

mikroBasic permette di accedere ai diversi bit delle variabili o registri. (vedi bit e numerazione binaria).

Accesso a bit individuali

dim peppo as byte 
'...

' Se RB2 è settato,
' setta il bit 7 di peppo
if PORTB.2 = 1 then
peppo.7 = 1
end if


'Azzera bit TMR0F
INTCON.TMR0F = 0

Basta usare semplicemente il punto (.) con una variabile o registro, seguito da un numero o il nome del bit.

Questo genere di accesso selettivo, è la caratteristica intrinseca di mikroBasic e può essere usata dovunque, nel codice.

Assicuriamoci, sempre, di non eccedere la dimensione del tipo di formato.
Per esempio, PORTB.12 restituirebbe un errore poichè PORTB è una variabile di 8 bit (valori permessi 0...7).

Se conosciamo bene le funzioni del chip, possiamo accedere ai bit dal loro nome, come indicato nel datasheet.

I Tipi di dati

E' obbligatorio specificare un tipo di dati per ogni variabile.
Il tipo di dati della variabile determina, non solo la gamma permessa di valori, ma anche lo spazio, che la variabile occupa nella memoria RAM. Teniamo presente che, operazioni che usano tipi diversi di variabili, impiegano tempo diverso per essere completate.

Ogni variabile e costante simbolica deve avere un tipo rigorosamente definito, conosciuto al momento della compilazione. Il tipo serve a:
 - determinare la corretta richiesta di allocazione della memoria,
 - interpretare le configurazioni di bit trovate nell'oggetto durante accessi susseguenti,
 - in molte situazioni di verifica-tipo, assicurare che assegnazioni illegali siano individuate e bloccate.

Categorie di Tipi

I tipi possono essere suddivisi in:
 - tipi semplici
 - matrici (arrays)
 - stringhe
 - puntatori
 - strutture (tipi personalizzati)

Tipo Dimensione Gamma
bit 1 bit 0 .. 1
sbit 1 bit 0 .. 1
byte 8 bit 0 .. 255
char 8 bit 0 .. 255
short 8 bit - 128 .. 127
word 16 bit 0 .. 65535
integer 16 bit -32768 .. 32767
longword 32 bit 0 .. 4294967295
longint 32 bit -2147483648 .. 2147483647
float 32 bit ±1.17549435082 * 10^-38
±6.80564774407 * 10^38

Tipi semplici

I tipi semplici rappresentano i tipi che non possono essere divisi negli elementi più fondamentali e sono il modello per rappresentare i dati elementari a livello macchina.

In tabella, una veduta d'insieme dei tipi semplici in mikroBasic, con la dimensione occupata in RAM.

Non possiamo mescolare oggetti, con segno e senza segno, nelle espressioni con aritmetica od operatori logici. Possiamo assegnarne uno con segno ad uno senza segno, o viceversa, soltanto usando la conversione esplicita.

Matrici o tabelle

'matrice 50 elementi di tipo word
dim campioni as word[50]

...
'Assegnamo un valore all'elemento
'con indice 4
campioni[4] = 305

'se l'elemento con indice 27
'è uguale a 67 allora...
if campioni[27] = 67 then
 ... 

Matrici o tabelle (arrays)

Una matrice rappresenta una raccolta indicizzata di elementi dello stesso tipo (chiamato il tipo base). Poichè ogni elemento ha un indice unico, le matrici possono contenere significativamente lo stesso valore più di una volta.
I tipi di matrice sono denotati tramite la costruzione della forma:
tipo [ lunghezza_matrice ]
Ognuno degli elementi di una matrice è numerato da 0 a lunghezza_matrice - 1. Ogni elemento di una matrice è di tipo tipo e vi si può accedere specificando il nome di matrice seguito dall'indice di elemento all'interno di parentesi quadre.

Matrici di costanti

' Dichiara una matrice costante
' con i giorni di ogni mese
const MESE as byte[12] = (31,28,
                          31,30,
                          31,30,
                          31,31,
                          30,31,
                          30,31)

Matrici di costanti

La matrice di costanti è inizializzata assegnandogli una sequenza di valori, delimitata da virgole, all'interno di parentesi tonde.
Le matrici di costanti vengono situate nella memoria di programma (ROM).

Notare che l'indicizzazione è su base zero; nell'esempio, il numero di giorni di gennaio è MESE[0] ed il numero di giorni di dicembre è MESE[11].
Il numero di valori assegnati non deve eccedere la lunghezza specificata. E' invece possibile assegnare meno elementi, poichè agli elementi finali, in "eccesso", saranno assegnati zeri.

Stringhe

'Esempio
dim msg1 as string[21]
dim msg2 as string[18]

msg1 = "Questo è un messaggio"
msg2 = "Un'altro messaggio"
msg1 = msg2 ' questo è ok
msg2 = msg1 ' questo è illegale

'Esempio elemento per elemento
dim s as string[5]
...
s = "pak"
' s[0] è un literal char "p"
' s[1] è un literal char "a"
' s[2] è un literal char "k"
' s[3] è zero (carattere NULL)
' s[4] è indefinito
' s[5] è indefinito

Stringhe

Una stringa rappresenta una sequenza di caratteri, ed è equivalente ad una matrice di char più un carattere null finale (ASCII zero). Essa è dichiarata come:
string [ lunghezza_stringa ]
Lo specificatore lunghezza_stringa è il numero di caratteri della stringa. La stringa è immagazzinata internamente come sequenza di caratteri più un carattere null finale (ASCII zero). Questo carattere finale non conta per la lunghezza totale della stringa.
Una stringa nulla ("") è immagazzinata come un singolo carattere null.
Possiamo assegnare costanti letterali stringa od altre stringhe a variabili stringa. La stringa sul lato destro di un operatore di assegnazione deve essere la più corta delle due, o di lunghezza uguale.

Alternativamente, possiamo trattare le stringhe elemento per elemento.
Mettiamo attenzione, quando trattiamo le stringhe in questo modo, perchè sovrascrivendo la fine di una stringa si può causare violazione di accesso della RAM.

'Tipi personalizzati
typedef tipo_intero as integer
typedef tipo_byte as byte
typedef miotipo as word
typedef altrotipo as miotipo

'dichiarazione variabili
dim pippo as miotipo  'word
dim pluto as tipo_intero 'integer

Tipi di dato personalizzati

Si possono definire dei nuovi tipi di dati usando la direttiva typedef, con questa sintassi:

typedef nome_nuovo_tipo as tipo

nome_nuovo_tipo è un nome di identificatore valido.

tipo può essere qualunque tipo di dati.

'Esempio di strutture
structure TBuffer
    dim epstat as byte
    dim bbytes as byte
    dim addres as word
end structure

structure Punto
    dim x as float
    dim y as float
end structure

structure Cerchio
    dim raggio as float
    dim centro as Punto
end structure

dim rotondo as cerchio
dim rag as float

main:
rotondo.raggio = 34.3
rag = rotondo.raggio

Strutture di dati

Una struttura rappresenta una raccolta di elementi che possono essere di tipi diversi (eterogenei) oppure uguali (omogenei).
Ogni elemento si chiama membro.
Nella dichiarazione della struttura si devono specificare il nome e il tipo di ogni membro.
Sintassi:

structure nome_struttura
dim membro_1 as tipo_1
...
dim membro_N as tipo_N
end structure

Per accedere ai membri di una struttura si usa il punto (.).

rotondo è una struttura di tipo cerchio,
rotondo.raggio è il primo membro della struttura cerchio.

Vedere anche "Cosa è una struttura di dati?" per una panoramica più ampia.

'Puntatori

' Dichiara un puntatore a byte
dim puntbyte as ^byte

' Dichiara un puntatore a word
dim puntword as ^word


' Dichiara variabile byte
dim pippo as byte
' Ricava indirizzo della variabile
puntbyte = @pippo


' scrive valore in pippo
puntbyte^ = 45

Puntatori

Un puntatore non è altro che una variabile che contiene l'indirizzo di un oggetto allocato nella memoria.
Questa può essere la memoria dati (RAM) per le variabili o la memoria programma (ROM - Flash) per le costanti.

Per lavorare coi puntatori, si usano due operatori:
il carattere "^" (codice ASCII 94) ed il carattere "@" (codice ASCII 64).

Prima di usare un puntatore, è necessario dichiararne il tipo di dati. Per fare questo, aggiungere il carattere "^" prima del tipo.

dim puntbyte as ^byte

A questo punto, il puntatore non punta a nulla e dobbiamo assegnargli l'indirizzo di una variabile a cui puntare.
Per fare ciò, si mette il carattere "@" davanti al nome della variabile a cui deve puntare.
puntbyte = @pippo
In questo modo, il puntatore riceverà l'indirizzo della variabile.

Ora, se vogliamo scrivere un valore (o leggerlo), nella variabile pippo, lo possiamo fare in due modi:
pippo = 45 (modo diretto)
puntbyte^ = 45 (modo indiretto)
Mettendo il carattere "^" dopo il nome del puntatore, indichiamo di voler accedere al contenuto della variabile puntata.

Vedere anche "Cosa è un puntatore?" per una panoramica più ampia.

 

Elementi del linguaggio (1)

Variabili, memoria, strutture dati

Bibliografia:
Manuale mikroBasic PRO

Ultima modifica  

 
Privacy Policy Cookie Policy