calcolo della media di 20 valori in assembler
Moderatore:
Paolino
21 messaggi
• Pagina 1 di 3 • 1, 2, 3
0
voti
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
0
voti
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.
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.
-

Candy
32,5k 7 10 13 - CRU - Account cancellato su Richiesta utente
- Messaggi: 10123
- Iscritto il: 14 giu 2010, 22:54
0
voti
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?
3
voti
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.
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:
Per quanto riguarda la licenza per il codice di cui sopra:
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
- 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
Follow me on Mastodon: @davbucci@mastodon.sdf.org
-

DarwinNE
31,0k 7 11 13 - G.Master EY

- Messaggi: 4420
- Iscritto il: 18 apr 2010, 9:32
- Località: Grenoble - France
0
voti
ti ringrazio credo che avrò bisogno di un po di tempo per capirlo
1
voti
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
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
2
voti
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?
Qualcosa non ha funzionato...
Lo sapete che l'arroganza in informatica si misura in nanodijkstra?
-

fairyvilje
15,0k 4 9 12 - G.Master EY

- Messaggi: 3047
- Iscritto il: 24 gen 2012, 19:23
0
voti
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.
0
voti
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?
21 messaggi
• Pagina 1 di 3 • 1, 2, 3
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 7 ospiti

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)




