Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC18 problemi su Tad dell'ADC

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: PIC18 problemi su Tad dell'ADC

Messaggioda Foto Utentethexeno » 31 dic 2013, 15:31

Funziona tutto, l'ho usato con una printf per fare prima. Però anche il tuo va fino a 1023, da cui deduco il problema sia nella configurazione dei fuse.
Una volta scelto il canale, la misura e la stampa l'ho messa nel for.
Avatar utente
Foto Utentethexeno
235 5 9
Frequentatore
Frequentatore
 
Messaggi: 298
Iscritto il: 12 apr 2010, 18:28

1
voti

[12] Re: PIC18 problemi su Tad dell'ADC

Messaggioda Foto UtenteTardoFreak » 31 dic 2013, 15:33

L' opzione a 10 o 12 bit la imposti nei fuses.
Non devi modificare altro e ti trovi un numero a 12 bit come valore di ritorno della funzione adc_read();
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[13] Re: PIC18 problemi su Tad dell'ADC

Messaggioda Foto Utentethexeno » 31 dic 2013, 16:35

Esatto. Il tuo codice l'ho usato così nel main:

Codice: Seleziona tutto
#if defined(__XC)
    #include <xc.h>        /* XC8 General Include File */
#elif defined(HI_TECH_C)
    #include <htc.h>       /* HiTech General Include File */
#elif defined(__18CXX)
    #include <p18cxxx.h>   /* C18 General Include File */
#endif

#if defined(__XC) || defined(HI_TECH_C)

#include <stdint.h>        /* For uint8_t definition */
#include <stdbool.h>       /* For true/false definition */

#endif


#include "system.h"        /* System funct/params, like osc/peripheral config */
#include "user.h"          /* User funct/params, such as InitApp */
#include "delays.h"
#include "stdio.h"
#include "string.h"
#include "main.h"


//------------------------------------------------------------------------------
// Prototipi delle funzioni
void adc_deInit(void);
void adc_initRatiometric(void);
void adc_calibrate(void);
unsigned short int adc_read(void);
void putlong( unsigned long l);
char num[10];
//------------------------------------------------------------------------------
// De-inizializza l' ADC
void adc_deInit(void)
{
  ADCON0 = 0;
  ADCON1 = 0;
  IPR1bits.ADIP = 0;  // Bit di priorità interrupt ADC
  PIE1bits.ADIE = 0;  // Interrupt disabilitta
  PIR1bits.ADIF = 0;  // Flag interrupt azzerato
}

//------------------------------------------------------------------------------
// Inizializza l' ADC per misure ratiometriche (fra ground e Vdd)
void adc_initRatiometric(void)
{
  // Seleziona Vref positiva Vdd
  ADCON0bits.VCFG0 = 0;
  // Seleziona Vref negatica Vss
  ADCON0bits.VCFG1 = 0;
  // Seleziona il tempo di conversione 20TAD
  ADCON1bits.ACQT = 7;
  // Clock di conversione FOSC/64
  ADCON1bits.ADCS = 6;
  // Formato del risultato allineato a destra
  ADCON1bits.ADFM = 1;
  // Accensione
  ADCON0bits.ADON = 1;
}

//------------------------------------------------------------------------------
// Effettua la calibrazione automatica dell' ADC
void adc_calibrate(void)
{
  // Calibrazione ADC
  ADCON1bits.ADCAL = 1;
  ADCON0bits.GO = 1;
  while(ADCON0bits.GO);
  ADCON1bits.ADCAL = 0;
}

//------------------------------------------------------------------------------
// Fa partire la conversione e legge il valore dall' ADC
//  Uscita: valore letto
unsigned short int adc_read(void)
{
  unsigned short int valore;

  // Fa partire la conversione 45 us.
  ADCON0bits.GO = 1;
  // Aspetta la fine della conversione
  while(ADCON0bits.GO);
  // Legge il valore convertito
  valore = ADRES;

  return valore;
}

//------------------------------------------------------------------------------
// Main program di esempio di uso dell' ADC
void main(void)
{
  short int misura;
/* Configure the oscillator for the device */
    ConfigureOscillator();
//
//    /* Initialize I/O and Peripherals for application */
    InitApp();
    usart_init();
  // De-inizializza l' ADC
  adc_deInit();
  // Inizializza l' ADC
  adc_initRatiometric();

  // Calibra l' ADC
  adc_calibrate();

  // Seleziona l' ingresso da misurare
  ADCON0bits.CHS = 3;

  // Effettua la lettura;
 

  for(;;)
  {
      misura = adc_read();
  printf("ADC: %d\n", misura);
  }
}


Dove nell'user.c a questo punto uso solo configurazioni di usart e putch, nulla a che vedere con l'adc. I configuration bits sono quelli del post #9. Comincio a preoccuparmi sulla salute fisica del chip.
Avatar utente
Foto Utentethexeno
235 5 9
Frequentatore
Frequentatore
 
Messaggi: 298
Iscritto il: 12 apr 2010, 18:28

1
voti

[14] Re: PIC18 problemi su Tad dell'ADC

Messaggioda Foto UtenteTardoFreak » 31 dic 2013, 16:42

Con il C18 si selezionano i 12 bit in questo modo:
Codice: Seleziona tutto
// Seleziona la risoluzione del convertitore A/D a 12 bit
#pragma config ADCSEL = BIT12
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[15] Re: PIC18 problemi su Tad dell'ADC

Messaggioda Foto Utentethexeno » 31 dic 2013, 17:02

Si si, esatto, guarda il post #9 sotto la sezione CONFIG3H. Per questo sono "preoccupato".
Avatar utente
Foto Utentethexeno
235 5 9
Frequentatore
Frequentatore
 
Messaggi: 298
Iscritto il: 12 apr 2010, 18:28

1
voti

[16] Re: PIC18 problemi su Tad dell'ADC

Messaggioda Foto Utentec1b8 » 1 gen 2014, 13:16

Se utilizzi il bootloader per trasferire il programma al Pierin, di default i fuses non vengono inviati, mantenendo i fuses del bootloader stesso. Dovrebbe quindi dirci Foto UtenteTardoFreak se il bootloader ha configurato l'adc a 10 o a 12 bit.

Potresti cambiarli in fase di trasferimento del programma con il bootloader ma è pericolosissimo: un fuses diverso dal previsto ed il bootloader potrebbe non funzionare più.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[17] Re: PIC18 problemi su Tad dell'ADC

Messaggioda Foto Utentethexeno » 1 gen 2014, 19:53

c1b8 ha scritto:Potresti cambiarli in fase di trasferimento del programma con il bootloader


Non ho mai sentito parlare di questa cosa, potresti spiegarti meglio?

Per il resto, sapevo che quei #pragma sono modificabili, o almeno credo, perché mi pare di aver fatto una prova una volta con un fuse diverso e vedere la differenza.
Avatar utente
Foto Utentethexeno
235 5 9
Frequentatore
Frequentatore
 
Messaggi: 298
Iscritto il: 12 apr 2010, 18:28

0
voti

[18] Re: PIC18 problemi su Tad dell'ADC

Messaggioda Foto UtenteTardoFreak » 1 gen 2014, 20:25

Con il bootoader la risoluzione è 10 bit.
Sconsiglio vivamente di fare paciocchi con i fuses (LED rosso lampeggiante)!
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[19] Re: PIC18 problemi su Tad dell'ADC

Messaggioda Foto Utentethexeno » 1 gen 2014, 23:46

TardoFreak ha scritto:Con il bootoader la risoluzione è 10 bit.
Sconsiglio vivamente di fare paciocchi con i fuses (LED rosso lampeggiante)!


Ma quindi ora ho due domande chiave:
1. se non prendo un programmatore non potrò mai avere in modo "sicuro" i 12 bit?
2. il file di configurazione con i vari #pragma posso anche cestinarlo perché non sortisce alcun effetto?
Avatar utente
Foto Utentethexeno
235 5 9
Frequentatore
Frequentatore
 
Messaggi: 298
Iscritto il: 12 apr 2010, 18:28

2
voti

[20] Re: PIC18 problemi su Tad dell'ADC

Messaggioda Foto Utentec1b8 » 2 gen 2014, 1:33

thexeno ha scritto:
c1b8 ha scritto:Potresti cambiarli in fase di trasferimento del programma con il bootloader

Non ho mai sentito parlare di questa cosa, potresti spiegarti meglio?

Il bootloader deve garantire la propria sopravvivenza, impedisce quinid di scrivere nell'area di memoria flash dove lui risiede e di default impedisce che vengano cambiati i fuses nel micro.
Questa ultima è però una impostazione di default è possibile, durante il trasferimento del programma, impostare alcuni flag del bottloader (lato PC) in modo che sovrascriva anche i fuses.

ATTENZIONE PERO', questa è una operazione pericolosa perché se il cambio dei fuses rende non più funzionante il bootlader l'unico modo per ripristinarlo è utilizzare un programmatore per ritrasferire il bootloader stesso ed i corretti fuses nel micro

thexeno ha scritto:Ma quindi ora ho due domande chiave:
1. se non prendo un programmatore non potrò mai avere in modo "sicuro" i 12 bit?
2. il file di configurazione con i vari #pragma posso anche cestinarlo perché non sortisce alcun effetto?

Non esattamente. Il PIC18F47J53, ed altri PIC della serie 18, si avviano con i valori specificati nei fuses, copiano i fuses stessi nelle ultime locazione della memoria flash e da quel momento il sistema utilizza poi questa copia dei fuses per funzionare. E' possibile quindi da firmware, modificare la copia in memoria flash dei fuses, modificando di conseguenza il comportamento del firmware stesso, modifica che non sarà definitiva ma valida solo fino al prossimo reset. Il bootloader non vedrà quindi lo modifiche che il tuo programma apporta alla copia dei fuses e continuarà a lavorare correttamente, il tuo programma utilizzerà la copia modificata e lavorerà con l'adc a 12bit.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 10 ospiti