22 marzo 11, 00:01 | #1 (permalink) Top |
User Data registr.: 19-07-2008 Residenza: catania
Messaggi: 978
| Convertitore Analogico Digitale
salve.. a tutti.. mi rivolgo in particolare ai Robottari o a chi in campo aeronautico a bazicato sull'argomento.. Dunque ho fatto una buona lettura del datasheet del 16F876 riguardo ADC, e metto assieme qualche riga di codice in ASSEMBLER.. ..sebbene qualche difficoltà ottengo il risultato sperato.. ovvero con un potenziometro converto il flusso di corrente in Digitale un numero compreso tra 0 e 255. Però però però.. ..in realtà c'è un po di mistero... ...pe spiegarmi meglio inserisco a questo punto le righe di codice: ; START PROGRAM ; ------------------------------------ ORG 0 ;================================================= ============ ; Set Analog Port for RA0 ;================================================= =========== BSF STATUS,RP0 ; * SELECT BANK 1 * ; - Set ADCON1 register MOVLW b'00000000' ; 0 > giustificazione a sinistra MOVWF ADCON1 ; 000 > - nessun significato ; 0000> tutte porte digitali di PORTA ; Vref+ = Vdd, Vref- = GND BCF STATUS,RP0 ; * SELECT BANK 0 * BCF STATUS,RP1 ; - Set ADCON0 register MOVLW b'11000001' ; 11 > velocità campionamento = clock interno MOVWF ADCON0 ; 000 > RA0, 001 RA1, 010 RA2, 011 RA3, 100 RA4 ; 0 > GO/DONE (SE = 1 AVVIA CONVERTITORE) ; 0 > - nessun significato ; 1 > convertitore attivo pronto per l'uso ;================================================= ========== BSF STATUS,RP0 ; * SELECT BANK 1 * MOVLW b'00011111' MOVWF TRISA movlw b'00000000' MOVWF TRISB movlw b'00000000' MOVWF TRISC BCF STATUS,RP0 ; Select Bank 0 ; __________________________________________________ _____________________ INIT MOVLW b'00000000' MOVWF PORTC MOVLW b'00000000' MOVWF PORTB Bene bene ...funziona correttamente ma non leggo i due bit in più ...che cosa succede? qualcuno sa risolvere il dilemma? per leggere i due bit ho dovuto settare MOVLW b'10000000' ; 0 > giustificazione a destra. MOVWF ADCON1 spero che qualcuno possa dare qualche info a dopo fasuto |
22 marzo 11, 19:41 | #2 (permalink) Top | |
User Data registr.: 21-01-2004 Residenza: Milano
Messaggi: 989
| Citazione:
Michele P.S.: per favore, passa al C!! E' molto più semplice ed efficiente!
__________________ __________________________________________________ The worst day flying is better than the best day working. | |
24 marzo 11, 00:09 | #3 (permalink) Top |
User Data registr.: 19-07-2008 Residenza: catania
Messaggi: 978
| ok
carissimo.. che piacere.. allora credo il 16F876 non abbia 10 bit.. ma ne ha solo 8 per la conversione I registri ADRESH e ADRESL si caricano dello stesso valore.. non esiste che uno mantiene i primi 8 bit e l'altro i due rimanenti.. ripeto entrambi si caricano dello stesso valore Ho fatto le prove: se giustifico a sinistra ottengo 8 bit di rispota da 0 a 255 sia per ADRESH che per ADRESL se giustifico a destra ottengo 2 bit di risposta sia per ADRESL che per ADRESH Inoltre mettendo un potenziometro facendo variare la correre.. a fondo scala arriva a 255 e nell'altro lato arriva a 0 se fossero 10 bit dovrei ottenere numeri del tipo | | 1000000000 per cui nel registro L dovrei leggere 00000000 nell'altro 10 invece scorrono progressivi da 0 a 11111111 non ci sono tracce dei numeri compresi tra 256 e 1024 ! Ne viene che il 16F876 nel convertire un segnale analogico gestisce max 8 bit... e non 10 come scritto. Venerdi mi arrivano i 18F2320 credo che sarà un'altra musica. Se hai osservazioni prego accomodati, sono curioso di ascoltarti.. anzi ti ringrazio tantissimo in anticipo fausto |
24 marzo 11, 00:30 | #4 (permalink) Top | |
User Data registr.: 21-01-2004 Residenza: Milano
Messaggi: 989
| Citazione:
Come verifica giustifica a dx e vedrai che i due bit variano da 0 a 3 su tutta la corsa del potenziometro. Michele
__________________ __________________________________________________ The worst day flying is better than the best day working. | |
24 marzo 11, 00:41 | #5 (permalink) Top | |
User Data registr.: 29-05-2006 Residenza: Catania
Messaggi: 2.933
| Citazione:
Pensa per esempio quanto è facile leggere un ingresso analogico ( An0 ) ( qualunque sia la lunghezza del suo risultato )per esempio 10bit, sommargli una cifra ( 512 ) e mandarlo in output sul portB ed i restanti bit più significativi sul portA: PORTB= Adc_Read(0)+512; PORTA= Adc_Read(0)>>8; Oppure fare un semplice ritardo espresso in millisecondi (123 per esempio): delay_ms(123); Fine!! Senza tutti quei mov, loop, ecc ecc.....
__________________ Il filo attaccato all'antenna non mente mai....Troppo vento, si torna a casa.... I miei circuiti elettronici autocostruiti: Postbruciatore per ventole intubate ; Circuito luci per aeromodello-elimodello ; Rallenta servo con protezione da corto circuito | |
24 marzo 11, 11:50 | #6 (permalink) Top |
User |
int16: adresult adresult = ADRESH <<8 | ADRESL il 16F876 HA il convertitore AD a 10 bit, usato personalmente e funzionante. Mi associo nel consigliarti il passaggio al 'C', è gratis quello della Microchip.
__________________ Peace & Love Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein) |
13 aprile 11, 01:07 | #7 (permalink) Top | |
User Data registr.: 19-07-2008 Residenza: catania
Messaggi: 978
| pensa
a parte la semplicità del C ecc.. pensa come invece programmando in Assembler si riesce ad ottenere il massimo della precisione in termini di controllo hardware !!! specie per la generazione di ritardi, oppure la ottimizzazione di firmware, alla fine se riflettiamo un attimo risolti i vari problemi, è sufficiente fare copia incolla e si riesce a lavorare con EEPROM, TIMER, porte ANALOGICHE, PORTE I/O digitali con poco sforzo .. quasi come lavorare in C, con il vantaggio però di avere tutto sotto controllo e non dipendere da nessun ambiente di sviluppo... l'unico strumento note pad e il datasheet basta! a dopo fausto Citazione:
| |
13 aprile 11, 01:18 | #8 (permalink) Top | |
User Data registr.: 19-07-2008 Residenza: catania
Messaggi: 978
| ok
no assolutamente ho fatto prove e riprove, entrambi assumono lo stesso valore, che se è asinistra sarà di 8 bit mentre a destra si soli 2 bit... ma entrambi lo stesso numero.. Nel frattempo ho messo a punto una rotine che riesce a leggere 2,3, ecc porte analogiche contemporaneamente... meglio alternando la lettura tra di esse... per il discorso 10 o 8 bit credo che c'è qualcosa che mi sfugge e che devo approfondire.. intanto oggi mi sono arrivati i 18F2320 ..cercherò di usarli e vedere un po di risolvere la faccenda. a dopo fausto Citazione:
| |
14 aprile 11, 17:42 | #9 (permalink) Top |
User Data registr.: 21-01-2004 Residenza: Milano
Messaggi: 989
| Ti confermo che stai leggendo solo il registro ADSRH!! Se vuoi mandami il codice che gli dò un'occhiata. Michele
__________________ __________________________________________________ The worst day flying is better than the best day working. |
Bookmarks |
| |
Discussioni simili | ||||
Discussione | Autore discussione | Forum | Commenti | Ultimo Commento |
Sul futaba gy240,servo digitale o analogico? | Fulvio76 | Elimodellismo Motore Elettrico | 48 | 29 agosto 10 01:31 |
In coda, servo analogico o digitale? | mark.me | Elimodellismo Motore Elettrico | 13 | 07 novembre 09 10:36 |
Come posso testare servo digitale e analogico | frenky | Radiocomandi | 4 | 19 aprile 09 16:20 |
Digitale o Analogico....? | marcomesuraca | Automodellismo Mot. Scoppio On-Road | 24 | 03 marzo 07 19:55 |