Elektronika.lt
 2026 m. vasario 6 d. Projektas | Reklama | Žinokite | Klausimai | Prisidėkite | Atsiliepimai | Kontaktai
Paieška portale
EN Facebook RSS

 Kas naujo  Katalogas  Parduotuvės  Forumas  Tinklaraščiai
 Pirmas puslapisSąrašas
 Forumas / + pokalbiai
 - Paieška forume
 - D.U.K. / Forumo taisyklės
 - Narių sąrašas
 - Registruotis
 - Prisijungti

Elektronika.lt portalo forumas

Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo. Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.

Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius, kurie nesilaiko forumo taisyklių. Pastebėjus nusižengimus, prašome pranešti.

Dabar yra 2026 02 06, 06:39. Visos datos yra GMT + 2 valandos.
 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 22
Pereiti prie Atgal  1, 2
Pradėti naują temą  Atsakyti į pranešimą Rodyti ankstesnį pranešimą :: Rodyti kitą pranešimą 
 integer overflow in expression
PranešimasParašytas: 2015 10 08, 18:53 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Saulius18
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Apsilankyti vartotojo tinklapyje
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
PranešimasParašytas: 2015 10 08, 21:03 Pranešti apie taisyklių pažeidimą Atsakyti su citata
gintaras_bar
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
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 Smile ), 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.
Pradėti naują temą  Atsakyti į pranešimą Pereiti prie Atgal  1, 2
 
Forumo sistema: phpBB
 „Google“ paieška forume
 Kas naujesnio?
 Naujos temos forume

Global electronic components distributor – Allicdata Electronics

Electronic component supply – „Eurodis Electronics“

LOKMITA – įvairi matavimo, testavimo, analizės ir litavimo produkcija

Full feature custom PCB prototype service

Technologijos.lt

Mokslo festivalis „Erdvėlaivis Žemė

LTV.LT - lietuviškų tinklalapių vitrina

„Konstanta 42“

„Mokslo sriuba“

www.matuok.lt - Interneto spartos matavimo sistema

Programuotojas Tautvydas – interneto svetainių-sistemų kūrimas

PriedaiMobiliems.lt – telefonų priedai ir aksesuarai

Draugiškas internetas

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
Reklama
‡ 1999– © Elektronika.lt | Autoriaus teisės | Privatumo politika | Atsakomybės ribojimas | Turinys | Reklama | Kontaktai LTV.LT - lietuviškų tinklalapių vitrina
Ets2 mods, Ats mods, Beamng drive mods
allmods.net
„MokslasPlius“ – mokslui skirtų svetainių portalas
www.mokslasplius.lt
Būk saugus
elektroninėje erdvėje

www.esaugumas.lt
LTV.LT – lietuviškų tinklalapių vitrina
www.ltv.lt/technologijos/
Elektroninių parduotuvių optimizavimas „Google“ paieškos sistemai
www.seospiders.lt
Mokslo festivalis „Erdvėlaivis žemė“
www.mokslofestivalis.eu
Reklama


Reklama