Elektronika.lt
 2023 m. spalio 2 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 2023 10 02, 07:00. Visos datos yra GMT + 2 valandos.
 Forumas » Mikrovaldikliai » AVR matematika
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 12
Pereiti prie 1, 2  Toliau
Pradėti naują temą  Atsakyti į pranešimą Rodyti ankstesnį pranešimą :: Rodyti kitą pranešimą 
 AVR matematika
PranešimasParašytas: 2018 11 04, 19:45 Pranešti apie taisyklių pažeidimą Atsakyti su citata
didshirshis
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Sveiki,

norėjau paklaust. Tarkim turim parašę:

Kodas:

unsigned int skaicius


tuomet šis skaičius kaip suprantu gali būti 0-65535. O kaip tada matematinių veiksmų sąlygomis jeigu kažkurioje skaičiavimo dalyje jis perkopia šias reikšmes, pvz:

Kodas:
define F_CPU 16000000
unsigned int x;
x=1000;

skaicius= F_CPU/(100*x)


apskaičiavus "skaičių" gaunasi 160, t.y. 16000000/100*1000. Taigi 160 kaip ir telpa į "skaičiaus" unsigned int rėmus, nes mažesnis už 65535.

Bet kaip yra pačio skaičiavimo metu AVR? Kaip vyksta skaičiavimas? "skaičius" iš pradžių pasiima 16000000, paskui dalina iš 100, o paskui iš 1000. Ar iš pradžių susidaugina 100*1000, kuomet gauna 100000, kas yra daugiau už unsigned int. Ta prasme skaičiuojant, tam tikrais etapais turim didesnius skaičius negu unsigned int rėmai, nors atsakymas kaip telpa. Ar negali būti taip, kad tuo momentu kuomet skaičius peržengs 65535, jis tiesiog taps 65535 ir skaičiuos toliau?

Kaip čia iš tikro yra?

Ačiū.

_________________
Aš pažeidžiau forumo taisykles ir reklamavau paraše. ...Bet uz reklama tai susimokejau Very Happy
 AVR matematika
PranešimasParašytas: 2018 11 04, 22:07 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Tai kompiliatoriaus reikalas, kaip jis paskaiciuoja konstantas
tokiais atvejais gale skaitmenines konstantos prirasyk L arba UL

#define F_CPU 16000000L
#define F_CPU 16000000UL
#define F_CPU 16000000l
#define F_CPU 16000000ul
unsigned int x;
x=1000; // cia viskas gerai, kadangi 1000 puikiai telpa i unsigned int

skaicius= F_CPU/(100L*x)
skaicius= F_CPU/(100ul*x)

jei operacijoje dalyvauja bezenkliai operandai, prirasyk UL, ul
jei su zenklu - L, l
 AVR matematika
PranešimasParašytas: 2018 11 04, 23:58 Pranešti apie taisyklių pažeidimą Atsakyti su citata
didshirshis
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Tai tie UL arba L tiesiog nusako, kad konkrečiam skaičiavimo veiksme skaičiai yra (unsigned)long?

Kodas:

#define F_CPU 16000000UL
unsigned int skaicius;

skaicius= F_CPU/(100ul*x)


o paskui jau gautas po veiksmo unsigned long perkeliamas į skaičių, kuris šiuo atveju yra unsigned int? Na jeigu gautas rezultatas butu didesnis uz 65535, tai tas pėkėlimas nesigautų teisingas?

_________________
Aš pažeidžiau forumo taisykles ir reklamavau paraše. ...Bet uz reklama tai susimokejau Very Happy
 AVR matematika
PranešimasParašytas: 2018 11 05, 10:37 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Tam ir reikia pazymeti ul, kad neatsirastu zenklas, kai vienas is operandu pasidaro > 32767, t.y. int variante gaunasi -32768 => -1, nes kompiliatorius pagal nutylejima operuoja int tipais.
tas pats gautusi jei vienoje formuleje sumaisytum char, unsigned char
jei skaicius gautusi > 127, tai jis igautu zenkla, pvz:

char n = 128; // cia ivyksta virsmas i -128 arba 0x80

if ( n == 128 ) // butu klaida, nes 128 != -128

if ( n == 0x80 ) // ok, nes 0x80 == -128

kad neivyktu nesusipratimu, reikia naudoti unsigned char
 AVR matematika
PranešimasParašytas: 2018 11 05, 13:37 Pranešti apie taisyklių pažeidimą Atsakyti su citata
didshirshis
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
AlgisL rašo:
Tam ir reikia pazymeti ul, kad neatsirastu zenklas, kai vienas is operandu pasidaro > 32767, t.y. int variante gaunasi -32768 => -1, nes kompiliatorius pagal nutylejima operuoja int tipais.
tas pats gautusi jei vienoje formuleje sumaisytum char, unsigned char
jei skaicius gautusi > 127, tai jis igautu zenkla, pvz:

char n = 128; // cia ivyksta virsmas i -128 arba 0x80

if ( n == 128 ) // butu klaida, nes 128 != -128

if ( n == 0x80 ) // ok, nes 0x80 == -128

kad neivyktu nesusipratimu, reikia naudoti unsigned char


Ačiū Algi. Tai reiškias yra rekomenduojama visur naudoti tuos UL kur pliki skaičiai. Arba UI, jeigu unsigned int?

_________________
Aš pažeidžiau forumo taisykles ir reklamavau paraše. ...Bet uz reklama tai susimokejau Very Happy
 AVR matematika
PranešimasParašytas: 2018 11 05, 14:19 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Taip, ir cia ne AVR kaltas, o toks 8bit (ir ne tik) GCC (ir ne tik) sutartas elgesys.
 AVR matematika
PranešimasParašytas: 2018 11 05, 15:05 Pranešti apie taisyklių pažeidimą Atsakyti su citata
minex
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Algi, bet čia tiesiogiai apibūdinai kaip lygini signed ir unsigned char. Bet kaip būtų jei tarpiniai skaičiavimai viršina ribą, nors galutinis atsakymas jau neturėtų viršyti. Man atrodo autorius ne visai to klausė. pvz jei kintamasis unsigned char, bet skaičiuoji (2000*2)/100. rezultatas 40, telpa į rėmus, bet pirmas veiksmas 2000*2 jau išlenfa iš char rėmų.

įdomumo dėlei pabandiau su gcc ir nxp procu, tai rezultate gavau 40, kaip ir teisingai, vadinasi veiksmus vykdo nepriklausomai nuo kintamojo, kuriam priskiriama galutinė reikšmė.
 AVR matematika
PranešimasParašytas: 2018 11 05, 16:58 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
minex rašo:
Algi, bet čia tiesiogiai apibūdinai kaip lygini signed ir unsigned char. Bet kaip būtų jei tarpiniai skaičiavimai viršina ribą, nors galutinis atsakymas jau neturėtų viršyti. Man atrodo autorius ne visai to klausė. pvz jei kintamasis unsigned char, bet skaičiuoji (2000*2)/100. rezultatas 40, telpa į rėmus, bet pirmas veiksmas 2000*2 jau išlenfa iš char rėmų.

įdomumo dėlei pabandiau su gcc ir nxp procu, tai rezultate gavau 40, kaip ir teisingai, vadinasi veiksmus vykdo nepriklausomai nuo kintamojo, kuriam priskiriama galutinė reikšmė.

iskas ok, kol naudoji konstantas, kurios telpa i int, jokiu prierasu nereikia
char t1 = (2000*2)/100; // ok, gausi 40
char t2 = (20000*2)/1000; // jau gausi -40
char t3 = (20000ul*2)/1000; // vel gausi 40
char t4 = (20000L*2)/1000; // irgi gausi 40
char t5 = (20000L*2)/100; // ne ok, nes vietoje 400 gausi -112
 AVR matematika
PranešimasParašytas: 2018 11 05, 17:02 Pranešti apie taisyklių pažeidimą Atsakyti su citata
didshirshis
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Algis vistiek užvedė ant kelio, štai radau labiau man patinkančius atsakymus:

https://www.avrfreaks.net/forum/ul-define-fcpu-1200000ul

vakare pabandysiu kaip iš tikro gaunasi, kuris variantas gauna teisingą atsakymą:

Kodas:
unsigned long x = 150*1000


ar

Kodas:
unsigned long x = 150UL*1000


bet gal būt gali būti ir:

Kodas:
unsigned long x = 150UL*1000UL
Confused

_________________
Aš pažeidžiau forumo taisykles ir reklamavau paraše. ...Bet uz reklama tai susimokejau Very Happy
 AVR matematika
PranešimasParašytas: 2018 11 05, 17:57 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Kai pirma pagal kalkuliacijos logika konstanta nurodai UL, toliau jis ir dirba su UL, kitaip - su INT16
 AVR matematika
PranešimasParašytas: 2018 11 06, 22:34 Pranešti apie taisyklių pažeidimą Atsakyti su citata
didshirshis
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Pabandžiau su atmega:

skaicius=(100*1000)/100 gaunasi nesamonė

skaicius=(100*1000UL)/100 gaunasi teisingai.

Kaip suprantu nėra svarbu kuriam skaičiui prirašyt UL, t.y. (100*1000UL)/100 ar (100UL*1000)/100?

Ir esant sudėtingesnei formulei būna pasigavę tą pirmąjį UL nustatymą, todėl jeigu sekančiuose skaičiavimuose išlipa iš INT ribų, vistiek gerai skaičiuoja, pvz:

skaicius=(((100*1000UL)/100)*100)/5

_________________
Aš pažeidžiau forumo taisykles ir reklamavau paraše. ...Bet uz reklama tai susimokejau Very Happy
 AVR matematika
PranešimasParašytas: 2018 11 07, 11:04 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Tikrai tai, nes kaip minejau, kompiliatorius pagal nutylejima naudoja INT tikslumo aritmetika konstantos paskaiciavimui, kol nenurodai jam jog tau reikia LONG.
Beje, pasirenkant kintamuju tipa, reikia pasirupinti, kad skaiciavimo rezultatas tilptu i kintamojo tipo remus.
 AVR matematika
PranešimasParašytas: 2019 01 15, 21:15 Pranešti apie taisyklių pažeidimą Atsakyti su citata
didshirshis
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Labą vakarą dar kartą,

gal specai galėtų patart, kame bėdos.

Noriu įjungt ir išjungt kelis atmegos porto bitus tuo pačiu metu, darau pvz:

Kodas:
PORTE|=(1<<0)|(1<<1);
delay;
PORTE&=~(1<<0)|(1<<1);


ir gaunasi blogai, abiejų neišjungia (tiksliau 1 bito), jei padarau atskirai:

Kodas:
PORTE&=~(1<<0);
PORTE&=~(1<<1);


veikia.

Kodėl neveikia šita dalis:


Kodas:
PORTE&=~(1<<0)|(1<<1);


niekaip nesuprantu, nors analogiška įjungianti du bitus veikia. Embarassed

ačiū

_________________
Aš pažeidžiau forumo taisykles ir reklamavau paraše. ...Bet uz reklama tai susimokejau Very Happy
 AVR matematika
PranešimasParašytas: 2019 01 15, 21:19 Pranešti apie taisyklių pažeidimą Atsakyti su citata
didshirshis
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
P.S.

Tas pats būna ir junginėjant įvairius registrus, tarkim nustatančius taimerio darbą. Nors kartais veikia tvarkingai. Buvau nurašęs kaip kompiliatoriaus bugą (Avr studio5), bet su 7 versija vėl taspats..

_________________
Aš pažeidžiau forumo taisykles ir reklamavau paraše. ...Bet uz reklama tai susimokejau Very Happy
 AVR matematika
PranešimasParašytas: 2019 01 16, 04:36 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
PORTE&=~( (1<<0)|(1<<1) );
Pradėti naują temą  Atsakyti į pranešimą Pereiti prie 1, 2  Toliau
 
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

www.matuok.lt - Interneto spartos matavimo sistema

Mokslo festivalis „Erdvėlaivis Žemė

LTV.LT - lietuviškų tinklalapių vitrina

„Konstanta 42“

Technologijos.lt

Buitinė technika ir elektronika internetu žemos kainos – Zuza.lt

Mobizona.lt – telefonų dėklai, apsauginiai stiklai, dalys

PriedaiMobiliems.lt – telefonų priedai ir aksesuarai

„Deinavos baldai“ — šeimos baldai

FS 22 Tractors
Farming Simulator 19 Mods, FS 22 Maps, FS22 Mods
ETS2 Mods
ETS2 Trucks, ETS2 Bus, Euro Truck Simulator 2 Mods
FS22 Tractors
Farming Simulator 22 Mods, FS22 Maps, FS22 Trucks
VAT calculator
VAT number check, What is VAT, How much is VAT
FS22 Mapy
Farming Simulator 19 mody, FS22 Tractor, FS22 Mods
Lastenvaunut
Turvaistuin, Matkarattaat, Lasten vaatteet
Paskola internetu
Vartojimo paskola, paskola automobiliui, paskola būsto remontui
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope
FS22 Mods
FS22 Harvesters, FS22 Tractors Mods, FS22 Maps Mods
Tėvystės gidai
2 mėnesių kūdikis,
6 mėnesių kūdikis,
8 mėnesių kūdikis
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija
Starfield Mods
Installing Starfield Mods,
Starfield Tips,
Starfield Cheats
Reklama
‡ 1999– © Elektronika.lt | Autoriaus teisės | Privatumo politika | Atsakomybės ribojimas | Turinys | Reklama | Kontaktai LTV.LT - lietuviškų tinklalapių vitrina
Script hook v, Openiv, Menyoo
gta5mod.net
Farming Simulator 2019 Mods, FS22 Mods, FS22 Maps
farmingsimulator19mods.fr
Optical filters, UV optics, electro optical crystals
www.eksmaoptics.com
Ilgalaikiai kreditai, paskola už automobilį, kreditų skaičiuoklė
www.mokilizingas.lt
Elektroninių parduotuvių optimizavimas „Google“ paieškos sistemai
www.seospiders.lt
FS22 mods, Farming simulator 22 mods,
FS22 maps

fs22.com
Reklama


Reklama