sicuramente è una cavolata: inizializzandolo e anche accendendolo, è come se non partisse a convertire e rimane nel loop di controllo del flag. Ma rimuovendo questo loop, si pianta lo stesso. In debug dice che ho un Tad troppo veloce, eppure ho inizializzato tutto. Persino esempi su pic18 sono fatti così come ho fatto io... sotto il codice. E' una versione quasi "dinamica", ma le operazioni di bitwise sono corrette (vedo dal debug) e l'errore persiste anche assegnando il tutto in modo statico.
- Codice: Seleziona tutto
void main(void)
{
/* Configure the oscillator for the device */
// ConfigureOscillator();
/* Initialize I/O and Peripherals for application */
InitApp();
usart_init();
init_adc(2); // !!!!!!!!!!!!!!!!! 3V3 ONLY!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// init_pwm();
/* TODO <INSERT USER APPLICATION CODE HERE> */
printf("EPIC!");
while(1)
{
ADCON0bits.GO = 1;
while(ADCON0bits.GO);
__delay_ms(15);
a = ADRESH; // 'a' should be 16bit int type
a = a << 8;
a |= ADRESL;
printf("ADC: %d\n", a);
}
Inizializzazione
- Codice: Seleziona tutto
void init_adc(uint8_t ch)
{
//!!!!!!!!!!!!!!!!!!!!!!!!!!! NON E' 5V TOLERANT!!!!!!!!!!!!
//12 bit
ADCON0 |= (ch << 2);
ADCON1 = 0x06; // fosc/64
ANCON0 |= ~(1 << ch); //shifto a sx 1 di ch posizioni e complemento per avere
// 0 sul canale scelto (analog behav)
if ((ch - 8)>= 0){ //REsetto gli ultimi 4 bit, stessa cosa
ANCON1 |= ~(1<<(ch-8)) ;
ANCON1bits.VBGEN = 0; // mantengo a 0 quel che deve stare a 0
}
ADCON0bits.ADON = 1; //ADC [ON]
PIE1bits.ADIE = 1; // int on
IPR1bits.ADIP = 1; // high prior
}
Andando a seguire alla lettera la sequenza di inizializzazione non cambia il risultato, ho quindi postato la prima versione, che tiene solo conto dell'ordine dell'accensione dell'adc. Comunque, vi posto anche l'altra, statica e che segue il datasheet.
- Codice: Seleziona tutto
void init_adc(uint8_t ch)
{
//!!!!!!!!!!!!!!!!!!!!!!!!!!! NON E' 5V TOLERANT!!!!!!!!!!!!
//12 bit
// ANCON0 |= ~(1 << ch); //shifto a sx 1 di ch posizioni e complemento per avere
// 0 sul canale scelto (analog behav)
ANCON0 = 0x00;
ANCON1 = 0x00;
// if ((ch - 8)>= 0){ //REsetto gli ultimi 4 bit, stessa cosa
// ANCON1 |= ~(1<<(ch-8)) ;
// ANCON1bits.VBGEN = 0;
// }
ADCON0 = 0b00001000;
ADCON1 = 0b00001110; // fosc/64
ADCON0bits.ADON = 1; //ADC [ON]
PIE1bits.ADIE = 1; // int on
PIR1bits.ADIF = 0;
IPR1bits.ADIP = 1; // high prior
INTCONbits.GIEH = 1; // high attivo ALL INT attivi
INTCONbits.GIEL = 1; // LOW attivo
Ovviamente nemmeno il flag di interrupt si modifica. Avete dei pareri? Insomma, stampa soltanto "EPIC!" e basta...
Grazie a tutti!

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)



