 |

|
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 2025 07 29, 02:42. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Mikrovaldikliai » bėda su kintamaisiais
|
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 1 iš 2 Pereiti prie 1, 2 Toliau |
|
 |
bėda su kintamaisiais |
Parašytas: 2007 04 03, 19:39 |
|
|
|
Niekaip nepavyksta išgauti reikiamo dydžio kintamojo.
uC ATmega16, CodeVisionAVR compileris, kodo fragmentas:
int funkcija (int b)
{
long int c;
c = 365.25*100;
sprintf(lcd_buffer,"c=%i", c);
lcd_puts(lcd_buffer);
...
return b;
}
rezultate gaunu c=-29011, nors turėtų būti 36525;
kažkur grybą pjaunu su kintamųjų tipais, bet kur? |
|
|
|
|
 |
 |
bėda su kintamaisiais |
Parašytas: 2007 04 03, 21:42 |
|
|
|
Neveikia
Toks jausmas, kad supranta tik double ir float, kaip 32 bit, o visi kiti tik 16 bit.
Aprašyme sakoma sekančiai:
Type Size (Bits) Range
bit 1 0 , 1
char 8 -128 to 127
unsigned char 8 0 to 255
signed char 8 -128 to 127
int 16 -32768 to 32767
short int 16 -32768 to 32767
unsigned int 16 0 to 65535
signed int 16 -32768 to 32767
long int 32 -2147483648 to 2147483647
unsigned long int 32 0 to 4294967295
signed long int 32 -2147483648 to 2147483647
float 32 ±1.175e-38 to ±3.402e38
double 32 ±1.175e-38 to ±3.402e38
Gal kažkur pačiam kompileriui reikia nurodyti, kad teisingai interpretuotų kintamuosius? |
|
|
|
|
 |
 |
bėda su kintamaisiais |
Parašytas: 2007 04 03, 23:36 |
|
|
|
Domantas rašo: |
Toks jausmas, kad supranta tik double ir float, kaip 32 bit, o visi kiti tik 16 bit.
Gal kažkur pačiam kompileriui reikia nurodyti, kad teisingai interpretuotų kintamuosius? |
Netiesa. long visuose kompiliatoriuose visiems CPU priima 32 bitus be jokių papildomų nustatymų.
Greičiausiai sprintf neteisingai interpretuoja.
Rekomendacijos:
- nenaudok sprintf (asmeninė nuomonė);
- Venk float skaičių mikrokontroleriuose. Beveik visada galima rezultatą gauti naudojant sveikų skaičių aritmetiką. |
|
|
|
|
 |
bėda su kintamaisiais |
Parašytas: 2007 04 04, 00:37 |
|
|
|
float niekas niekur nenaudoja be reikalo.
gaila nera 16+8 bitu float nes kablelis daznai butinas o tikslumas ne.
printf kontroleriuose daznai pusiau neveikianti. siulau perziureti kaip ji atrodo bibliotekoje kitaip daznai kyla problemu kai panaudoji kokia retesne jos funkcija |
|
|
|
|
 |
bėda su kintamaisiais |
Parašytas: 2007 04 04, 11:35 |
|
|
|
Jeigu tik sprintf blogai interpretuotų, tai dar pusė bėdos, bet blogiausiai, kad skaičiavimus neteisingai atlieka. Nesu labai stiprus C, todėl gan ilgai užtrukau, kol pastebėjau problemą. Tada tiesiog paėmiau paprastą programą su įvairių tipų kintamaisiais ir bandžiau išvedinėti į LCD. Gerai gavosi tik su double ir float, o long neveikia. Problema ta, kad reikia operuoti tiek su sveika skaičių dalimi, tiek su esančia po kablelio.
O float tikrai norėtūsi išvengti, nes kombinacijoje su sprintf žiauriai daug kodo suėda jie, bet naudoju DS18B20 daviklį ir standartines bibliotekas. |
|
|
|
|
 |
 |
bėda su kintamaisiais |
Parašytas: 2007 04 04, 11:41 |
|
|
|
jei pasiziureti i tavo programa tai tu jug ten kableli esi padejes !!
o kur kablelis ten butinas float, jokie kiti negali tureti kablelio
jei nori float visdelto nenaudoti, tai iseitis tokia, skaizius padaugink sakykim is 1000 kad kablelio nebeliktu o atsakyma galesi pateikti miliCelcijais
gaila bet tikrai float matematika sueda daug vietos, bet su atmega16 jos tau nepritruks. tai nematau reikalo vargti. |
|
|
|
|
 |
bėda su kintamaisiais |
Parašytas: 2007 04 04, 11:53 |
|
|
|
su sprintf aš tiesiog išvedinėjau didelį skaičių be kablelio ir be jokio veiksmo, bet gal čia ir buvo sprintf problema.
O veiksmas man reikalingas su dideliais skaičiais ir po kablelio, bet rezultate reikalingas sveikas didelis skaičius, kur dalis po kablelio tiesiog atmesta. |
|
|
|
|
 |
bėda su kintamaisiais |
Parašytas: 2007 04 04, 12:00 |
|
|
|
pamegink %ld "L" vietoje %i
kiek zinau i tas pats kas d kas reiskia int o ne long |
|
|
|
|
 |
bėda su kintamaisiais |
Parašytas: 2007 04 04, 18:22 |
|
|
|
Digix rašo: |
pamegink %ld "L" vietoje %i
kiek zinau i tas pats kas d kas reiskia int o ne long |
Ačiū, specifikatorius padėjo ir long int veikia  |
|
|
|
|
 |
bėda su kintamaisiais |
Parašytas: 2007 04 07, 15:52 |
|
|
|
hmm, kam tie visi long ir t.t. įsimininėt juk C turi paprastą komanda (winAVR)
Kodas: |
uint08_t x;
uint16_t x;
uint32_t x;
uint64_t x; |
yra ir paprastiem o ne unsigned`am, tas skaičius reiškia bitų skaičių. |
|
_________________ nepamirškit, klysti žmogiška
privatas - privatiems klausimams
arch linux  |
|
|
|
 |
bėda su kintamaisiais |
Parašytas: 2007 04 08, 16:44 |
|
|
|
hmm, galima paklausit, kaip reikia įkišti char`ą (16 simbolių) į eeprom arba program atmintį, nepamenu ką ten reikia prirašyt... maždaug dabar yra taip:
Kodas: |
unsigned char sm[16]; |
kaip įkelti jį į eeprom`ą arba program atmintį? (kol kas sugalvočiau tik su adresų rašinėjimais ir atskirai po vieną surašyt, bet atsimenu, kad kažkaip sukišti galima iškart visą, kad C kalba pasirūpintu sukišimu, bet nepamenu kaip...). |
|
_________________ nepamirškit, klysti žmogiška
privatas - privatiems klausimams
arch linux  |
|
|
|
 |
bėda su kintamaisiais |
Parašytas: 2007 04 08, 18:29 |
|
|
|
Priekyje prirašyk const, jeigu keli į program memory. Su EEPROM nesusidariau  |
|
|
|
|
 |
bėda su kintamaisiais |
Parašytas: 2007 04 08, 21:09 |
|
|
|
uždėjus const pasidaro read-only konstantų masyvas, deja man toks netinka.  |
|
_________________ nepamirškit, klysti žmogiška
privatas - privatiems klausimams
arch linux  |
|
|
|
 |
bėda su kintamaisiais |
Parašytas: 2007 04 09, 15:29 |
|
|
|
Citata: |
hmm, galima paklausit, kaip reikia įkišti char`ą (16 simbolių) į eeprom arba program atmintį, nepamenu ką ten reikia prirašyt... maždaug dabar yra taip: Kodas:
unsigned char sm[16];
kaip įkelti jį į eeprom`ą arba program atmintį? (kol kas sugalvočiau tik su adresų rašinėjimais ir atskirai po vieną surašyt, bet atsimenu, kad kažkaip sukišti galima iškart visą, kad C kalba pasirūpintu sukišimu, bet nepamenu kaip...). |
Tiesiog prirašyk eeprom:
Kodas: |
eeprom unsigned char sm[16]; |
Tiesa nepamiršk kad jei priskirsi kintamajam pradines reikšmes, programuojant su ponyprogu atskirai turesu irašyti ir eeprom. O šiaip skaitai/rašai kaip paprasta kintamaji |
|
|
|
|
|
 |
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 |
 |
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
 |
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps 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 |
 |
Football Training Kit
Football Training Equipment,
Football Skills,
Football Training |
|

|
 |