Sida 1 av 1
Räkna medelvärde i PIC
Postat: 30 juli 2004, 23:41:30
av fatpo83
Är det jobbigt för PICen att spara typ ett tal på 8bitar och sen räkna medelvärdet??
Asså typ en 24bits variabel som fungerar som en summa och som delas med antal tal => medelvärde....jag menar hur fort går det om man kör med 6Mhz plus att man har massa annat o göra??
Förstår ni?
Typ:
long summa=0,antal=0;
char tal;
while(1) {
tal=8bits tal;
summa+=tal;
antal++;
print(summa/antal);
}
Postat: 30 juli 2004, 23:50:12
av cyr
Division kan ta lång tid, men om antalet tal som du ska ta medelvärde av är 2^N så är det lätt, bara att skifta (som du säkert vet så är högerskift ett steg av ett binärt tal samma sak som division med två).
Om det är t.ex. 256 (2^8) eller 65536 st (2^16) st är det extra lätt. Släng bort en eller två byte bara...
För 65536 st har du alltså en 24bits (tre byte) summa, för att räkna ut medelvärdet när du adderat alla tal så tar du bara den mest värda byten och struntar i de andra två.
edit: ok, du skrev visst till lite mer... du vill alltså räkna ut medelvärdet kontinuerligt?
Det blir nog jobbigare, men någon som är smart och/eller mindre trött kanske har en ide om det fallet...
Postat: 31 juli 2004, 12:19:54
av Chribbe76
Jag har gjort en division 32bit/24bit utan decimaler i resultatet för pic18 (ingen direkt optimering)
Det tar max 1000 klockcykler.
Men det kan finnas algoritmer för kontinuerligt medelvärde som är mycket snabbare men jag har inte hittat något ännu.

Postat: 31 juli 2004, 16:48:26
av fatpo83
Hmm...när jag föröker dividera summa/antal så klagar kompilatorn...jag tror minnet inte räcker till...men tar jag bort divisionen så står det iaf att 50% av RAM och ROM är ledigt...mkt konstigt....
Kan 16C745 klara det här (borde göra!)??
Kan du snabbt klistra in själva division-koden??
Postat: 31 juli 2004, 18:10:04
av Chribbe76
Visst ska den klara av att göra en division, det kräver ju inte så mycket minne men tid kräver det.
Här är koden till Pic18:
Kod: Markera allt
movlw DivNr4
movwf Div1_4
movlw DivNr3
movwf Div1_3
movlw DivNr2
movwf Div1_2
movlw DivNr1
movwf Div1_1
movf DivRes3,w
movwf Div2_3
movf DivRes2,w
movwf Div2_2
movf DivRes1,w
movwf Div2_1
bcf Carry
clrf DivWork1
clrf DivWork2
clrf DivWork3
movlw .32
movwf Counter
DivPart1
rlcf Div1_1
rlcf Div1_2
rlcf Div1_3
rlcf Div1_4
rlcf DivWork1
rlcf DivWork2
rlcf DivWork3
movf Div2_1,w
subwf DivWork1,w
movwf Tmp1
movf Div2_2,w
subwfb DivWork2,w
movwf Tmp2
movf Div2_3,w
subwfb DivWork3,w
movwf Tmp3
btfss STATUS,C
goto SkipStoreDiv1
movff Tmp1,DivWork1
movff Tmp2,DivWork2
movff Tmp3,DivWork3
SkipStoreDiv1:
rlcf DivRes1
rlcf DivRes2
rlcf DivRes3
rlcf DivRes4
decfsz Counter
goto DivPart1
Postat: 31 juli 2004, 18:31:29
av fatpo83
Asså jag blir helt galen....grr....när jag kör helt vanligt och kompilerar går allt genom och jag får:
Memory Usage Map:
Program ROM $0000 - $086A $086B ( 2155) words
Program ROM $086C - $100C $07A1 ( 1953) words
Program ROM $16B4 - $17FF $014C ( 332) words
$1158 ( 4440) words total Program ROM
Bank 0 RAM $0020 - $0078 $0059 ( 89) bytes total Bank 0 RAM
Bank 2 RAM $0120 - $0147 $0028 ( 40) bytes total Bank 2 RAM
Config Data $2007 - $2007 $0001 ( 1) words total Config Data
Program statistics:
Total ROM used 4440 words (54.2%)
Total RAM used 129 bytes (50.4%)
Men så fort jag lägger till en char buffer[25] så klagar kompilatorn...Den säger bara BUILD FAILED och inget annat!! Vad kan felet vara?
Postat: 1 augusti 2004, 16:12:22
av fatpo83
OK. Det var ett bankfel antar jag...de måste väl hänga ihop så jag flyttade arrayen till bank3 o då gick det bra!