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
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...
Wszstko dlatego, iż zmienne typu Single są nieco odmiennie zapamiętywane w pamięci i mają wyjątki (np. NaN, QNaN, SNaN) które nie są liczbami, i każda operacja arytmetyczna z nimi powinna wywołać błąd operacji i jego zgłoszenie - a tego Bascom niestety nie obsługuje (jak i spora ilość innych kompilatorów). Operacja z jawną zamianą znaku jest bezpieczniejsza...
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....
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....
Zajrzałem do skompilowanego pliku i widzę że kompilator w ogóle nie używa tu R2 i R3 więc mi je zostawił ;) Od pewnego czasu w Bascom do rejestrów można się odwoływać prosto z kodu. Ciekawe którą wersję Bascom masz. Pewnie znowu schody... U mnie program się kompiluje na 96% [syntax=vbnet] $regfile = "attiny13.dat" $crystal = 9600000 $hwstack = 16 $swstack...
(...) osobnym PinX i oczekuj na stan niski ADCx2 aż do spełnienia tego warunku. Jeśli na ADCx2 napięcia równe 0 mrugnij diodą Led1 jeden raz przez 300ms, wyłącz Przekaźnik1 na PinX Po czym wróć do góry procedury, do oczekiwania na napięcie na ADCx1 To właściwie tyle. Dziękuję za uwagę i wszelaką pomoc. Witam serdecznie na forum! Chętnie pomogę Ci przygotować...
Człowieku! Po co ci zmienne typu Single do liczenia kroków! Zastosuj Long jak już chcesz mieć zmienne 4 bajtowe.
Potestuj bo tak na szybko przy poobiedniej kawie klapałem jedną ręką :D Może coś przeoczyłem i trzeba prześledzić. Te złożone operacje w jednej linii dla stałych Bascom robi bez problemu. Osobiście bym tego tak nie napisał. Nie wiem po co to ciągle obliczać jak można raz... [syntax=vbnet]$regfile = "m328pdef.dat" $crystal = 16000000 $hwstack = 64 $swstack...
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ć.
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...
(at)ElektrodaBot Tak kiedy już ustaliliśmy konwencję to chciałbym żebyś to zrobił za mnie. Poniższy kod zamień na język Basic i ładnie wstaw na Elektrodzie w Syntax Basic Bascom. Możesz to dla mnie zrobić? :D [syntax=c]/* Device register map */ /** (at)defgroup VL53L0X_DefineRegisters_group Define Registers * (at)brief List of all the defined registers...
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_...
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
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...
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...
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...
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
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...
Myślę, że jest to naturalne. Zmienna typu Long zajmuje 4 bajty a Integer tylko 2. Nie da się ciężarówki zaparkować w garażu dla malucha. W helpie jest informacja, że można dokonywać konwersji typów. Oto fragment: Dim I As Integer, S As Single S = 100.1 'przypisujemy liczbę zmiennoprzecinkową I = S 'ta instrukcja zmieni liczbę typu single na Integer...
Można też zdefinować zmienna np tak: Zmienna As Single At &H80 i podstawić LDS r27, {b1} LDS r28, {b2} LDS r29, {b3} STS $80, r27 STS $81, r28 STS $82, r29
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...
Jest to kod z Pana Wiązani być może nieudolnie przerobiony. Oryginał ma tak: Dim licz_8ms As Byte Incr Licz_8ms If Licz_8ms = 125 Then ............. I to działa, czyli ja nie mogę używać liczby stałoprzecinkowej . No dokładnie. To działa tylko dla Byte (i podobnych). Chociaż typ danych Single mówi, iz może przyjmować wartości stało i zmiennoprzcinkowe....
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...
Nie widziałem wcześniej, że już na to wpadłaś. Twój się kalibrował tylko w jedną stronę a ten powinien w obydwie (ale nie testowałem) ;) [syntax=vbnet]$regfile = "attiny13.dat" $crystal = 9600000 $hwstack = 2 $swstack = 0 $framesize = 22 Config Adc = Single , Prescaler = Auto , Reference = Avcc Dim Mem_adc As Word , New_adc As Word Dim Krok As Byte...
wystarczy nieco przejrzeć helpa bascoma: [syntax=basic4gl]Config Adc = Single , Prescaler = Auto 'Now give power to the chip Start Adc 'With STOP ADC, you can remove the power from the chip 'Stop Adc Dim W As Word , Channel As Byte Channel = 0 'now read A/D value from channel 0 Do W = Getadc(channel) Print "Channel " ; Channel ; " value " ; W Incr Channel...
Do Autora wątku: Proszę. Nie taki diabeł straszny. Nie napisałeś jaki to procesor więc napisałem przykład dla Mega8. Funkcja odczytuje ADC(0-5) z włączony ADLAR czyli tylko osiem bitów. Wynik od 0 do 255. Zapewne działa nawet w symulatorze. To taki podstawowy. Można nie czekać a ustawić przerwanie, ale to pewnie jeszcze nie dla Ciebie :D Wpisz w Google...
Proszę. Gotowe bo jak widzę kilka If`ów do tej samej zmiennej zamiast Select Case i tym podobne kwiatki... [syntax=vbnet]$regfile = "m32def.dat" $crystal = 11059200 $hwstack = 64 $swstack = 16 $framesize = 64 Const Timeout_time = 8 'x500ms Config Submode = New ' config LCD 2X16 Config Lcdpin = Pin , Rs = Porta.2 , E = Porta.3 , Db4 = Porta.4 , Db5 =...
...Czy istnieje jakiś sposób, aby ostateczną zmienną 'Ss' (string) zapisać w zmiennej typu Single (lub innej?) aby umozliwic porównanie jej z tą zapisaną w eepromie? A może ktoś zna inną metodę na rozwiązanie tego problemu? Z Twojej wypowiedzi wynika , że nie wiele masz wspólnego z programowaniem uC - ale mniejsza z tym. Zmienna string jest potrzebna...
Dim Empty As Eram Byte At 0 Dim Tzap1 As Eram Single Dim Ua As Eram Byte Dim Ub As Eram Byte Dim Uc As Eram Byte Dim Ud As Eram Byte Czy to jest wszystko co powinienem zrobić.?. Czy powinienem jeszcze używać dyrektyw typu np $eeprom i $data ?. Czy wręcz odresować bezpośrednio tą pamięć zapis/odczyt?. A powinno być takie proste, ale nie jest, więc w...
To już załatwia bascom - jest ustawione na Auto. co do sedna, sprawdziłem dziś na swoim układzie kanały 0-7 ADC następującym programem: [syntax=basic4gl] $regfile = "m2560def.dat" $crystal = 16000000 Config Adc = Single , Prescaler = Auto , Reference = Avcc Dim Wart_adc1 As Word Dim Wart_adc2 As Word Start Adc 'AVCC bezpośrednio do 5V, AREF w powietrzu,...
Po co się męczyć to tylko kilka linijek w bascomie: Kod archaiczny dla słabeuszy: $regfile = "m128def.dat" $crystal = 8000000 Config Spi = Soft , Din = Pinf.2 , Dout = Portf.0 , Ss = None , Clock = Portf.6 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.2 Config Pinf.6...
Mnożąc zmienną typu WORD przez stałą CONST wychodzi niedokładny wynik. Np: WORD = 200 x CONST = 0.0025 = SINGLE = 0.499999933. Dokładność obliczeń zmiennoprzecinkowych jest kwestią długości (i formy) reprezentacji liczb zmiennoprzecinkowych. Z oczywistych względów w ośmiobitowych procesorach z małą pamięcią reprezentacja FP nie może być zbyt długa...
Znalazlem jakis stary programik.... odczyt 2 kanalów ADC z częstościa 100 razy na sekunde... Analize pozostawiam Tobie...(podpowiem że Help wszystko wyjaśni) Pozdrawiam $regfile = "m8def.dat" $crystal = 11059200 $baud = 19200 Config Adc = Single , Prescaler = Auto , Reference = Off Config Timer1 = Timer , Prescale = 256 On Timer1 Pomiar Enable...
[syntax=basic4gl] $regfile = "m644pdef.dat" $crystal = 16000000 $baud = 9600 $hwstack = 64 $swstack = 64 $framesize = 64 'konfiguracja pinow wyswietlacza LCD; inicjalizacja wyswietlacza Config Lcd = 20 * 4 Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 Cursor Off Noblink Cls Dim Wart_adc...
Opis magistrali 1Wire masz w helpie. Poniżej kod na obsługę dallasa DS18B20. Config 1wire = P1.0 'konfiguracja magistrali 1wire Config Lcd = 16 * 1a 'konfiguracja wyswietlacza Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32 'znak stopnia Dim T1 As Single Dim T2 As Single Dim B1 As Byte , B2 As Byte , R As Byte Dim Tmp As String * 6 Dim Znak As String...
Musisz wiedzieć że ADC Atmegi ma 10Bit czyli w uproszczeniu skalę do 1023 Kiedy jako napięcie odniesienia dla ADC użyjesz napięcia zasilania procesora (AVCC) to dokładność pomiaru wynosi : 5V/1024 czyli -> 5000mV/1024 = 4,88mV na jedna podziałkę ADC. Nie napisałeś jaki masz ACS a wystepują w wersjach 5A, 20A i 30A Zakładając że masz ten najczulszy 5A...
atom1477, przecież o ile jakieś przerwanie w międzyczasie nie zmienia Portd.5 to kod Nie chodzi o to żeby ustawił w końcu, tylko w momencie kiedy piszesz Pind.5 = 1: No ale Portd.5 zamiast Pind.5 byłoby przejrzyściej. W ogóle przejrzyściej było by stosować ten zapis jeszcze zamiast Set Portd.5. Tysiące razy było. Do rejestru port zapisujemy a z rejestru...
Witam Kolego Unreal89. Pracuję pod Bascomem 8051 i nie spotkałem się z funkcją, o której wspominasz. Przejrzałem pliki help'a i tam również nic nie znalazłem. Zainteresowany jestem z jakiego powodu odpada komenda "fusing"? Dla czego pytam? Pozwolę sobie obszerniej skomentować zaprezentowany listing. 1. Termometr DS18B20 przechowuje informacje o temperaturze...
No więc jeśli stosujesz M8 to masz gotowe rozwiązanie powyżej. A... zapomniałem napisać, że potrzebny dzielnik napięcia. Może być przez 2 i jako napięcie odniesienia podać AVCC (o ile AVCC=5V). $crystal = 4000000 $regfile = "m8def.dat" Config Timer1 = Pwm , Pwm = 10 , Prescale = 8 , Compare A Pwm = Clear Down 'Konfiguracja Timera Config Portd...
Witam , wklejam kod jaki udało mi się wypocić. Miało być tak pięknie a wyszło jak zawsze :-( Ten twój kod jest oczywiście błędny. Po pierwsze, jeżeli stosujesz napięcie referencyjne wewnętrzne, to dla AtMega 8 wynosi ono 2.56V. Zatem poziom napięcia mierzonego podanego na dowolny pin ADC nie może przekroczyc tej wartości. Jeżeli jednak ten warunek...
Jak zwykle czasu nie ma, ale nie mogłem się powstrzymać. Nakręciłem pierwszy klip - ahahahaha :D No musiałem się pobawić edytorem. Efekt to półtora minuty magii :D Ahahaha miałem kupę zabawy z tym :D Przy okazji możesz zobaczyć jak się używa wbudowanego symulatora by zadawać wartości ADC ;) Twój pomniejszony kodzik też poniżej, tylko używając poza symulatorem...
Witaj Na razie układ działa prawidłowo i na pewno jest jakaś zwłoka, którą z czasem będę chciał zniwelować o ile będzie to konieczne, teraz chciałbym się skupić nad programem do opóźnienia z którym mam najwięcej problemów, Masz problemy bo cały program masz napisany pod priorytetem obsługi LCD a nie zamierzonego celu. LCD potrzebujesz tylko aby ustawić...
Nie,ma liczyć litry tak jak dystrybutor . Dodano po 2 Nie wiem w jaki sposób dodawac litry do zmiennej po przekroczeniu okreslonej liczby impulsów z przepływomierza to co znalazłem to liczone wszystkie w czasie a tu chyba chodzi o przepełnienie licznika Czas tu nie ma znaczenia! Użyj dowolny timer w charakterze licznika (Counter), i tak jak sugerowano...
Sprawdź miernikiem napięcie podawane z LM35 na ADC. Przepisałem ten kod tak by był przejrzystszy. Przy okazji zaoszczędziłem 8% pamięci. To nieistotne. Istotne natomiast jest to, że teraz widać, że układ wyłączy się jeśli odczyt na ADC będzie w zakresie 250-300. Powyżej lub poniżej tego zakresu krążek będzie świecił. [syntax=vbnet]'Program "elektronicznej...
A próbowałeś zwykłe dodawanie? Tterm1 = Tterm1+Tzap1
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.
Pomyśl trochę nad "sprytem" kodu :D Chodzi mi o to że kiedy widzisz powtarzające się linijki kodu to powinieneś pomyśleć "czym one się różnią" i tylko te różnice napisać osobno a wszystkie powtarzające się sprawy napisać tylko raz. Po co tyle tych Locate 1,1 . Przeciez i tak i tak będziesz tę linijkę rysował od 1,1 zawsze, chyba że inaczej podejdziesz...
Można zadeklarować prawidłowo zmienną eeram W ten sposób Dim Adres_er(size_t_mac) As Eram Byte At Adres_p_mac Poprzez komende AT znam adres, po jaki będzie się odwoływać zmienna eeram w pamięci. Niestety, ale z Eepromem ten numer nie przejdzie , ponieważ Bascom ignoruje etykiety w Eepromie. Deklaruje, jakie wartości powinny być zapisane w eeram...
single bascom bascom double single single bascom przecinku
tania kopiarka filtr polar outlook wysłać
Przesuwanie się obrazu w dół w wideodomofonie Tuya Telewizor Sharp nowej generacji nie włącza się po dłuższym nieużywaniu