Sida 1 av 2
multiplicera 24bit-tal cc8e-kopilator
Postat: 20 april 2006, 19:26:05
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]
Postat: 20 april 2006, 19:40:09
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.
Postat: 20 april 2006, 19:52:39
av sodjan
> Funkar det?
Nej.
24b x 24b = 48b
"c" i exemplet räcker inte till...
Postat: 20 april 2006, 19:56:09
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;
}
har testat funkar i simulatorn
Postat: 20 april 2006, 20:11:37
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)
Postat: 20 april 2006, 20:18:50
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å.
Postat: 20 april 2006, 20:22:25
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...
EDIT: såg just de två senaste inläggem, men det ändrar inget, i princip...
för många beräkningar?
Postat: 20 april 2006, 20:23:05
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?
Postat: 20 april 2006, 20:29:20
av sodjan
> "...en varning typ..."
Vadå "typ" ???
Det duger inte. Bättre kan du nog...
svar på sodjans fråga
Postat: 20 april 2006, 20:31:00
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
Postat: 20 april 2006, 20:35:49
av bearing
>"inline division"
Då har du skrivit ett för komplicerat uttryck. Du kan inte skriva t.ex.
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.)
en varning till sodjans undran
Postat: 20 april 2006, 20:38:34
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
Postat: 20 april 2006, 20:38:41
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.
Postat: 20 april 2006, 20:44:06
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...
många bra o vettiga svar
Postat: 20 april 2006, 20:46:45
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.