Tip varijable za preciznost 0,1

Rasprava o AVR mikrokontrolerima, AVR projekti i drugo vezano za AVR...

Moderators: pedja089, stojke369, trax, InTheStillOfTheNight

STIPA
Penjem se :)
Penjem se :)
Posts: 75
Joined: 22-03-2006, 15:58

Tip varijable za preciznost 0,1

Post by STIPA »

Poštovani,

zanima me da li mi može tko reći kako deklarirati varijablu , čiji se iznos na svaki pritisak tipke povećava za jedan. Naprimjer, pritisnem tipkalo vriejdnst varijable X se poveća sa 10 na 10,1, e sad kako dekalrirati varijablu X, a da se pritom prikazuje samo iznos 10,1, a ne jos mnogo decimala poslije..

Hvala.
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Tip varijable za preciznost 0,1

Post by Maki »

Varijabla koju deklariras trebala bi biti tipa float, a pri ispisu koristit %.1f . Tako je barem u C-u.
User avatar
niho
Pravi forumaš
Pravi forumaš
Posts: 1895
Joined: 24-09-2009, 17:26
Location: Brcko, Bosnia and Herzegovina

Re: Tip varijable za preciznost 0,1

Post by niho »

Može se riješiti i na sledeći način (naravno nije i jedini) tako da:
varijablu povećaš za 0.5 zatim vrijednost množiš sa 10 "odrežeš decimalni dio ( varijabla integer) a potom podijeliš sa 10. Na taj način dobije se vrijednost sa jednom decimalom. Ovo je ako se radi o nekekvom mjerenju. Ipak trebao bi dati više podataka o čemu se zapravo radi i konkretno šta se programira, gdje se vidi vrijednost varijable, na šta utiče itd.
STIPA
Penjem se :)
Penjem se :)
Posts: 75
Joined: 22-03-2006, 15:58

Re: Tip varijable za preciznost 0,1

Post by STIPA »

Radi se o slijedećem:
- program je u BASCOM AVR-u
- čitam stanje tipkpovnice, i pritisak na tipku povećava vrijednsot varijable za 0,1. Npr. Radi se o zadavanju "sati" regulatoru temperature. Zadam sate i konačnu vrijednost temperature, i na osnovu te dvije vrijednosti raguliram temp.
User avatar
niho
Pravi forumaš
Pravi forumaš
Posts: 1895
Joined: 24-09-2009, 17:26
Location: Brcko, Bosnia and Herzegovina

Re: Tip varijable za preciznost 0,1

Post by niho »

To je već jednostavnije. Možete je deklarisati kao "single", i nemojte zaboraviti da odradite "debounce" funkciju za tastere (ne znam koliko imate iskustva u programiranju pošto je to obično sledeće pitanje :) ).
Pozdrav.
STIPA
Penjem se :)
Penjem se :)
Posts: 75
Joined: 22-03-2006, 15:58

Re: Tip varijable za preciznost 0,1

Post by STIPA »

Deklariram ju kao single, i sad npr. iznos varijable bi trebao biti 10.1, a prikaz bude 10.198547...
User avatar
niho
Pravi forumaš
Pravi forumaš
Posts: 1895
Joined: 24-09-2009, 17:26
Location: Brcko, Bosnia and Herzegovina

Re: Tip varijable za preciznost 0,1

Post by niho »

Zašto bi bio ako vrijednost povećavaš tasterom, nisu to nekakve mjerene vrijednosti da treba zaokruživati?! Ne razumijem pa sam definišeš promjenu u npr. if bloku, npr:

Code: Select all

...
dim A as single
A=10
Config Debounce = 20 
Do
Debounce Pind.4 , 0 , promjena , Sub
...
...
loop

promjena:
If pind.4=1 then A=A+0.1
Return
Obično ti treba i drugi taster za smanjenje pa se definiše na sličan način.
Sretno :wink:
STIPA
Penjem se :)
Penjem se :)
Posts: 75
Joined: 22-03-2006, 15:58

Re: Tip varijable za preciznost 0,1

Post by STIPA »

Tako sam i napravio. I sad kad napišem Lcd A, ispiše mi se vrijednost 10.10000379. Potrebno mi je da bude 10.1, jer tu vrijednost dijelim sa razlikom između dvije temperature, A ta vrijednost "A" mi predstavljaju sate koje korisnik unosi preko tipkala.
User avatar
niho
Pravi forumaš
Pravi forumaš
Posts: 1895
Joined: 24-09-2009, 17:26
Location: Brcko, Bosnia and Herzegovina

Re: Tip varijable za preciznost 0,1

Post by niho »

U tom slučaju postupak ide kako sam opisao u ranijim postovima. pomnoži sa 10. uzmi varijablu integer a potom podijeli sa 10 i to bi trebalo da šljaka. Meni je to radilo OK.
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Tip varijable za preciznost 0,1

Post by Maki »

Sa naredbom Config Single = Scientific , Digits = 2 konfiguriraš koliko decimala želiš iza točke. Ovom slučaju 2, maks. broj je 7.
Sad isprobano u BascomAVR-u.
Naravno to se primjenjuje na sve varijable tipa single
User avatar
niho
Pravi forumaš
Pravi forumaš
Posts: 1895
Joined: 24-09-2009, 17:26
Location: Brcko, Bosnia and Herzegovina

Re: Tip varijable za preciznost 0,1

Post by niho »

I što je najbitnije ima ga i u Bascom help-u, samo treba pročitati :oops: :D
Robovanje navikama je jako zeznuta stvar :?
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: Tip varijable za preciznost 0,1

Post by Kukinjos »

Razmisli o računanju u desetinama sati (1,2h = 12), pa možeš koristit cjelobrojnu varijablu, i onda samo kod ispisa stavit točku na pravo mjesto.
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
STIPA
Penjem se :)
Penjem se :)
Posts: 75
Joined: 22-03-2006, 15:58

Re: Tip varijable za preciznost 0,1

Post by STIPA »

niho wrote:U tom slučaju postupak ide kako sam opisao u ranijim postovima. pomnoži sa 10. uzmi varijablu integer a potom podijeli sa 10 i to bi trebalo da šljaka. Meni je to radilo OK.
Hvala na savjetu, probat cu i tako izvesti da se uvjerim da "šljaka".
Maki wrote:Sa naredbom Config Single = Scientific , Digits = 2 konfiguriraš koliko decimala želiš iza točke. Ovom slučaju 2, maks. broj je 7.
Sad isprobano u BascomAVR-u.
Naravno to se primjenjuje na sve varijable tipa single
E, too, to sam tražio, to me zanimalo. Hvala velika.
niho wrote:I što je najbitnije ima ga i u Bascom help-u, samo treba pročitati :oops: :D
Robovanje navikama je jako zeznuta stvar :?
Isprika, znam da sve postoji u helpu, al da se on cita detaljno i pretražuje, foruma ne bi ni postojao za ovakve stvari :)
STIPA
Penjem se :)
Penjem se :)
Posts: 75
Joined: 22-03-2006, 15:58

Re: Tip varijable za preciznost 0,1

Post by STIPA »

Poštovani, radim umjeravanje termometra DS18B20. I sad za to postoji jedan mod, "mod umejeravanje". U tom modu pomoću dva tipkala T1 i T2, vršim kalibraciju senzora, tj. da pokazuje manje ili više...

E sad, programski kod mi daje cijeli i decimalni dio temperature, i to izgleda ovako:

Code: Select all

W = Temp / 10
  B1 = Temp Mod 10
Sad bih ja u petlji prije ispisa temperature provjeravao stanje dva tipkala, i u ovisnosti o njima povećavao/smanjivao decimalni dio (B1) temperature. U toj petlji imam pomoćnu varijablu za cijeli i decimalni dio temperature, onda bi na kraju prilikom ispisa zbrojio i ispisao „novu“ vrijednost temperature.
Izveo sam kod za povećanje iznosa B1 tj. kad je B1>10, B1=0 a W=W+1, a imam problem s smanjenjem, pogotovo kad treba ići korekcija u minus..
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: Tip varijable za preciznost 0,1

Post by Kukinjos »

Ne bih se želio ponavljat, ali zaista razmisli o računanju u desetinama stupnja, dakle ako je temp. 10,3 neka varijabla temperature bude 103. Onda ti nije teško povećavat ili smanjivat vrijednost za 1 ili 10 (0,1 ili 1). Rezulatat za prikaz samo podijeli s 10, a koristiš cjelobrojnu varijablu!
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
User avatar
niho
Pravi forumaš
Pravi forumaš
Posts: 1895
Joined: 24-09-2009, 17:26
Location: Brcko, Bosnia and Herzegovina

Re: Tip varijable za preciznost 0,1

Post by niho »

Poz. kukinjos, to sam mu i ja predložio na početku iako nisam znao za šta mu treba.
Stipa, razmisli i o upotrebi naredbe "fusing" za prikaz na LCD-u. Koristio sam je u svom radu digitalnog panel metra sa Atmega8 a post je objavljen ovdje. Ovdje možeš vidjeti i kako izgleda prikaz, a ako te zanima daću ti i taj dio koda koji služi za prikaz onog što se vidi na displeju. Pozz.
STIPA
Penjem se :)
Penjem se :)
Posts: 75
Joined: 22-03-2006, 15:58

Re: Tip varijable za preciznost 0,1

Post by STIPA »

Evo, ovako sam jednostavno izveo:

Code: Select all

Sub Disp_temp1(cnt As Byte , Offset As Byte)

  Call Meas_to_cel(offset)

 Call Temp_to_decicel

  Gosub Keyboard_sub


If Y = 3 Then           'tipkalo za povećanje
  Incr Temp
  G=G+0.1
End If


If Y = 4 Then                   'tipkalo za smanjenje
   Decr Temp
   G = G - 0.1
End If

 W = Temp / 10
  B1 = Temp Mod 10

Locate 1 , 1
  Lcd " Temp= " ; W ; "." ; B1 ; ; " " ; Chr(3) ; "            "
  Locate 2 , 1
  Lcd " Korekcija= " ; G ; Chr(3) ; "               "
Ali ne šljaka,ne znam što je. Kad sam radio povećanje W i B1 posebno, radilo
STIPA
Penjem se :)
Penjem se :)
Posts: 75
Joined: 22-03-2006, 15:58

Re: Tip varijable za preciznost 0,1

Post by STIPA »

Ne radi ako se direktno želi povećati vriejdnsot varijable "Temp", već se to mora učiniti preko pomoćne. Evo i kako:

Code: Select all

Dim G As Single
Config Single = Scientific , Digits = 1 
Dim F As Integer

If Y = 3 Then                                               'tipkalo za povećanje
  Incr F
  G = G + 0.1
End If


If Y = 4 Then                      'tipkalo za smanjenje

   If G = 0.1 Then
     G = 0
     F = 0


   Elseif G <> 0.0 Then                                    
      Decr F
      G = G - 0.1

   End If
End If

Temp = Temp + F
 W = Temp / 10
  B1 = Temp Mod 10



Locate 1 , 1
  Lcd " Temp= " ; W ; "." ; B1 ; ; " " ; Chr(3) ; "            "
  Locate 2 , 1
  Lcd " Korek= " ; G ; Chr(3) ; " 
Ali mi ne radi slijedeće, tj. ne prikazuje mi se 0 kad je G=0, već neki brij -7.5E-9, ne znam zašto? G mi je iznos korekcije temperature, i njega kasnije spremam u EEPROM
User avatar
niho
Pravi forumaš
Pravi forumaš
Posts: 1895
Joined: 24-09-2009, 17:26
Location: Brcko, Bosnia and Herzegovina

Re: Tip varijable za preciznost 0,1

Post by niho »

Ovo je dio koda pa je teško pratiti sva zbivanja (ne znam šta ti je cnt). Prva greška je u upotrebi incr ona povećava vrijednost za 1. Šta ti radi ova sledeća linija G= G+0.1
Za ispis na lcd koristi naredbu, kako sam već rekao Lcd fusing, sintaksa bi bila sledeća:
umjesto:

Code: Select all

Lcd " Temp= " ; W ; "." ; B1 ; ; " " ; Chr(3) ; "            "
ubaci:

Code: Select all

Lcd Fusing(W , "##.#") ; " C"
Taster kao ulaznu vrijednost bih koristio na sledeći način:

Code: Select all

Config Debounce = 20
Debounce Pind.0 , 0 , Up , Sub ' taster je na pind.0, kada je pritisnut (na logičkoj 0) idi na proceduru Up
...
Up:
incr Temp
Return
Nadam se da ćeš se snaći. Poz.
STIPA
Penjem se :)
Penjem se :)
Posts: 75
Joined: 22-03-2006, 15:58

Re: Tip varijable za preciznost 0,1

Post by STIPA »

Recimo samo ovako, imamo varijablu N koja se povećava/smanjuje na pritisak tipkala spojenih na pinove npr. d.0 i d.1.

I sad imamo

Debounce Pind.0 , 0 , Up , Sub
...
Up:
incr n
Return

i tako imamo i za taster priključen na pin d.1.
N dekalriram kao integer, i imam slijedeće.
kad mi je N=0, i pritisnem taster za smanjivanje, N mi iznosi 255 ????????, a treba mi -1
Post Reply