Räkna medelvärde i PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
fatpo83
Inlägg: 282
Blev medlem: 21 april 2004, 22:42:28
Ort: Sthlm

Räkna medelvärde i PIC

Inlägg 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);
}
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg 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...
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg 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. :(
fatpo83
Inlägg: 282
Blev medlem: 21 april 2004, 22:42:28
Ort: Sthlm

Inlägg 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??
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg 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
fatpo83
Inlägg: 282
Blev medlem: 21 april 2004, 22:42:28
Ort: Sthlm

Inlägg 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?
fatpo83
Inlägg: 282
Blev medlem: 21 april 2004, 22:42:28
Ort: Sthlm

Inlägg 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!
Skriv svar