BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   Convertitore Analogico Digitale (https://www.baronerosso.it/forum/circuiti-elettronici/206605-convertitore-analogico-digitale.html)

faustog_2 22 marzo 11 00:01

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

MSchiepp 22 marzo 11 19:41

Citazione:

Originalmente inviato da faustog_2 (Messaggio 2503800)
Bene bene ...funziona correttamente ma non leggo i due bit in più ...che cosa succede?

Puoi spiegarti meglio? Cosa vuol dire che non leggi i due bit in più? Dove cerchi di leggerli?

Michele


P.S.: per favore, passa al C!! E' molto più semplice ed efficiente!

faustog_2 24 marzo 11 00:09

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


Citazione:

Originalmente inviato da MSchiepp (Messaggio 2505106)
Puoi spiegarti meglio? Cosa vuol dire che non leggi i due bit in più? Dove cerchi di leggerli?

Michele


P.S.: per favore, passa al C!! E' molto più semplice ed efficiente!


MSchiepp 24 marzo 11 00:30

Citazione:

Originalmente inviato da faustog_2 (Messaggio 2507821)
allora credo il 16F876 non abbia 10 bit.. ma ne ha solo 8 per la conversione...

No! Garantito che ne ha 10!! A prima vista sembra che tu legga solo il registro ADSRH quindi nel caso della giustificaizone a sinistra ti trovi gli 8 bit più significativi, mentre nel caso della giustificazione a destra nella parte alta leggi solo i due bit più significativi.
Come verifica giustifica a dx e vedrai che i due bit variano da 0 a 3 su tutta la corsa del potenziometro.

Michele

Mrk89 24 marzo 11 00:41

Citazione:

Originalmente inviato da faustog_2 (Messaggio 2507821)
...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
Sicuro che non sia tu a leggere due volte il valore dello stesso registro?
...Ne viene che il 16F876 nel convertire un segnale analogico gestisce max 8 bit... e non 10 come scritto.
Mi sembra molto strano!! Il 876 in particolare non l'ho mai utilizzato, ma ho utilizzato il 870,873,877, e sono tutti a dieci bit!!Quindi è molto più probabile un errore da parte tua
Venerdi mi arrivano i 18F2320 credo che sarà un'altra musica.
Programmare i pic della famiglia 18 in Assembler? :o: Non fare pazzie!! Impara ad utilizzare il C.:wink:

Per quanto riguarda il consiglio di passare al C, io lo approvo pienamente!!
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.....

ElNonino 24 marzo 11 11:50

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.

:yeah:

faustog_2 13 aprile 11 01:07

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:

Originalmente inviato da Mrk89 (Messaggio 2507896)
Per quanto riguarda il consiglio di passare al C, io lo approvo pienamente!!
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.....


faustog_2 13 aprile 11 01:18

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:

Originalmente inviato da MSchiepp (Messaggio 2507874)
No! Garantito che ne ha 10!! A prima vista sembra che tu legga solo il registro ADSRH quindi nel caso della giustificaizone a sinistra ti trovi gli 8 bit più significativi, mentre nel caso della giustificazione a destra nella parte alta leggi solo i due bit più significativi.
Come verifica giustifica a dx e vedrai che i due bit variano da 0 a 3 su tutta la corsa del potenziometro.

Michele


MSchiepp 14 aprile 11 17:42

Citazione:

Originalmente inviato da faustog_2 (Messaggio 2538183)
no assolutamente ho fatto prove e riprove,...

Ti confermo che stai leggendo solo il registro ADSRH!!
Se vuoi mandami il codice che gli dò un'occhiata.

Michele

faustog_2 18 aprile 11 10:40

ok
 
ok appena mi trovo il tempo ti invio il codice..

grazie 10000000

a dopo
fausto

Citazione:

Originalmente inviato da MSchiepp (Messaggio 2540550)
Ti confermo che stai leggendo solo il registro ADSRH!!
Se vuoi mandami il codice che gli dò un'occhiata.

Michele


faustog_2 05 maggio 11 12:13

ok ok ok
 
ciao carissimo MSchiepp scusa il RITARDONE !!!

da tenere prsente che il bit 7 di ADCON1 = 1 quindi giustificazione a destra
ecco il condice:

Read_ADC
bsf ADCON0, GO_DONE
btfsc ADCON0, GO_DONE
goto $-1

movf ADRESH,W
andlw 0x03
movwf ValoreH
BSF STATUS,RP0
movf ADRESL,W
BCF STATUS,RP0
movwf ValoreL ;return result in NumL and NumH
return

Grazie
fausto


Citazione:

Originalmente inviato da MSchiepp (Messaggio 2540550)
Ti confermo che stai leggendo solo il registro ADSRH!!
Se vuoi mandami il codice che gli dò un'occhiata.

Michele


faustog_2 05 maggio 11 20:15

ok
 
oggi nn posso perchè non posso
alla prima occasione ti ivnio tutto il codice... anche se in realtà la parte che riguarda ADCON0, e ADCON1 è perfetta , uso come riferimento la tensione che ho sul Mikro, poi uso il clock interno per il campionamento... e cos'altro dire?

ho messo un potenziometro da 10 kohm

grazie come sempre gentilissimo


Citazione:

Originalmente inviato da faustog_2 (Messaggio 2573018)
ciao carissimo MSchiepp scusa il RITARDONE !!!

da tenere prsente che il bit 7 di ADCON1 = 1 quindi giustificazione a destra
ecco il condice:

Read_ADC
bsf ADCON0, GO_DONE
btfsc ADCON0, GO_DONE
goto $-1

movf ADRESH,W
andlw 0x03
movwf ValoreH
BSF STATUS,RP0
movf ADRESL,W
BCF STATUS,RP0
movwf ValoreL ;return result in NumL and NumH
return

Grazie
fausto


faustog_2 07 maggio 11 01:20

Ok Funziona!!!
 
CIAO msCHIEPP...

non mi chiedere perchè , ma stasera dopo tanto tempo che non ci mettevo le mani, funziona, adesso mi accende 10 led, come numerazione binaria.
Adesso voglio andare avanti provando prima a gestire pseudo parallelamente due porte analogiche.. poi vorrei fare esperimenti usanto Vref diversi da quello del Pic..

Insomma pian pian mi allargo le conoscenze..

bene per il momento ecco il sorgente per la letura a 10 bit da una porta analogica, il bello che questo è molto simile per la serie 18F ..insomma messo a segno questo targhet. in futuro potrò sfruttare al meglio i sensori:


;************************************************* *
; Analog_1024.asm
;
; fausto.giudice@gmail.com
;************************************************* *

PROCESSOR 16F876
RADIX DEC
INCLUDE "P16F876.INC"

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_ENABLE_OFF & _LVP_OFF& _DEBUG_OFF & _CPD_OFF

cblock 0x20
L_CONT
H_CONT
SELREG
AN0_
AN1_
NumH
NumL
endc
;
; __________________________________________________ ________________________
;
; START PROGRAM
; ------------------------------------
ORG 0
;
;================================================= =====================
; Set Analog Port for RA0
;================================================= =====================
;
BSF STATUS,RP0 ; * SELECT BANK 1 *

; - Set ADCON1 register
MOVLW b'10000000' ; 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
;
;================================================= =====================
; Set Input and Output Port
;================================================= =====================
;
BSF STATUS,RP0 ; * SELECT BANK 1 *

MOVLW b'00000000' ; RC7/RX entrata seriale
MOVWF TRISC ; RC6/TX uscita seriale


MOVLW b'00011111'
MOVWF TRISA ; Set RA<3:0> as input RA<5:4> as output

movlw b'00000000'
MOVWF TRISB

;
;================================================= =====================
; MAIN LOOP
;================================================= =====================
;
MAIN
BCF ADCON0,3 ; --
BCF ADCON0,4 ; ** --
BCF ADCON0,5 ; ** --
BSF ADCON0,2
LOOP
BTFSC ADCON0,2
GOTO LOOP

movf ADRESH,W
andlw 0x03 ; solo i primi due bit
movwf NumH

BTFSS NumH,0
goto YY
goto XX

BTFSS NumH,1
goto WW
goto ZZ

ABAB BSF STATUS,RP0
movf ADRESL,W ; tutti i bit del registro
BCF STATUS,RP0

movwf NumL
movwf PORTC

BTFSS NumH,0
GOTO $+2
BSF PORTB,0
BCF PORTB,0

BTFSS NumH,1
GOTO $+2
BSF PORTB,1
BCF PORTB,1

GOTO MAIN

;_________________________________________________ ______
WW
BCF PORTB,1
GOTO ABAB
;_________________________________________________ ______
ZZ
BSF PORTB,1
GOTO ABAB
;_________________________________________________ ______
YY
BCF PORTB,0
GOTO ABAB
;_________________________________________________ ______
XX
BSF PORTB,0
GOTO ABAB

END


Citazione:

Originalmente inviato da MSchiepp (Messaggio 2540550)
Ti confermo che stai leggendo solo il registro ADSRH!!
Se vuoi mandami il codice che gli dò un'occhiata.

Michele



Tutti gli orari sono GMT +2. Adesso sono le 02:16.

Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002