multiplicera 24bit-tal cc8e-kopilator

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
tobbetabbe
Inlägg: 35
Blev medlem: 2 februari 2005, 17:18:12
Ort: Göteborg

multiplicera 24bit-tal cc8e-kopilator

Inlägg av tobbetabbe »

vet ej hur jag ska deklarera i programspråket C , 24-bitars heltalsvariabler och vilka h-filer som ska inkluderas,för att sedan utföra multiplikationer och divisioner.Det enda som funkar nu är 16-bitars-uträkningar fattar inte denna kompilator(CC8e-demo) och PIC18F458 visa hjärna exempel.Tack[/b]
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Variabler kan deklareras som uns8, uns16, uns24 eller int8, int16, int24.
math24.h heter nog inkludefilen

Kod: Markera allt

#include <18f458.h>
//#include <math24.h>

void main()
{
uns24 a=1000,b=2000,c;

c=a*b;
}
Funkar det? (jag har inte kompilatorn här)

EDIT: Tankade hem kompilatorn, det funkar. Du tjänar inte på att använda biblioteket om du bara ska göra en multiplikation.
Senast redigerad av bearing 20 april 2006, 19:54:30, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Funkar det?

Nej.

24b x 24b = 48b

"c" i exemplet räcker inte till...
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Men 1000*2000 får plats. 24 bitar är största variabelstorleken i demot, så det går inte att göra något åt att vissa värden ger overflow.

EDIT: OK, kanske hade varit ett bättre exempel att göra såhär:

Kod: Markera allt

#include <18f458.h>
//#include <math24.h>

void main()
{
uns8 a=100;
uns16 b=20000;
uns24 c;

c=a*b;
}
tobbetabbe
Inlägg: 35
Blev medlem: 2 februari 2005, 17:18:12
Ort: Göteborg

har testat funkar i simulatorn

Inlägg av tobbetabbe »

antar att detta kommer att funka i verkligheten hoppas jag.det jag ska göra är några multiplikationer,divisioner efter varandra hoppas detta funkar då antar att projektet inte blir för stort (beräknar värden samplade från pulsgivare och beräknar RPM)
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Du måste veta extremvärdena på de variabler du ska multiplicera. Kontrollera att produkten av maxvärdena inte tar upp mer plats än 24 bitar. Om det inte får plats vid en multiplikation kanske du kan få till det om du klämmer in någon av divisionerna emellan. Det tappar du dock noggrannhet på.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> "Vissa värden ger overflow..."

"Vissa värden" :-)

Det är faktiskt bara ca 16 miljoner fall av indata av totalt
över 200 biljoner kombinationer av två 24 bitars tal som ger
en produkt som är 24 bitar eller mindre. Så i ca ett (1)
fall på 17 miljoner fungerar det... :-)

Men, en fråga till tobbetabbe,

Varför är frågan om mult av två 24b tal alls intressant ?
Man kan ju i alla fall inta göra något med resultatet (i de flesta fall).

Men man skulle ju kunna länka in lite ASM härifrån
http://www.piclist.com/techref/microchi ... /index.htm
om inte kompilatorn klarar det man vill... 8)

EDIT: såg just de två senaste inläggem, men det ändrar inget, i princip...
tobbetabbe
Inlägg: 35
Blev medlem: 2 februari 2005, 17:18:12
Ort: Göteborg

för många beräkningar?

Inlägg av tobbetabbe »

kompilatorn gav en varning typ "inline division" nånting påstod att man ska dela upp beräkningarna men vet inte hur för mycket kod eller?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> "...en varning typ..."

Vadå "typ" ???
Det duger inte. Bättre kan du nog...
tobbetabbe
Inlägg: 35
Blev medlem: 2 februari 2005, 17:18:12
Ort: Göteborg

svar på sodjans fråga

Inlägg av tobbetabbe »

värdet varvatal/minut beräknas av

minut=60 sek

pulstal: 1024 pulser/varv

timer frekvens=5MHz=200nS

tex RPM=(60*5 MHz)/(antal interna pulser*pulstal)

slutresultatet är litet men därinnan stora tal
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

>"inline division"

Då har du skrivit ett för komplicerat uttryck. Du kan inte skriva t.ex.

Kod: Markera allt

if(a*b>(c/d+e)) ...
Du får dela upp det.

Kod: Markera allt

temp1=a*b;

temp2=c/d;
temp2+=e;

if (temp1>temp2) ...
Detta eftersom att han som skrivit kompilatorn tror att du (programmeraren) är bättre på att optimera sådant än hans kompilator. (Ungefär så förklarade min lärare det.)
tobbetabbe
Inlägg: 35
Blev medlem: 2 februari 2005, 17:18:12
Ort: Göteborg

en varning till sodjans undran

Inlägg av tobbetabbe »

Warning[2] C:\exjobb2005\extern_interrrupt_rs232_060413_kl1500.c 531 : Duplicate inline division (math library may save code, option -wi removes warning)

de va detta ja mena med inline division
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Sånt förkortar man så mycket det går först.

RPM = (60 * 5.000.000)/(1024 * x)
kan ju kokas ner till
RPM = 1171875/(256 * x)
vilket ger en del mer hanterbara storleker.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Om mitt svar inte hjälpte får du ge oss koden kring raden det blir fel i.

EDIT: Läste meddelande mer noggrannt nu. Det är bara en varning. Det står att du bör inkludera mattebiblioteket (antagligen math24.h) för att spara kodstorlek.

Ser att du verkar göra detta i ett interrupt. Går det verkligen? division med 24-bitars tal tar lång tid...
Senast redigerad av bearing 20 april 2006, 20:48:39, redigerad totalt 1 gång.
tobbetabbe
Inlägg: 35
Blev medlem: 2 februari 2005, 17:18:12
Ort: Göteborg

många bra o vettiga svar

Inlägg av tobbetabbe »

tack för alla smarta svar hoppas jag blir så smart att någon behöver min hjärna Den enda handledaren är jag själv annars.kommer testa kretsen i morron antar att det kommer att lösa sig med PIC-matten annars får jag fråga mer,men en allmän fråga är 18xxx kretsarna lämpliga för såna här beräkningar.börjar snart nå taket känner jag.antar att en för hög frekvens av avbrott i programmet spökar.om det nu finns någon gräns för hur ofta avbrottsrutinerna slår in.
Skriv svar