/*
* File: analogico.c
* Author: robertomansi@gmail.com
*
* Created on 10/3/2019 8:14:51 AM UTC
* "Created in MPLAB Xpress"
*/
//*************************************************
// CORSO PROGRAMMAZIONE PICMICRO
// Lezione 11
//
http://www.settorezero.com
//
// modulo: main.c
// descrizione: esempio di utilizzo convertitore A/D
// mostriamo il valore letto da un trimmer collegato
// su AN1 su una barra a led
// picmicro: PIC16F887
// clock: 20MHz
//
//*************************************************
#include "config887.h"
#define _XTAL_FREQ 20000000
#include <xc.h>
#define TRIMMER RA1
#define LED0 RD0
#define LED1 RD1
#define LED2 RD2
unsigned int valore;
int i=0;
int main(void)
{
TRISA=0b00101111; // le imposto come ingresso
TRISE=0b00000111; // le imposto come ingresso
TRISB=0b00000000; // le seguenti porte sono in iscita
TRISC=0b00000000;
TRISD=0b00000000;
ADCON0=0b10001001; //bit 0 = si abilita con 1 ;
//bit 1 = non usato;
//bit 2 = avvia converione con 1;
//bit345 = porte da leggere 001 per AN1;
//bit 6 e 7 = frequenza di conversione 010 = FOSC32" ;
//vedi tabelle---
ADCON1=0b10001110; //bit 0123 = CONFIGURANO LA PORTA ANA con 1 o I/O con 0 ;
//bit4 = non usato; bit 5 = non usato;bit 6 unito a
//ADCS1 e a ADCS0 su ADCON0 per impostare la frequenza
//di campionamento
//bit 7 = 1: giustificazione a destra, 0:
//giustificazione a sinistra la frequenza
while(1)
{
// do un piccolo ritardo per permettere a CHOLD di caricarsi correttamente,
// come spiegato nella parte introduttiva di questo capitolo
__delay_ms(200);
GO=0; // avvio la conversione
while(GO)
// mi calcolo il valore numerico restituito dal convertitore
// tenendo conto che ho scelto la giustificazione a sinistra
valore=ADRESL + (ADRESH<<8);
// adesso, in base al valore, variabile da 0 a 1023, facciamo accendere una serie di led da 1 a 8
// i led si trovano tutti sulla portD.
// volendo rappresentare 0-5 volt su una scala di 8 led, ogni led rappresenterà5/8 = 0,625V = 625mV
// sapendo che la risoluzione del convertitore A/D è 4,88mv, ogni led si dovràaccendere con un
// valore del convertitore A/D pari a 625/4.88=128
// affianco sono i riportati i valori da dare a PORTD se vogliamo visualizzare
// una barra o un punto
// BARRA PUNTO
if (valore<=128)
{PORTD=1;} // 1 1 0b00000001
else if (valore<=256)
{PORTD=2;} // 3 2 0b00000010
else if (valore<=384)
{PORTD=4;} // 7 4 0b00000100
else if (valore<=512)
{PORTD=8;} // 15 8 0b00001000
else if (valore<=640)
{PORTD=16;} // 31 16 0b00010000
else if (valore<=768)
{PORTD=32;} // 63 32 0b00100000
else if (valore<=896)
{PORTD=64;} // 127 64 0b01000000
else
{PORTD=128;} // 255 128 0b10000000
}
}