multiplicera 24bit-tal cc8e-kopilator
-
- Inlägg: 35
- Blev medlem: 2 februari 2005, 17:18:12
- Ort: Göteborg
multiplicera 24bit-tal cc8e-kopilator
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]
Variabler kan deklareras som uns8, uns16, uns24 eller int8, int16, int24.
math24.h heter nog inkludefilen
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.
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;
}
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.
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:
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;
}
-
- Inlägg: 35
- Blev medlem: 2 februari 2005, 17:18:12
- Ort: Göteborg
har testat funkar i simulatorn
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)
> "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...
EDIT: såg just de två senaste inläggem, men det ändrar inget, i princip...
"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...

EDIT: såg just de två senaste inläggem, men det ändrar inget, i princip...
-
- Inlägg: 35
- Blev medlem: 2 februari 2005, 17:18:12
- Ort: Göteborg
för många beräkningar?
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?
-
- Inlägg: 35
- Blev medlem: 2 februari 2005, 17:18:12
- Ort: Göteborg
svar på sodjans fråga
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
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
>"inline division"
Då har du skrivit ett för komplicerat uttryck. Du kan inte skriva t.ex.
Du får dela upp det.
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.)
Då har du skrivit ett för komplicerat uttryck. Du kan inte skriva t.ex.
Kod: Markera allt
if(a*b>(c/d+e)) ...
Kod: Markera allt
temp1=a*b;
temp2=c/d;
temp2+=e;
if (temp1>temp2) ...
-
- Inlägg: 35
- Blev medlem: 2 februari 2005, 17:18:12
- Ort: Göteborg
en varning till sodjans undran
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
de va detta ja mena med inline division
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...
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.
-
- Inlägg: 35
- Blev medlem: 2 februari 2005, 17:18:12
- Ort: Göteborg
många bra o vettiga svar
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.