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.
PIC18 problemi su Tad dell'ADC
Moderatore:
Paolino
28 messaggi
• Pagina 2 di 3 • 1, 2, 3
1
voti
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();
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.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
Esatto. Il tuo codice l'ho usato così nel main:
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.
- 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.
1
voti
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.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
1
voti
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
TardoFreak 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ù.
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
0
voti
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.
0
voti
Con il bootoader la risoluzione è 10 bit.
Sconsiglio vivamente di fare paciocchi con i fuses (LED rosso lampeggiante)!
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.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
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?
2
voti
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
28 messaggi
• Pagina 2 di 3 • 1, 2, 3
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 10 ospiti

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)

