 |
Forumas » Elektronika žaliems » integer overflow in expression
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
Puslapis 2 iš 2 Pereiti prie Atgal 1, 2 |
|
 |
 |
 |
integer overflow in expression |
Parašytas: 2015 10 08, 18:53 |
|
|
|
|
Taigi atsakymas paprastas sudeliojau kintamuosius i vietas, bei jiems priskyriau atitinkamus dydzius stai pilnai pabaigtas kodas bmp180 jutikliui, kiek patobulitas nuo pirmo ikelimo(greitesnis veikimas)
| Kodas: |
/*
* bmp180_attiny2313.c
*
* Created: 2015.10.01 19:09:15
* Author: Saulius Stasys naudojant eXtreme Electronics i2c biblioteka
*/
#define F_CPU 8000000
#include <avr/io.h>
#include "i2csoft.h"
#include "i2csoft.c"
//kalibravimo tikrinimui
int8_t tik=0;
//bmp180 funkcijos kintamieji: tars: temperatura(0) arba slegis(1), oss (matavimo tikslumas+vartojama srove) 0-taupus,1-standartas,2-didele raiska,3- ultra didele raiska
//oss- neturi reiksmes temperaturos matavimui
//temperaturos matavimas 0.1C tikslumu
//slegio matavimas 1Pa tikslumu
uint32_t bmp180( int8_t tars, int8_t oss)
{
//kintamieji
uint8_t s,i,mas[22],duom,duomsks,del;
uint16_t ac1,ac5,ac6,X3,ac4;;
int16_t ac2,ac3,b1,b2,mb,md;
int32_t mc,dtis[5]={},B3,up,ut,X1,X2,B5,B6,T,p;
uint32_t B4,B7;
SoftI2CInit();
//kalibravimas
if (tik==0)
{
for (i=170;i<192;i=i+2) // skaitymas nuo 0xaa iki 0xbf
{
SoftI2CStart();
SoftI2CWriteByte(0xee);
SoftI2CWriteByte(i);
SoftI2CStop();
SoftI2CStart();
SoftI2CWriteByte(0xef);
mas[i-170]=SoftI2CReadByte(1);
mas[i-169]=SoftI2CReadByte(0);
SoftI2CStop();
}
tik=1;
}
ac1=(mas[0]<<8)+mas[1];
ac2=(mas[2]<<8)+mas[3];
ac3=(mas[4]<<8)+mas[5];
ac4=(mas[6]<<8)+mas[7];
ac5=(mas[8]<<8)+mas[9];
ac6=(mas[10]<<8)+mas[11];
b1=(mas[12]<<8)+mas[13];
b2=(mas[14]<<8)+mas[15];
mb=(mas[16]<<8)+mas[17]; //nenaudojamas
mc=(mas[18]<<8)+mas[19];
md=(mas[20]<<8)+mas[21];
//jei matuojama temperatura
if (tars==0)
{
duom=0x2e;
duomsks=2;
del=5;
}
else
{
//jei matuojamas slegis
if (tars==1)
{
//rezoliucijos pasirinkimas
if (oss==0||oss==1||oss==2||oss==3)
{
//laiko intervalai, kurie reikalingi duomenu surinkimui
if (oss==0) del=5;
if (oss==1) del=8;
if (oss==2) del=14;
//ultra dideles rezoliucijos geba 19bitu kitu 16bitu
if (oss==3)
{
del=26;
duomsks=3;
}
else
{
duomsks=2;
}
//registro adresas priklausomai nuo pasirinktos rezoliucijos
duom=0x34+(oss<<6);
}
else
{
//jei rezoliucijos skaicius parinktas lempinis, nustatom taupu rezima
oss=0;
}
}
else
{
//pirmumas temperaturai :D
tars=0;
}
}
SoftI2CStart();
SoftI2CWriteByte(0xee);
SoftI2CWriteByte(0xf4);
SoftI2CWriteByte(duom);
for (i=0;i<del;++i)
{
_delay_ms(1);
}
SoftI2CStop();
SoftI2CStart();
SoftI2CWriteByte(0xee);
SoftI2CWriteByte(0xf6);
SoftI2CStop();
SoftI2CStart();
SoftI2CWriteByte(0xef);
//duomeu surasymas i masyva
for (i=0;i<duomsks;i++)
{
if(i==duomsks-1)
{
s=0;
}
else
{
s=1;
}
dtis[i]=SoftI2CReadByte(s);
}
SoftI2CStop();
//jei matuojam temperatura
if (tars==0)
{
//pradines temperaturos sudarymas
ut=(dtis[0]<<8)+dtis[1];
X1=(ut-ac6)*ac5>>15;
X2=(mc<<11)/(X1+md);
B5=X1+X2;
dtis[3]=B5;
T=(B5+8)>>4;
// grazinam temperaturos reiksme 0.1C tikslumu
return T;
}
else
{ //matuojam slegi
if (tars==1)
{
//pradines slegio reiksmes sudarymas
up=((dtis[0]<<16)+(dtis[1]<<8)+dtis[2])>>(8-oss);
//up= 43984; //testavimui up=43984, oss=0
//dtis[3]=2968; //testavimui dtis ==2968
B6=dtis[3]-4000; //-1032
X1=((b2*(B6*B6)>>12))>>11; //6
X2=(ac2*B6)>>11; //608
X3=X1+X2; //614
B3=((((ac1*4L)+X3)<<oss)+2)/4; //9156, jei oss=0
X1=(ac3*B6)>>13; //1836
X2=(((B6*B6)>>12)*b1)>>16; //25
X3=((X1+X2)+2)>>2; //465
B4=ac4*(unsigned long)(X3+32768)>>15; //34647
B7=((unsigned long)up-B3)*(50000>>oss); //1741400000
if (B7<2147483648)
{
p=(B7*2)/B4; //100522
}
else
{
p=(B7/B4)*2;
}
X1=(p>>8)*(p>>8); //153664
X1=(X1*3038)>>16; //7123
X2=(p*-7357)/65536; //-11284
p=((X1+X2+3791)>>4)+p; //100498Pa
// grazinam slegi paskaliai
return p;
}
else
{
//jei pasirinkta nei temperatura nei slegis
return 0;
}
}
// jei vel nieko
return 0;
}
int main(void)
{
//cia seip lempa testavimui su atmega8 generuoja isejime 2-aini koda temperaturos- tiesiogiai, o slegio paspaudus mygtuka(PB0) 2 kartus ismirksint koda:
//pirmoji dalis apskaiciuojama gauta rezultata is pirmojo mirktelejimo * 1000ir pridedame antrojo mirktelejimo rezultata *4
uint32_t t,p,c;
DDRD=255;
DDRB=0<<DDB0;
while(1)
{
if (PINB&(1<<DDB0))
{
p=bmp180(1,3);
t=p/1000;
PORTD=t;
_delay_ms(250);
c=p-(t*1000);
c=c/4;
PORTD=c;
_delay_ms(500);
PORTD=0;
_delay_ms(500);
}
else
{
PORTD=bmp180(0,0);
}
}
} |
|
|
|
|
|
|
 |
 |
integer overflow in expression |
Parašytas: 2015 10 08, 21:03 |
|
|
|
|
Galiu duoti porą naudingų patarimų:
1. Mokykis rašyti struktūruotą kodą, kad "vos užmetus akį", jau būtų aišku ką ta programos dalis daro, visas "rutinines/technines" operacijas sukeldamas į paprogrames:
| Kodas: |
jutiklio_inicializacija();
temperaturos_nuskaitymas();
slegio_nuskaitymas();
mygtukų_apklausa();
ir t.t.
|
2. Kintamuosius ir paprogrames vadink prasmingais vardais (o ne a1, s54, bebe412 ), kad nekiltų klausimų kas ką reiškia ar kokias funkcijas atlieka. O jei pasirenki daugiaprasmį pavadinimą, tokį kaip "tars" (temperatūra ar slėgis?), tai apdorok jį ne su "if()", bet su "switch()":
| Kodas: |
switch(tars)
{
case temperature:
...
break;
case pressure:
...
break;
default: // nei slėgis, nei temperatūra
...
} |
Gal dabar, kai beveik "gyveni" savo kode, viskas yra aišku, bet praeis pusmetis ar keleri metai, tikrai nieko nesusigaudysi toje "mišrainėje" ir teks vėl viską iš esmės aiškintis, jei nuspręsi kodą kažkur kitur panaudoti. |
|
|
|
|
|
 |
|
 |
Google paieška forume |
|
|
 |
Naujos temos forume |
|
 |
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
 |
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
 |
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
 |
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
 |
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
 |
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
 |
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
 |
RDR2 Mods
Euro Truck Simulator 2 Mods,
WOT Mods,
RDR2 Maps |
|