Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

calcolo della media di 20 valori in assembler

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] calcolo della media di 20 valori in assembler

Messaggioda Foto UtenteGrio » 30 nov 2014, 20:32

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
Avatar utente
Foto UtenteGrio
0 2
 
Messaggi: 26
Iscritto il: 20 ott 2012, 18:07

0
voti

[2] Re: calcolo della media di 20 valori in assembler

Messaggioda Foto UtenteCandy » 30 nov 2014, 21:44

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.
Avatar utente
Foto UtenteCandy
32,4k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10132
Iscritto il: 14 giu 2010, 22:54

0
voti

[3] Re: calcolo della media di 20 valori in assembler

Messaggioda Foto Utentesimo85 » 30 nov 2014, 21:46

Se non trovi nessuna soluzione fallo in C e poi prendi spunto dal disassembling del codice.
Avatar utente
Foto Utentesimo85
30,8k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9930
Iscritto il: 30 ago 2010, 4:59

0
voti

[4] Re: calcolo della media di 20 valori in assembler

Messaggioda Foto UtenteGrio » 30 nov 2014, 22:23

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?
Avatar utente
Foto UtenteGrio
0 2
 
Messaggi: 26
Iscritto il: 20 ott 2012, 18:07

3
voti

[5] Re: calcolo della media di 20 valori in assembler

Messaggioda Foto UtenteDarwinNE » 30 nov 2014, 22:35

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
        ucr   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
Follow FidoCadJ development on Twitter: https://twitter.com/davbucci
Avatar utente
Foto UtenteDarwinNE
25,3k 5 11 13
G.Master EY
G.Master EY
 
Messaggi: 3562
Iscritto il: 18 apr 2010, 9:32
Località: Grenoble - France

0
voti

[6] Re: calcolo della media di 20 valori in assembler

Messaggioda Foto UtenteGrio » 30 nov 2014, 22:51

ti ringrazio credo che avrò bisogno di un po di tempo per capirlo
Avatar utente
Foto UtenteGrio
0 2
 
Messaggi: 26
Iscritto il: 20 ott 2012, 18:07

1
voti

[7] Re: calcolo della media di 20 valori in assembler

Messaggioda Foto UtenteRobert8 » 1 dic 2014, 0:35

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
Avatar utente
Foto UtenteRobert8
3.449 2 8 13
Master EY
Master EY
 
Messaggi: 370
Iscritto il: 15 giu 2011, 16:30

2
voti

[8] Re: calcolo della media di 20 valori in assembler

Messaggioda Foto Utentefairyvilje » 1 dic 2014, 0:47

Evviva la propagazione degli errori D:
"640K ought to be enough for anybody" Bill Gates (?) 1981
Qualcosa non ha funzionato...

Lo sapete che l'arroganza in informatica si misura in nanodijkstra? :D
Avatar utente
Foto Utentefairyvilje
11,4k 4 9 12
G.Master EY
G.Master EY
 
Messaggi: 2452
Iscritto il: 24 gen 2012, 19:23

0
voti

[9] Re: calcolo della media di 20 valori in assembler

Messaggioda Foto UtenteEcoTan » 1 dic 2014, 1:00

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.
Avatar utente
Foto UtenteEcoTan
5.350 4 10 13
Expert EY
Expert EY
 
Messaggi: 3227
Iscritto il: 29 gen 2014, 8:54

0
voti

[10] Re: calcolo della media di 20 valori in assembler

Messaggioda Foto UtenteEcoTan » 1 dic 2014, 9:43

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?
Avatar utente
Foto UtenteEcoTan
5.350 4 10 13
Expert EY
Expert EY
 
Messaggi: 3227
Iscritto il: 29 gen 2014, 8:54

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti