home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


Istruzioni per convertitore analogico
     
Autore Messaggio opzioni
cosimo22000





postato il:
08.10.2019, alle ore 11:51
Istruzioni per convertitore analogico 

Salve a tutti,
dopo alcuni chiarimenti ottenuti circa l'uso di MPLAB vi propongo un sorgente con la speranza che qualcuno mi dia altre nozioni per far funzionare un convertitore di segnale analogico.
 /*
 * 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
}



Il sorgente che non funziona, e' stato un po scopiazzato e un po manipolato da me per cui sono ammessi commenti di qualsiasi tipo.....
Ancora grazie anticipatamente e aspetto vostri aiuti
roberto
marsram




una ogni 100 livelli
una ogni 10 livelli


postato il:
08.10.2019, alle ore 12:04
Unfortunately, -non funziona- non è un dato sufficiente.

Non funziona il programma nel senso che una volta caricato non succede niente

oppure succede qualcosa di errato/inaspettato

O non compila causa errori?


 
TRISA=0b00101111; // RA4/6/7 come uscita, altri ingresso 
TRISE=0b00000111; // RE<2:0> come ingressi, RE3 come uscita  
TRISB=0b00000000; // le seguenti porte sono in uscita

cosimo22000





postato il:
09.10.2019, alle ore 13:22
Salve,
allora mi spiego, la compilazione avviene senza errori, e l'unica cosa che fa e che il LED7 si accende e resta sempre acceso sia quando erogo tensione sul trimmer sia senza tensione.
E' certo che entra nella funzione While perchè ho inserito come test un comando di accensione di un led.
Cosa ne pensate?
Gradirei anche qualche spunto sempre sulla conversioni magari qualche progetto funzionante ma con spiegazione allegata sui comandi eseguiti.
Grazie roberto
marsram




una ogni 100 livelli
una ogni 10 livelli


postato il:
09.10.2019, alle ore 17:54
Solo un flash causa poco tempo.

while(GO) dice : finchè GO=1
ma manca una fine

prova while(GO);
ovvero: fino a che GO=1 fai niente
Altrimenti passa avanti senza aspettare la fine della conversione

Non ho capito la parte degli if. Non è meglio usare switch/case?
picmicro675




una ogni 10 livelli


postato il:
11.10.2019, alle ore 08:04
marsram:
Non ho capito la parte degli if. Non è meglio usare switch/case?

Se non sbaglio lo switch vale per un solo byte, non per una word come quella dell' ADC.
Comunque mi pare che il programma manca di qualche parentesi graffa.

Poi non capisco l' aggiunta del ritardo per scaricare, mi sembra che l'hardware sia già in grado da solo di determinare il periodo necessario di conversione, per questo che il flag apposito.
Eppoi sarei incline a dividere la conversione dell' ADC per 256 e quindi usare lo switch come propone marsram. Oppure una conversione diretta che determina il bit che si vuole accendere.
 valore /= 128;
PORTD = (1<< valore); 


Poi lascierai XC alla Microchip e mikroC alla MikroE, che sono delle belle ciofeghe. Magari pensare di usare un SDCC, potrebbe giovare al risultato meno voluminoso.



Anno nuovo, forum nuovo.
Mi sa che lascio.
cosimo22000





postato il:
15.10.2019, alle ore 21:18
Salve,
allora andiamo per gradi.....

le istruzioniADCON0 e ADCON1 sono corrette?

Dopo aver avviato la conversione cosa devo fare per fermarla?
intanto io continuo a fare prove...

a voi l'ardua sentenza

marsram




una ogni 100 livelli
una ogni 10 livelli


postato il:
15.10.2019, alle ore 21:50
 
ADCON1bits.ADFM = 1;      // right just
ADCON1bits.VCFG1 = 0;     // vss
ADCON1bits.VCFG0 = 0;     // vdd

ADCON0bits.ADCS = 0b 10;  // fosc/32
ADCON0bits.CHS = 0b0001;  // AN1
ADCON0bits.ADON = 1;      // enable

ADCON0bits.GO = 1;        // start conversion

while (ADCON0bits.GO);    // wait for conversion end


SEOD

Per iniziare meglio la forma bit per bit. Si fanno meno errori.

La conversione si ferma da sola quando ha finito (GO=0)
picmicro675




una ogni 10 livelli


postato il:
17.10.2019, alle ore 16:17
@marsram
Ma ADCON0bits si usa anche in xc ?



Anno nuovo, forum nuovo.
Mi sa che lascio.
marsram




una ogni 100 livelli
una ogni 10 livelli


postato il:
17.10.2019, alle ore 16:43
nomeregistrobits.nomebit sono le strutture che trovi nei file nomeprocessore di XC

Ovviamente, sono definiti anche i singoli bit, per cui

while(GO);

andrebbe pure bene.
picmicro675




una ogni 10 livelli


postato il:
20.10.2019, alle ore 03:19
Beh,quando si scrive i bit uno alla volta, così di seguito, preferisco scriverlo in un byte, con un solo ciclo macchina.


Anno nuovo, forum nuovo.
Mi sa che lascio.
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale