rieccomi qui mentre continuo a fare esperimenti col Pierin. Vorrei provare l'ADC per misurare la carica di una batteria. Premetto che non ho fissato specifiche particolari su precisione, portata ecc, per adesso mi interessa solo verificare che una batteria da 1,5 V sia carica o meno. In pratica vorrei semplicemente che per valori di tensione inferiori ad 1,3 V si accenda LD1 e per valori inferiori si accenda LD2.
Il programma che posterò ovviamente non funziona; viene compilato con successo ma rimane sempre accesso il led LD2 sia con batteria (carica) collegata che no. Per la connessione della batteria, connetto direttamente il terminale negativo della batteria al pin GND del Pierin ed il terminale positivo a RE2.
Non ho impostato il numero di bit da utilizzare per cui il PIC dovrebbe lavorare a 10 bit. Nel controllo però, con allineamento a sinistra, verifico solo il registro ADRESH per cui praticamente utilizzo solo 8 dei 10 bit ma, come ho già scritto, questa perdita di risoluzione non è un problema, l'importante è che funzioni!
Il controllo verifica che il valore in ADRESH sia più di 100. Infatti a 3,3 V dovrebbe corrispondere il fondoscala di 255, mentre a 1,3 V, valore che ho fissato come limite per la scarica, dovrebbe corrispondere 100.
Grazie in anticipo, di seguito il codice,
Emanuele
- Codice: Seleziona tutto
// File di definizione dei registri del micro.
#include "p18f47j53.h"
// File di configurazione dei fuses
#include "configurazione.h"
// Mappatura delle interrupt
#include "mappa_int.h"
// Header del main
#include "main.h"
//------------------------------------------------------------------------------
// Variabili globali
//------------------------------------------------------------------------------
#pragma udata
//------------------------------------------------------------------------------
// Funzione di servizio delle interrupt ad ALTA priorità
//------------------------------------------------------------------------------
#pragma code
#pragma interrupt highPriorityInterrupt
void highPriorityInterrupt()
{
// Verifica quale flag ha causato l' interrupt
// Esegui la parte di codice di servizio dell' interrupt
// Azzera il flag che ha causato l' interrupt
// ...
}
//------------------------------------------------------------------------------
// Funzione di servizio delle interrupt a BASSA priorità
//------------------------------------------------------------------------------
#pragma interruptlow lowPriorityInterrupt
void lowPriorityInterrupt()
{
}
//------------------------------------------------------------------------------
// Prototipi delle funzioni
//------------------------------------------------------------------------------
#pragma code
//------------------------------------------------------------------------------
// Funzioni
//------------------------------------------------------------------------------
#pragma code
//------------------------------------------------------------------------------
// MAIN FUNCTION
//------------------------------------------------------------------------------
void main(void)
{
// -------- Inizializzazione delle periferiche --------
// Imposto PORTD tutti ingressi e RD6 e RD7 come uscite RD5 e RD4 come ingressi
LATD = 0x00;
TRISD = 0b00111111;
// Inizializza tutti i pin come digitali
ANCON0 = 0xFF;
ANCON1 = 0x1F;
// Inizializza il pin AN7 (RE2) come ingresso analogico
ANCON0bits.PCFG7 = 0; // 12/08/2013 corretto BUG segnalato da c1b8
// Imposto i riferimenti uguali all'alimentazione e a massa.
ADCON0 = 0b00000000;
// De-inizializzo ADCON1
ADCON1 = 0b00000000;
// Seleziona il tempo di conversione 20TAD
ADCON1bits.ACQT = 7;
// Clock di conversione FOSC/64
ADCON1bits.ADCS = 6;
// Formato del risultato allineato a sinistra (userò ADRESH per cui solo 8 bit su 10)
ADCON1bits.ADFM = 0;
// -------- Attivazione delle periferiche --------
// -------- Ciclo infinito di funzionamento --------
for(;;)
{
// Abilitazione A/D converter
ADCON0bits.ADON = 1;
// Calibrazione ADC
//ADCON1bits.ADCAL = 1;
//ADCON0bits.GO = 1;
//while(ADCON0bits.GO);
//ADCON1bits.ADCAL = 0;
// Seleziona l' ingresso da misurare
ADCON0bits.CHS = 7;
// Fa partire la conversione 45 us.
ADCON0bits.GO = 1;
// Aspetta la fine della conversione
while(ADCON0bits.GO);
//>100
if (ADRESH>0b01100100)
{
LATDbits.LATD6 = 0;
LATDbits.LATD7 = 1;
}
else
{
LATDbits.LATD6 = 1;
LATDbits.LATD7 = 0;
}
}// Fine for
}// Fine main
P.S. non ho ben chiaro in mente come faccia il PIC ad autocalibrarsi per cui il relativo codice è commentato. Se qualcuno sapesse darmi qualche indicazione gliene sarei grato.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)





