Pagina 1 di 3

calcolo della media di 20 valori in assembler

MessaggioInviato: 30 nov 2014, 20:32
da Grio
Mi potete consigliare qualche link per capire come posso scrivere una routine in assembler per fare la media di 20 campinamenti del valore analogico di un registro del PIC 16F876a

Re: calcolo della media di 20 valori in assembler

MessaggioInviato: 30 nov 2014, 21:44
da Candy
Un bel pacco di memoria e codice per fare un simile lavoro in assembler. Non impossibile, ma realmente utile?
Ti serve realmente la media a 20 campioni, o ti occorre un filtro? Io scriverei un filtro parametrizzabile che corregga l'uscita in funzione dei campioni rilevati in ingresso, discretizzando, magari, una rete RC.

Re: calcolo della media di 20 valori in assembler

MessaggioInviato: 30 nov 2014, 21:46
da simo85
Se non trovi nessuna soluzione fallo in C e poi prendi spunto dal disassembling del codice.

Re: calcolo della media di 20 valori in assembler

MessaggioInviato: 30 nov 2014, 22:23
da Grio
ok non voglio complicarmi troppo la vita, tanto per capirne la sintassi sarebbe sufficiente fare la media di tre campioni. Sono interessato a saperne di più anche del filtro RC mi puoi dare qualche indicazione in merito?

Re: calcolo della media di 20 valori in assembler

MessaggioInviato: 30 nov 2014, 22:35
da DarwinNE
Un po' di tempo fa, mi sono divertito a calcolare media e varianza di 16 valori a 12 bit con un PIC16F877, memorizzati in una tabella in RAM. TableC è il contatore nella tavola, TableS è l'indirizzo dell'inizio della tavola in RAM. TABLESIZE vale 16, il risultato si trova in SumL e SumH.

Codice: Seleziona tutto
; Calculate the average of the values contained in the table
; The table contains 16 values of 12 bits, contained in 16 bits.
; Therefore, calculating the sum with 16 bits is sufficient.
; The result is unsigned.
tableavg
        BANKSEL TableS
        clrf    SumL        ; Null the sum registers
        clrf    SumH
        clrf    TableC
looptableavg
        movfw   TableC
        addlw   TableS
        movwf   FSR
        movfw   INDF
        addwf   SumL,f      ; Sum the least significative 8 bits
        btfsc   STATUS,C    ; Adjust carry from the LSBs sum
        incf    SumH,f     
        incf    TableC,f
        incf    FSR,f
        movfw   INDF
        addwf   SumH,f      ; Sum the most significative 2 bits
       
        incf    TableC,f   
        movfw   TableC
        xorlw   TABLESIZE
        btfss   STATUS,Z    ; Loop through all the table
        goto    looptableavg
       
        movfw   SumL
        andlw   0x0F
        movwf   TableC      ; TableC is not used anymore in this context
        call    divide16sum
       
        movfw   SumH
        movwf   NumH
        movfw   SumL
        movwf   NumL
       
        return


Prendere 16 valori viene comodo perché non si rischia l'overflow con risultati unsigned a 12 bit e perché dividere per sedici è facile utilizzando degli operatori di shift:

Codice: Seleziona tutto
; Divide by 16 the sum
divide16sum
        bcf     STATUS,C   
        rrf     SumH,f
        rrf     SumL,f
        bcf     STATUS,C
        rrf     SumH,f
        rrf     SumL,f
        bcf     STATUS,C
        rrf     SumH,f
        rrf     SumL,f
        bcf     STATUS,C
        rrf     SumH,f
        rrf     SumL,f     
       
        return


Per quanto riguarda la licenza per il codice di cui sopra:

Codice: Seleziona tutto
;    This program is free software; you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation; either version 3 of the License, or
;    (at your option) any later version.
;
;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.
;
;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/>.


Per quanto mi sia divertito, sono giunto alla conclusione che è l'ultima volta che uso l'assembly di microcontrollori così piccoli. La prossima volta vado su un STM32 e lo programmo in C :D

Re: calcolo della media di 20 valori in assembler

MessaggioInviato: 30 nov 2014, 22:51
da Grio
ti ringrazio credo che avrò bisogno di un po di tempo per capirlo

Re: calcolo della media di 20 valori in assembler

MessaggioInviato: 1 dic 2014, 0:35
da Robert8
Un altro modo per calcolare la media usando solo registri consiste nel ricavare la media successiva partendo dalla media precedente:

Media succ. = (Media prec. * num. elemento prec. + elemento succ.) / num. elemento succ.

Per esempio al 20esimo elemento si ottiene:

Media al 20esimo = (Media al 19esimo * 19 + 20esimo) / 20

Re: calcolo della media di 20 valori in assembler

MessaggioInviato: 1 dic 2014, 0:47
da fairyvilje
Evviva la propagazione degli errori D:

Re: calcolo della media di 20 valori in assembler

MessaggioInviato: 1 dic 2014, 1:00
da EcoTan
fairyvilje ha scritto:Evviva la propagazione degli errori D:

Questo non l'ho verificato però è chiaro che questo metodo delle medie successive comporta più calcoli rispetto al primo metodo proposto.

Re: calcolo della media di 20 valori in assembler

MessaggioInviato: 1 dic 2014, 9:43
da EcoTan
fairyvilje ha scritto:la propagazione degli errori

Sì, se i valori fossero
10, 11, 12, 13, ....
la media calcolata con quel metodo rimarrebbe sempre 10, sbaglio?