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 2025 10 09, 03:19. Visos datos yra GMT + 2 valandos.
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
Tai va iškilo tokia problema bandžiau ją spręsti įvairai, tačiau greičiausiai kažko nemoku. Taigi bėda iškyla su AVR studio 6 rašant tokia eilutę:
Kodas:
long X1,X2,X3,B3,B6,p;
unsigned long B4, B7;
tp[5]=2968;//(testavimui į masyva įsirašyta reikšmė
B6=tp[5]-4000;
X1=(b2*(B6*B6/4096))/2048;
X2=ac2*B6/2048;
X3=X1+X2;
[b]B3=9002*4;[/b] //bėda šioje eilutėje
Ją sprendžiau įvairai tai rašiau
Kodas:
(long)9002*4
,tai
Kodas:
9002L*4
ir kaip sakant viskas bergždžiai. Jei dauginu is 2 ar 3 viskas ok, bet suketvertu niekas nesigauna. Ir visada gaunu integer overflow in expression pranešimą
Kažkas su AVR Studio negerai (gal laikas atnaujinti?) Su mano naudojamu kompiliatorium (avr8-gnu-toolchain-3.4.5.1522) abu šie variantai veikia be priekaištų:
Taigi viena bėda išsisprendė ir iškilo nauja, o naujoji tokia jei vietoje 9002 įrašau kintamąjį, kuriam ši reikšmė priskirta niekaip egaunu tinkamo atsakymo kaži kodel?
Taigi viena bėda išsisprendė ir iškilo nauja, o naujoji tokia jei vietoje 9002 įrašau kintamąjį, kuriam ši reikšmė priskirta niekaip egaunu tinkamo atsakymo kaži kodel?
Gal vel blogai aprasei kintamaji? Be kodo cia nieks nieko nepasakys.
/*
* bmp180_attiny2313.c
*
* Created: 2015.10.01 19:09:15
* Author: Saulius Stasys + eXtreme Electronics i2c librarry
*/
#define F_CPU 8000000
#include <avr/io.h>
#include <math.h>
#include "i2csoft.h"
#include "i2csoft.c"
long tempsleg(char kal,char torp) //pries tai klaida buvo cia, vietoj long buvau irases short
{
char i;
int mas[24];
//kalibravimo bitų nuskaitymas ir įrašymas į masyvą
//read calibration bits and their write to array
if (kal==0)
{
for (i=170;i<192;i++) // skaitymas nuo 0xaa iki 0xbf, readig from 0xaa to 0xbf
{
SoftI2CInit();
SoftI2CStart();
SoftI2CWriteByte(0xee);
SoftI2CWriteByte(i);
//bitų konvertavimas į konstatas, bits conversion to constants
signed short ac1,ac2,ac3,b1,b2,mb,mc,md;
unsigned short ac4,ac5,ac6;
ac1=(mas[0]*256)+mas[1];
ac2=(mas[2]*256)+mas[3];
ac3=(mas[4]*256)+mas[5];
ac4=(mas[6]*256)+mas[7];
ac5=(mas[8]*256)+mas[9];
ac6=(mas[10]*256)+mas[11];
b1=(mas[12]*256)+mas[13];
b2=(mas[14]*256)+mas[15];
mb=(mas[16]*256)+mas[17]; //niekur nepasinaudos :D, not using :D
mc=(mas[18]*256)+mas[19];
md=(mas[20]*256)+mas[21];
long tp[8],ut,up;
if (torp==1)
{
//cia viskas ok
/*//temperatūros nuskaitymas, read temperature
SoftI2CStart();
SoftI2CWriteByte(0xee);
SoftI2CWriteByte(0xf4);
SoftI2CWriteByte(0x2e);
//_delay_loop_2(4.5);
tp[5]=2968; //testavimui irasyta masyvo reiksme
B6=tp[5]-4000;
X1=(b2*(B6*B6/4096))/2048;
X2=ac2*B6/2048;
X3=X1+X2; //iki cia viskas ok
B3=(long)ac1*4; // vietoj ac1 irasius 9002 viskas ok visa skaiciavimo formulė (ac1*4+X3+2)/4 šios eilutes rezultatas turetu gautis 9156
int mas[24];
...
signed short ac1,ac2,ac3,b1,b2,mb,mc,md;
...
ac1=(mas[0]*256)+mas[1];
...
long X1,X2,X3,B3,B6,p;
...
B3=(long)ac1*4;
Tavo mas[0] yra int tipo, kuris yra 2 baitu ilgio. Tu ji padaugini is 256, t.y. perstumi per 8 bitus, todel jis tampa 4 baitu ilgio. Taigi ac1 negali buti short tipo, nes rezultatas i tiek netelpa.
Pradziai sutvarkyk sita.
Paskui tu bandysi priskirti 4 baitu kintamaji perstumta per 2 bitus prie 4 baitu (long) kintamojo B3, kuris velgi - permazas. Uztektu 5 baitu, bet tokio nera, tad turesi naudot ilgesni.
O ir siaip tie dauginimai gal ir teisingai suprantami kompiliatoriaus, bet kodas dazniausiai zymiai lengviau skaitosi, kai darai bitu perstumimus.