Po konwersji część ułamkowa zostaje "utracona". Zmienna przyjmuje wartość jedynie części całkowitej bez zaokrąglenia, czyli: 2,9 (single) po konwersji na integer to 2
Nie możesz mnożyć liczby byte i stałej ułamkowej. W tym przypadku zmienna "Kolor_temp" musi być typu single.
Najprościej to użyć overlay w sram. Single to 4 bajty w pamięci. dim zmienna_single as single dim bajt1 as byte at zmienna_single overlay dim bajt2 as byte at zmienna_single+1 overlay dim bajt3 as byte at zmienna_single+2 overlay dim bajt4 as byte at zmienna_single+3 overlay Potem zapisujesz bajty do eeprom, odczytujesz kiedy chcesz i masz wynik w single.
Kol. _Matik_ określił przyczynę problemu, ja natomiast chciałem zasugerować rozwiązanie. W Bascomie jest instrukcja ROUND(x). Sądzę, że to jest najprostsze wyjście.
Nawet nie tyle nie jest liczbą binarną, co zmienne o typie zmiennopozycyjnym są zapisywane w postaci mantysy i wykładnika. A że mantysa ma skończoną długość to pewnych wartości nie da się dokładnie przechować. Typowo taka zmienna ma 32 bity, stąd można przechowywać 2^32 różnych liczb, jako, że single ma pewnie coś koło +/-10^38 to dostrzegasz problem?
Najwidoczniej Tzap1 ma '-'. Może to pomoże (popatrz na 31 bit): http://en.wikipedia.org/wiki/Single_prec...
No zajrzałem do noty ale nadal zachodzę w głowę dlaczego używasz do tego zaraz tak kosmicznego nieporozumienia jak liczby zmiennoprzecinkowe w Bascomie albo w ogóle na AVR. Najlepiej zawsze od nich uciekać jak tylko się da - a można to często bardzo łatwo zrobić - tą ucieczkę ;) szczególnie w takich prostych przypadkach: masz tam przykładowy wzrór z...
Niestety, inaczej nie sformatujesz single. Zapis zmiennej z przecinkiem jest dość skomplikowany (mantysa, wykładnik) i znalezienie przecinka nie jest prostą sprawą. Jakie działania potrzebujesz wykonać na single? Może nie trzeba jej używać. Wykonałem próbę w symulatorze najpierw single na string za pomocą fusing(), potem z powrotem na single za pomocą...
Zmienna = -Zmienna ?
Widzę, że Kolega został nieco jakby bez pomocy :) Kodów niestety nie posiadam nadających się do analizy. Wszystko jednak dość jasno opisane jest w helpie: https://wiki.mcselec.com/bavr/CONFIG_ADC... Trzeba tylko szukać pod hasłem CONFIG ADCX, bo CONFIG ADC jest dla AtMega.
Moze zmien algorytm tych obliczen. Wydaje mi ze ze jak po "Do" zrobisz od razu: [syntax=basic4gl]For Cykl = 1 To Y Z = ( Cykl * X ) \ Y Prc = ( 100* Cykl ) \ Y Call Oblicz Next Cykl[/syntax] to bedziesz mial co potrzebujesz i to bez uzywania single Nie znam dobrze Bascom, wiec jak nie mozna robic tylu operacji w jednej linii to dodaj zmienna pomocnicza...
Może Frac ?
No bo zmiennej I2_single przypisujesz wartość całkowitą. I2 jest przecież bez części ułamkowej.
Nie używałem nigdy BASCOMa, ale chyba powinno się dać w nim zrobić coś takiego: wynik = round(liczba*100)/100
Źle definiujesz typ zmiennych. Żeby można wykonywać operacje zmiennoprzecinkowe, typ zmiennych powinien być single lub double. Dim Dawka_temp As Single, Dawka As Single
Chyba nie czytałeś ostatnio tego rozdziału z Language Fundamentals. W ten sposób sam sobie robisz kuku... Pomijając to myślę, że jeśli te Twoje zmiennoprzecinkowe masz tylko do dwóch miejsc po przecinku, to dlaczego, po prostu, nie pomnożysz tego x100 a na końcu wyniku nie podzielisz /100? Zapewne wszystko się wykona dużo szybciej niż na tych zmiennoprzecinkowych....
Pomnóż przez 2, zaokrąglij do wartości całkowitych, podziel przez 2, i wyświetl z rozdzielczością do 1 miejsca po przecinku.
Możesz, to zrobić tak: Dim zmienna as single Dim part1 as byte at zmienna overlay Dim part2 as byte at zmienna+1 overlay Dim part3 as byte at zmienna+2 overlay Dim part4 as byte at zmienna+3 overlay Odebrane dane uartem wrzucasz kolejno do zmiennych 'part' w efekcie zapełniając 4bajty zmiennej 'zmienna' typu single.
W symulatorze możesz sprawdzić czy program nie nadpisuje stosu. Komunikat pokazuje się w dolnej części okna symulatora "Frame or software stack overlap", można też sprawdzić w zakładce "uP". Jeżeli nadpisało stos ustawiasz wartości dla stosów na początku programu np.: [syntax=basic4gl]$hwstack = 32 $swstack = 16 $framesize = 32 [/syntax]
Witam!!! Mam problem z dodawaniem zmiennej single a mianowicie Dim test as single test = 0 do locate 1,1 lcd test Debounce Pinc.5 , 0 , A , Sub loop A: test = test + 0.1 i jak nacisnę przycisk raz to zamiast być 0.1 wyświetla 0.09999996 Dlaczego tak się dzieje??
Może można to inaczej rozwiązać, ale jako pierwsze do głowy przychodzi coś takiego: [syntax=vbnet] Dim A As Byte Dim B As Byte Dim C As Single A = 123 B = 255 C = A * 1000 ' c=123000 C = C + B ' c = 123255 C = C / 1000 ' c =123,255 [/syntax] ..tylko przemyśl czy nie lepiej dokonywać obliczeń na tych 123255 i na samym końcu wynik podzielić przez 1000....
Jaki błąd popełniam ze zmiennymi? Taki że zadeklarowałeś je jako Single.
Jaki jest R1, i jak ustawione fuse? Spróbuj zmienić na ADC(5) np. Zmień jeszcze na V as Single.
Long = GetAdc(0) Single = Long * 0.01955 String = Fusing(Single, "##.##") LCD String; "V"
Ale zacząć należy w ogóle od uruchomienia tego a dopiero później optymalizować. Prześledź w symulacji co po kolei dzieje się z wartościami zmiennych. Na moje oko winę za zły wynik ponosi za małą dokładność zmiennych typu Single.
No to pytanie dlaczego w ogóle chciałeś użyć zmiennej Single?
- powyżej 10W: "Pwej= Tak będzie się wyświetlało jeżeli pierwszym bajtem zmiennej String Pwej będzie 0. Zero jest końcem łańcucha (dwie możliwości takiego błędu już podałem stos, albo nadpisanie przez inny łańcuch ;)). Nie piszesz też jaka wersja Bascoma to jest, może w którejś wersji był błąd z funkcją Fusing. Możesz podglądnąć co się dzieje z Pwej...
Tylko stosując arytmetykę stałopozycyjną, czyli rezygnując z typu float single itp.
Witam, Mam pytanie... Jak zamienić zmienną Integer na Single w Bascom AVR?? Pytam, ponieważ muszę użyć funkcji: X = Fusing(ds1 , "#.##") a zmienna ds1 mam typu integer. Pozdrawiam A.
instrukcja wykonuje się, ale nie jest w ogóle brany pod uwagę ten drugi warunek x < 5000... instrukcja wykonuje się jeśli x>500, ale jeśli x jest ponad 5000 to niestety też się wykonuje... nie wiem jak to ugryźć, czytałem w necie że nie tylko ja mam taki problem Dodano po 8 x jest zadeklarowana jako single
hmmm a czytales tą instr progr do bascoma ze stronki mcselec? o ile mnie pamiec nie myli to gdzies w poczatkowych stronach bardzo precyzyjnie ktos opisal tą czynnosc....
Człowieku! Po co ci zmienne typu Single do liczenia kroków! Zastosuj Long jak już chcesz mieć zmienne 4 bajtowe.
Zamiast liczyć coś na floatach (typ Single w BASCOMie) to licz na integerach (tyle że dane trzeba będzie przeskalować w górę aby mieć symulacje części ułamkowej). Od razu co najmniej 1KB mniej ze względu na brak bibliotek do floatów, ze 2 razy mniej kodu na każde wywołanie funkcji, 10 razy szybsze działanie no i mniejsze zużycie RAMu. Program w EEPROMie...
Problem już chyba rozwiązany. Wystarczyło wyrzucić z timera fragmenty obliczeń i wstawić je np. do jakiejś deklaracji/podprogramu. Program teraz wygląda tak i jak na razie wszystko działa i poprawnie się wyświetla: [syntax=basic4gl]'---PROCESOR-----------... $regfile = "m128def.dat" $crystal = 16000000...
musze przyznać, że i tak dostałeś bardzo duże zbliżenie... Do twoich celów najlepszym sposobem i najpewniejszym będzie użycie zaokrąglenia. Pewnie bascom posiada tą funkcję.
Witam, Proszę o podpowiedź jak zapisać zmienną typu single, konkretnie wartość np. 1.23458 do komórek pamięci eeprom. Chodzi o zapis w Bascomie. Jeżeli wpiszę dim zmienna as single zmienna= 1.23458 Writeeeprom zmienna , 1 to przy odczycie Readeeprom zmienna , 1 na lcd ukazuje się 1.234580037
Poczytaj helpa o funkcjach Fusing i Format.
Mam pytanko oto część programu z postu Odczyt = 1wread(2) T = Odczyt - 16 T = T * 10 T = T \ 16 T = T \ 10 Możecie mi powiedzieć dlaczego najpierw mnożycie przez 10 potem dzielicie przez 16 i dalej dzielicie przez 10 ( czyli 10*16/10=16). Nie lepiej tylko podzielić przez 16. I jeszcze jedno pytanie dotyczące liczb ujemnych Ds przedstawia liczby ujemne...
wprowadzasz zmienną temperatura2 as single wyswietlanie: if temparatura<>temperatura2 then temperatura2=temperatura LCD .... end if return
No ale jednak w przypadku, kiedy liczba nie jest niewymierna, no powinna być zmiennoprzecinkowo zapisana dokładnie chyba... Przynajmniej w jakimś zakresie (nie wymagam, żeby 3.1415926535 było konwertowane dokładnie na zmiennoprzecinkową, ale 84.2 to już chyba można...) Rozwiązanie z Config Single działa , i chyba tak zostawię.
witam jak w temacie, czy bascom obsluguje tylko single end'ed czy takze wej roznicowe adc? bo w help nie widze :((( pzdr.
Bascom operuje bezpośrednio na rejestrach. Poczytaj DS co i gdzie trzeba poustawiać, a potem czytaj wynik też prosto z rejestrów. Nie używaj getadc. To polecenie działa tylko w trybie single i o ile wiem wykonuje konwersję zawsze dwa razy zwracając wynik drugiego pomiaru. Wtedy o szybkości max nie ma co mówić.
To sięgnij po" fusing" dla single i "format" dla reszty.
proponuje lekturę pomocy: "Word (two bytes). Words are stored as unsigned sixteen-bit binary numbers ranging in value from 0 to 65535. " ;) użyj single lub double
Stosowanie GETADC jest możliwe w trybie SINGLE przetwornika, a nie FREE.
To zapisz do single pomnóż i przepisz do byte.
Jak w bascomie ze miennej typu single wydobyc liczbe po przecinku i wpisac ja do zmiennej byte ?? Przyklad jest liczba single np 12,34 i teraz chce wpisac to co po przecinku (czyli 34) do zmiennej byte Z gory dzieki za pomoc
Przepływomierz na litr podaje 648 impulsów jak napisać kod bascom żeby zliczał litry litry = impulsy / 648 Litry mają być typu single.
Przy przepisywaniu danych masz jeden błąd, pierwsza dana z linii DATA nie zostanie przepisana do tablicy. Numeracja elementów w tablicy DIM zaczyna się od 1, a numeracja elementów danych pobieranych przez Lookup zaczyna się od 0 :) . W BASCOMIE od wersji 2.0.0.0 można zmienić w jaki sposób będą numerowane elementy w tablicy DIM: A gdybym chciał przechowywać...
Zaokrąglenia single... na LCD. Powiem szczerze ze pomysłów mi już brakło. Spróbuj więc takiej funkcji: CONFIG SINGLE = SCIENTIFIC , DIGITS =1 co obcina zbędne miejsca zmiennej 'single' do jednego miejsca po decimal point. Zamiast 1 może byc dowolna wartośc w zakresie 1 do 7. albo jak wyżej "FUSING". e marcus
No więc zacznijmy. W Twoim programie zmienna typu Single ma wartość początkową zero . Niezależnie od tego czy naciśnięty jest jakiś przycisk to zmienna ta dzielona jest przez 16. Tak więc nawet gdyby przyciskiem została zwiększona o jeden to i tak zostanie podzielona przez 16. Czyli cały czas będzie mniejsza od jeden. Będzie to 0.xxx coś tam Takie 0.1...
Domyślam sie że to jest BASCOM. GetAdc(x) - funkcja wykonuje pomiar na nodze ADCx. Czyli dobrze myślisz. Pozdrawiam Yakuza Edit: Tylko pamiętaj że przetwornik musi pracować w trybie SINGLE.
Długość geograficzna to: 5045.0221,N Szerokość geograficzna to: 01619.7181,E Odwrotnie: szerokość N lub S, długość E lub W. szerokoscstopnie = Mid(dane,14,2) szerokoscminutyisekundy = Mid(dane,16,7) Szerokosc = Val(szerokoscminutyisekundy) Szerokoscminutyisekundy = Szerokoscminutyisekundy / 60 Proszę o pomoc To może tak: szerokoscstopnie...
Nie będę sie rozpisywał: Dim T1 As Single , T2 As Integer ... T1 = -123.50 T2 = T1 'bez części ułamkowej T2 = Round(T1) 'zaokrągli zgodnie z prawami arytmetyki ... Pozdrawiam Piotrek
Witam Czy potrafi któryś z was przekonwertować taki fragment kodu w BASCOM na C (Atmel Studio 6) ? Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc
zapis writeeeprom zmienna , adres odczyt readeeprom zmienna , adres Musisz pamiętać ile bajtów zajmuje zmienna którą zapisujesz i o taką wartość zwiększyć adres przy zapisie / odczycie następnej zmiennej Jeśli zmienne typu Byte , adres zwiększasz o 1 Jeśli zmienne typu Word , adres zwiększasz o 2 Jeśli zmienne typu Integer , adres zwiększasz o 2 Jeśli...
spróbuj tak : Config Adc = Single , Prescaler = Auto Start Adc Dim N0 As Word N0 = Getadc(0) w N0 masz wartość napięcia gdzie 1023 to 5V a 0 to 0V
operacje na single zajmują więcej pamięci ( tracisz cenne miejsce na kod ) . Jeśli w pętli 100 razy wykonasz operacje na zmiennej SINGLE to na pewno będzie to wykonywane znacznie dłużej niż na zmiennej WORD . Dlatego do uśrednienia weź dane w postaci WORD lub LONG ( zmienna Wo czyli wartość odczytana ) , również porównania wartości rób na tych typach...
Problem już rozwiązany dzięki koledze Niveasoft Przy deklaracji etykiety przerwania od ADC należało dodać SAVEALL ponieważ w przerwaniu używam zmiennych typu Single. Reszta szczegółów w helpie.
To może taki kolorowy obrazek z LCD ;) Deklarujesz tablicę czterech bajtów Arr(4) As Byte Na tę tablicę poprzez Overlay nakładasz Single Ładujesz swoje cztery bajty po kolei do tablicy Arr(1) - Arr(4) a wyświetlasz Single. Proste jak świński ogon ;) https://obrazki.elektroda.pl/3578008500_...
Przepraszam , ale te F na końcu to sam tutaj dopisałem , żeby było wiadomo ze to nie Celcjusze :) . Dane odbieram w terminalu . atmega32 ---> ft232rl ---> terminal :) W chwili obecnej dim T1 As single
A zadeklarowałes zminną us jako single tak jak kolega M. S. napisał :?:
Witam! Jak zaokrąglić liczbę typu single (6 miejsc po przecinku) do 1 lub 2 miejsc po przecinku, tak aby to można później wyświetlić na LCD. Jest jakiś inny sposób niż komenda format?
... Może ktoś wie jak to zrobić bez sztucznego sprawdzania i dopisywania końcówek. PL Ja chyba wiem ;) 'dla Frm = 0 , kompiluje Fusing() 'dla Frm = 1 , kompiluje Format() 'teraz mozna porównać "pamięciożerność" Const Frm = 0 Dim A As Single , B As Integer , C As String * 10 A = 1.1625 B = A * 10 #if Frm C = Str(b)...
Nie wystarczy po prostu zadeklarować zmienna jako single ? Z mojego doświadczenia wynika że można i ze to bez problemu działa i że wystarczy polecenie zmienna = wartość żeby zapisać i tak samo odczytać przez proste wskazanie zmiennej - nie ma potrzeby zawracania sobie głowy adresem - to tylko bascom ;)
Uff udalo sie! :) Teoretycznie tak jak myslalem i tak jak pisaliscie ale w bascomie diabel tkwi w szczegolach. Caly dzien szukalem odpowiedniej skladni. Po prostu bascom nie zawsze widzi nazwy rejestrow/bitow tak jak sie one nazywaja. Np mux0=0 czy reset mux0 nie dziala, kompilator zglasza blad, choc piszac set mux0 nie zglasza bledu. Nalezy napisac...
Jeszcze tylko jedno pytanie. Co Ci nie pasuje w tym ... równaniu ? (1* 256 +145)*0.0625 = 25.0625 Podstawą programowania mikrokontrolerów(i nie tylko) jest znajomość arytmetyki i to nie tylko na liczbach dziesiętnych ale również na liczbach binarnych i hexadecymalnych(szesnastkowych). Bez tego, ani rusz kolego :D Przecież taki kod (01000001110010001000000000000000)BIN...
Jest to "poprawne rozwiązanie". Poprawne w cudzysłowie ponieważ jak widzę typ SINGLE w Bascomie to aż mnie coś bierze :) Ten sam program napisany bez użycia typu zmiennoprzecinkowego (wykorzystując tylko typ całkowity) wykona się dużo, dużo... szybciej i zajmie mniej pamięci programu i danych.
Hej! Zobaczcie jak ja to robię, może komuś sie to przyda: 'Powiedzmy ze zmienna Liczba(single) wynosi 22.62555426 Temp = Int(liczba) ' dzieki temu poleceniu odcinam czesc setna czyli ' zmiennej Temp(byte) przypisuje liczbę 22 Liczba = Frac(liczba) ' dzieki temu poleceniu odcinam czesc ' dziesiętną czyli zmiennej Liczba(single) przypisuje ' liczbe 0.62555426...
próbowałem tylko ze to musi być wtedy typu single bo word nie przyjmuje zmiennoprzecinkowej liczby czyli nie da sie pomnoży razy 10 próbowałem tez pozmieniać wszystkie typy na single ale też nie poszło
Witam, Jeśli nie musisz nie korzystaj ze zmiennych typu single, lepiej przeskalować int'a kilka razy (np zamiast 1,232 robisz 1232 a przy wyświetlaniu dodajesz przecinek) operacje na liczbach zmiennoprzecinkowych zjadają spora flash i czasu procesora. Pozdrawiam, Marcin
To akurat można załatwić jedną klauzulą. To wiemy Ty i ja, oraz inni, ale czy wie o tym tomaszdko ? Nie jest takie proste dla początkującego używanie Nosave Bo i skąd ma wiedzieć które rejestry i gdzie je odkładać na stos za pomocą rozkazu PUSH , jak i ściągać je se stosu za pomocą rozkazu POP Tu przykład z Bascoma Single .
Bo w Attiny13 nie ma tego pinu ale podanie w konfiguracji AVCC ustawia ref na napięcie zasilania. Nawet znalazłem program mojego termostatu , o którym już prawie zapomniałem i tam linia konfiguracyjna dla ATTINY13 wyglądała właśnie tak: Config Adc = Single , Prescaler = Auto , Reference = Avcc Wszystko działało więc zakładam, że u Ciebie też powinno...
Jeżeli to ma nic nie robić tylko generować impulsy, to po prostu może użyj Waitms. A jeżeli nie, zmieniaj wartość porównania w zależności od dodatkowej zmiennej. Np: $regfile = "m16def.dat" $crystal = 16000000 Dim A As Word 'Zmienna zwiększana i porównywana. Dim B As Byte 'Zmienna decydująca z jaką wartością będzie porównywana zmienna A. Config...
Dzięki za rozjasnionko czyli 2,56V to max, a co mam zrobic zeby miec do 5V? Wystarczy podłączyc avcc do 5V? a to aref z tym kondensatorkiem zostawić? Config Adc = Single , Prescaler = Auto , Reference = Avcc Pod warunkiem ze reszta odpowiednio filtrowane i zabezpieczone przed ESD i EMC. Na linii AVcc przydalby sie takze maly induktor (cewka); oprocz...
Kod po kompilacji w takiej postaci jak teraz w wersji 2.0.4.0 zajmuje 89%. Zyskasz więcej rezygnując ze zmiennych single. Nie analizuje czy kod jest poprawny.
Przy odczycie takiego czyjnika możesz uzyskać max 99,9 , więc po co zmienna single. Po prostu dla wyniku np 22,5 stC wyliczasz liczbę 225 a później robisz: [syntax=basic4g] calkowite = wyliczonazmienna / 10 dziesietne = wyliczonazmienna mod 10 i pomiędzy wstawiasz kropkę na wyświetlaczu[/syntax]
Masz rację Moja pomyłka Chodziło mi o liczbę 12345, której nie mogę zadeklarować jako BYTE Ten przecinek dorabiam sobie później poleceniem np takim Sds1 = Format(sds1 , " 0.0") Napisałem coś takiego NADAJNIK $crystal = 8000000 $baud = 19200 Cls Cursor Off Config Serialout = Buffered , Size = 6 Enable Interrupts Enable Utxc Dim A As single Dim B(2)...
Czy jest możliwy błąd podłączenia? Tutaj oczywiście zmieniłem na PB.1 Tak, wszystko jest możliwe... Spróbuj ten code: [syntax=basic4gl] 'DS18B20 - ROM reading test from single sensor DS18B20 $regfile = "m8adef.dat" $crystal = 4000000 $hwstack = 80 $swstack = 80 $framesize = 40 Config 1wire = Portb.1 'Config 1wire = Portd.5 Dim N As Byte Dim Dsid1(8)...
Witaj. Poniżej poprawiony program, przy którym kompilator nie melduje błędów. Było ich kilka. Przypomina mi się taka łamigłówka - "Znajdź 10 różnic na 2 rysunkach" :) Tyle nie było. Poprawności wyświetlania na LCD nie sprawdzałem, ale poprawiłem tak, aby był sens w wyświetlanych danych. Jak go podłączysz, to sprawdzisz. $regfile = "m8def.DAT"...
Tłumaczenie pierwszego kodu. W drugim to wiadomo, że brak biblioteki ;) Mogłem się gdzieś machnąć bo pisałem w przerwie pomiędzy innymi zadaniami. Dodałem tam sobie funkcję b w funkcjach mogę deklarować Local`s które nie są później potrzebne w Global`s. [syntax=vbnet]$regfile = "m2560def.dat" '8K SRAM | 4K EEPROM $crystal = 16000000 $hwstack = 256 $swstack...
I tu też by dobrze chodziło, ale działania na zmiennych rzeczywistych (w Bascomie - Single) zajmują bardzo dużo miejsca a prawie zawsze można te obliczenia dokonać na zmiennych całkowitych (np. tak jak w tym przykładzie).
wymieniłem procesor i zamieniłem kolejność kodu z: [syntax=basic4gl] Config Portc = Input DDRC = &B0000000 PORTC = 0 Config Adc = Single , Prescaler = Auto , Reference = Avcc[/syntax] na: [syntax=basic4gl] Config Adc = Single , Prescaler = Auto , Reference = Avcc Config Portc = Input DDRC = &B0000000 PORTC = 0 [/syntax] coś pomogło :) chyba zmiana kodu...
Problem może być ... sprzętowy. Otóż Tiny2313 fabrycznie ma ustawiony zegar na 8MHz i preskaler zegara na podział przez 8 czyli pracuje na 1MHz. Jeśli nie manipulowałeś z Tinką to nie będzie zgodna rzeczywista częstotliwość taktowania uC z zadeklarowaną w programie. Magistrala 1Wire jest bardzo wrażliwa na czas poszczególnych impulsów i nie zniesie...
Siemka! Musisz wziąść pod uwagę fakt, iż zmienna single przechowuje wartości zmiennoprzecinkowe ze skończoną dokładnością i to może być zauważalne przy niektórych operacjach na tego typu zmiennych. Poszukaj w helpie od Bascoma i poczytaj o kodowaniu liczb zmiennoprzecinkowych i wszystko Ci się wyjaśni:) Pozdrawiam!! Widzę że dałeś kod.:) Mi się wydaje...
W BASCOM-ie jest wiecej takich niuansow. Odkrywanie odpowiedzi na takie dziwne pytania jest czasami bardzo denerwujace... W helpie jest cos napisane a w praktyce bywa ze dziala odrobine inaczej albo i calkiem inaczej... Jakis czas temu glowilem sie nad dokladnie tym samym problemem. Wymyslilem jaka jest odpowiedz z czego bylem bardzo dumny :-) Ponizej...
Zmienna typu SINGLE i komenda FUSING.
A co to da? Nic. Nic jeżeli program będzie napisany tak jak teraz, czyli bez użycia przerwań a za to z użyciem waitusów. Co do szybkości działania to ja osobiście ie wierzę że na ATTiny2313 ten sam program działał szybciej. Na ATTiny2313 na pewno był sprawdzany inny program (bez LCD albo bez operacji na liczbach typu Single na przykład).
Jak zwykle zumek zaskakuje pozytywnie :D T1 ma być jako integer a T2 jako single.
Typy się kłaniają, typy danych, jeśli więc zrobisz tak: dim droga as long dim droga1 as single droga1 = droga/12.54 to powinno zadziałać ;) przecież dzielisz nie przez liczbę całkowitą tylko zmiennoprzecinkową, a więc w wyniku też masz dostać zmiennoprzecinkową - dlatego trza wybrać typ single w Bascomie. Ale to z kolei spowoduje ci straszny rozrost...
...Gdy z terminala wysyłam 2 to procek zwraca mi 50 gdy 1 to 49 gdy 3 to 51 itd Pewnie gdyby a była single to by było O.K. "Kłaniają się" typy zmiennych. Kiedy do terminala wpiszesz 2 , to po łączu szeregowym do uC , jest wysyłany kod ASCII cyfry 2 , czyli dziesiętnie 50.Instrukcja print , "przetwarza" owe 50 na ciąg znaków ASCII reprezentujących liczbę...
Po pierwsze nawet jak by Ci się to skompilowało to wynik działania A = 1 / Timer1 prawie zawsze będzie równy 0. Więc późniejsze mnożenie go przez 60 nic nie zmieni. Zrób: A = 60 / Timer1 A ten błąd to jest w linii B = Int(a) ? Jak tak to pewnie Int nie przyjmuje innych parametrów niż typu Single. Po co wyciągać część całkowitą z liczby całkowitej?...
Nawet tak nic się nie dzieje:-) Witam W ostatnim kodzie zmień config adc na single.
Histereza jest zadeklarowana jako Single. Zmień to na Integer bo szkoda miejsca. Po tym ustaw Histereza = 20 i powinno jakoś działać. Temperatura 60st.C to u Ciebie I1 = 600 a przecinek jest dorysowywany funkcją Format. Dlatego różnica stopnia to różnica równa 10 a nie jeden.
Po pierwsze: Używasz wewnętrznej pamięci, więc pamiętaj o żywotności cyklów zapisu/odczytu. Jest zalecenie, aby czynności związane z wewnętrzną pamięcią nie wkładać do pętli. Po drugie: Zainteresuj się zewnętrznymi pamięciami na I2C. To są moje wycinki kodu do regulatora PID: To w nagłówku: $eeprom 'Informacja dla procesora o korzystaniu z pamięci EEPROM...
Bardzo dziękuje! Wczoraj walczyłem z eeprom'em i dlatego został wpis na początku. Przekaźniki same mi pstrykały co ułamek sekundy i przy zapisie, odczycie miałem tylko "-0.0". Poczytam helpa i postaram się zrozumieć jak działa program poprawiony przez Ciebie. Dodano po 6 Tylko jedna sprawa. Zmienna Termostat i Histereza potrzebne są z przecinkiem. Jak...
A sprawdziłeś to w symulacji programowej czy w realu? Ja niedawno miałem problem ze zmiennymi Typu LONG i SINGLE w Bascomie AVR. Nie działało w symulacji programowej (symulowany program się zawieszał jak tylko się dotkneło którejś zmiennej) i myślałem że to kompilator źle kompiluje. Potem jednak zaprogramowałem procesor i wtedy działało. Dodano po 1...
ad. freddie: sugerujesz, żeby nie korzystać z bascom? ad balu: wielkie dzięki!!! zmianiłem jednego single na byte i... 5%!!!! do przodu. Skąd to sie bierze? single to zgodnie z instrukcją 4 bajty, dodałem za todla tesu 4 zmienne typu byte i nie podskoczyło nawet o jeden %? Macie jeszcze jakies propozycje?
Nikt nie jest w stanie mi pomóc? nie wie wiem dla czego kontroler nie porównuje wartości Rozumiem że jesteś początkujący , ale nawet Ty powinieneś wiedzieć , że nie porównuje się zmiennej binarnej(Us) ze stringiem (Tmp) :( To tak , jak byś porównywał kilogram z czerwonym :D Poza tym , ten program jest niezwykle pamięciożerny(Fusing,Single). Jeśli ten...
"single"-zajmuje cztery bajty - a Ty wykorzystujesz jeden. Więc nie single a byte-chyba że naprawdę trzeba. Dla pcf8574 można ustawić 8 adresów sprzętowo-jak mię pamięć nie myli-ściągnij datasheet. A0-A3 do + lub gnd.(to adresy) Jest jeszcze pcf8574A-jeszcze 8 adresów. Urządzenie peryferyjne-to nie jak ja to rozumiem-tylko jak jest. Peryferia w procesorze-przetworniki...
bascom single bascom double single single bascom przecinku
czarne paski bokach astra ciśnienie wtrysku wirnik prądnicy magnesami
warszawa internet vectra opinie
Podłączenie masy do akumulatora w pojazdach: zasady i zalecenia Stacja multimedialna Android PX5 - samoczynne włączanie i blokowanie