Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Zmiana zmiennej Word na Byte po obliczeniach????

Awatar użytkownika
XAX
-
-
Posty: 48
Rejestracja: 4 kwie 2003, o 06:11
Lokalizacja: Krakow

Zmiana zmiennej Word na Byte po obliczeniach????

Postautor: XAX » 2 wrz 2008, o 23:25

Witam

Mam pytanie jak zmienić zmienną Word po obliczeniach na zmienną Byte?
Program ma służyć do pomiarów napięcia pakietów modelarskich NiMH składających się od 5 do 12 cel.
Ma pobierać dane z przetwornika CA przeliczać tą wartość na jedną cele.
Tą wartość mam przeliczyć i zmienić na zmienną typu Byte aby uzyskać wartość napięcia jednej celi w formie kutra umożliwi jej zapis w tablicy. Przykładowo 1,2V ma przyjąć wartość 120.

Program jest taki ale kompilator wyrzuca błąd 30 (3 parameters expected) w ostatniej linii obliczeń.

Kod: Zaznacz cały

Dim Cele As Byte 'ilość cel w pakiecie Dim Vac As Word 'dane z przetwornika CA Dim Vceli As Byte 'napięcie i celi Cele = 6 '6 cel w pakiecie NiMH Vac = 369 'CA = napięcie na pakiecie 7,2V (6cel NiMH) Vac = Vac \ Cele 'wartosć na 1 celi pakietu Vceli = Vac \ 1 , 9672 'napięcie na 1 celi Vceli=120 (120=1,2V) End 'end program

Bascom Demo 1.11.9.0

Awatar użytkownika
Press
-
-
Posty: 389
Rejestracja: 10 mar 2004, o 16:21
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: Press » 3 wrz 2008, o 07:25

w linii
Vceli = Vac \ 1 , 9672
zamiast przecinka jako symbolu dziesiętnego użyj kropki. Przecinek rozdziela parametry wiec kompilator nie wie jak wykonać taki zapis jak podałeś. Po wstawieniu kropki kompiluje się.

Pozdro

Awatar użytkownika
XAX
-
-
Posty: 48
Rejestracja: 4 kwie 2003, o 06:11
Lokalizacja: Krakow

Postautor: XAX » 3 wrz 2008, o 07:49

Niestey dale się nie kompiluje u mnie :615:

Z kropka jest ten sam błąd :632:

tg3a
-
-
Posty: 243
Rejestracja: 26 maja 2008, o 19:46
Lokalizacja: Warszawa

Postautor: tg3a » 3 wrz 2008, o 09:50

Przepraszam, że się wtrącę, zwłaszcza, że języka Bascom nie znam, ale wydaje się, że błąd może polegać na użyciu spacji separujących początkowo niepoprawny przecinek, a później już kropkę dziesiętną od części całkowitej i ułamkowej wartości dzielnika. Czyli zamiast:
Vac \ 1 . 9672
trzeba napisać co najmniej
Vac \ 1.9672
a właściwie nawet
Vac / 1.9672
bo prawdopodobnie przy użyciu operatora dzielenia całkowitego "\" kompilator liczbę 1.9672 zamieniłby najpierw na liczbę całkowitą 1 (względnie 2), i Vac kazałby programowi wynikowemu dzielić przez taką wartość, a przecież z pewnością nie o to chodzi.
Pozdrawiam

Awatar użytkownika
XAX
-
-
Posty: 48
Rejestracja: 4 kwie 2003, o 06:11
Lokalizacja: Krakow

Postautor: XAX » 3 wrz 2008, o 21:22

Już jest lepiej ale nie dokońca.
Program wyglada tak:

Kod: Zaznacz cały

Dim Cele As Byte 'ilość cel w pakiecie Dim Vac As Word 'dane z przetwornika CA Dim Vceli As Byte 'napięcie i celi Cele = 6 '6 cel w pakiecie NiMH Vac = 369 'CA = napięcie na pakiecie 7,2V (6cel NiMH) Vceli = 0 Vac = Vac \ Cele 'wartosć na 1 celi pakietu Vceli = Vac * 1.9673 'napięcie na 1 celi Vceli=120 (120=1,2V) End 'end program
Błąd jeszcze był jeden polegał na tym że w ostatnich obliczeniach zamiast "*" było dzielenie.
Ale problem dalej istnieje następujący.
Podczas mnożenia Vceli = Vac * 1.9672 następuje zaokrąglenie liczby 1.9673 do 2 co daje wynik 122 zamiast 120
Teoretycznie mogę sobie to już podarować ale jestem ciekawy jak to ominąć aby było dobrze.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 3 wrz 2008, o 22:05

Operować na zmiennych zmiennoprzecinkowych, a dopiero ostateczny wynik zrzutować (przekonwertować) na wymagany typ zmiennej. Obecnie kompilator probuje dostosować typy zmiennych (i stałą) do jednego rodzaju (ew. możesz sprobować zamienić kolejność czynników - ale czy to w Bascomie przyniesie efekt??).

Awatar użytkownika
XAX
-
-
Posty: 48
Rejestracja: 4 kwie 2003, o 06:11
Lokalizacja: Krakow

Postautor: XAX » 3 wrz 2008, o 23:10

No to trzeba zrobić chyba tak:

Kod: Zaznacz cały

Dim Cele As Byte 'ilość cel w pakiecie Dim Vac As Word 'dane z przetwornika CA Dim X As Single Dim Vceli As Byte 'napięcie i celi Cele = 6 '6 cel w pakiecie NiMH Vac = 369 'CA = napięcie na pakiecie 7,2V (6cel NiMH) Vceli = 0 X = 0 Vac = Vac \ Cele 'wartosć na 1 celi pakietu X = Vac * 1.9673 'napięcie na 1 celi Vceli=120 (120=1,2V) Vceli = X End 'end program
Szkoda tylko tej zmiennej. Ale jak trzeba to traba no chyba ze ktos ma inny pomysł.

Awatar użytkownika
piotr_go
-
-
Posty: 159
Rejestracja: 27 sie 2004, o 12:18
Lokalizacja: far far away

Postautor: piotr_go » 4 wrz 2008, o 08:44

dajesz większe zmienne i mnożysz * 19673 a potem dzielisz przez 10000 :)

to dzielenie przez liczbę cel daj na końcu albo podziel w tym poprzednim od razu przez 60000, będzie większa dokładność

Kod: Zaznacz cały

Dim Cele As Byte 'ilość cel w pakiecie Dim Vac As Word 'dane z przetwornika CA Dim Vceli As DWORD 'napięcie i celi Cele = 6 '6 cel w pakiecie NiMH Vac = 369 'CA = napięcie na pakiecie 7,2V (6cel NiMH) Vceli = Vac * 19672 'napięcie na 6 celi Vceli=120 (120=1,2V) Vceli = Vceli \ (10000 * Cele) 'wartosć na 1 celi pakietu End 'end program
coś w tym stylu
nie wiem tylko czy zapis poprawny bo w bascomie rzaaaadko programuje


wpadłem na jeszcze jeden pomysł który by znacznie przyspieszył/uprościł działanie programu
pomnóż przez taką liczbę(21487 jeżeli się nie mylę) dzięki której wymagany by był podział przez 65536 czyli 16to bitowe przesunięcie :)

Awatar użytkownika
XAX
-
-
Posty: 48
Rejestracja: 4 kwie 2003, o 06:11
Lokalizacja: Krakow

Postautor: XAX » 4 wrz 2008, o 20:51

:arrow: piotr_go

Jest jeden mały szkopuł w twoim pomyśle.
Jeżeli przetwornik CA przyjmie wartość 1024 to przy twoim mnożeniu przez 19672 przekroczy zakres zmiennej WORD. Można by wszakże zastosować zmienną LONG ale ona spowalnia prace i zżera dużo cennej pamięci a rockiem ma być Tiny13V

Dodano po 23 min
Przemyślałem sprawę jeszcze raz i natchniony pomysłem piotr_go napisałem programik na nowo :617:

Kod: Zaznacz cały

Dim Cele As Byte 'ilość cel w pakiecie Dim Vac As Word 'dane z przetwornika CA Dim Vceli As Byte 'napięcie i celi Cele = 6 '6 cel w pakiecie NiMH Vac = 369 'CA = napięcie na pakiecie 7,2V (6cel NiMH Vceli = 0 Vac = Vac / Cele 'wartosć na 1 celi pakietu (61) Vac = Vac * 197 Vac = Vac / 100 'napięcie na 1 celi Vceli=120 (120=1,2V) Vceli = Vac End 'end program
Wygląda że teraz jest prosto, szybko i poprawnie. Dokładność obliczeń dla mnie jest wystarczająca.

Edited by Pajączek - scalenie postów.

Dla XAX'a z dedykacja... Piasek - Pogodniej (Złoty środek).
Ostatnio zmieniony 4 wrz 2008, o 21:37 przez XAX, łącznie zmieniany 1 raz.

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 39 gości