Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[BASCOM] Miernik do zasilacza

Matizz 25 Gru 2007 21:45 4240 19
  • #1 25 Gru 2007 21:45
    Matizz
    Poziom 18  

    Witam

    Popełniłem ostatnio źródło prądowe do testowania zasilaczy. Wszystko chodzi fajnie, ale jak wiadomo apetyt rośnie w miarę jedzenia, więc pomyślałem że przydał by mi się do tego jakiś fajny miernik LCD żeby nie przełączać cały czas miernika uniwersalnego.

    W pisaniu programów jestem nowicjuszem- umiem napisać program który gasi i zapala led, a największe co zrobiłem to program so sterowania silnikiem krokowym.

    Założenia:
    wyświetlanie:
    napięcie wejściowe,
    prąd obciążenia,
    moc,
    rezystancje źródła
    napięcie minimalne poniżej którego źródło się wyłączy,
    (potem planuje dodać jeszcze pomiar temp radiatora).

    Uwe 450V, Iwe 0.2A,

    Przeglądnąłem kilka projektów woltomierzy i wyszedł mi taki kod:

    Code:
    $regfile = "m8def.DAT" 
    
    $crystal = 8000000

    Config Lcd = 20 * 2

    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portd.3 , Rs = Portd.2       'konfiguracja linii

    Config Adc = Single , Prescaler = Auto , Reference = Avcc

    Cursor Off
    Dim Wart_acv As Word
    Dim Wart_aca As Word
    Dim Wart_vlim As Word
    Dim Volt As Single
    Dim Amp As Single
    Dim Pow As Single
    Dim Rez As Single
    Dim V As Single
    Dim A As Single
    Dim P As Single
    Dim R As Single
    Dim Vod As Single



    Start Adc

    Do
     Wart_acv = Getadc(0)
     Wart_aca = Getadc(1)
     Wart_vlim = Getadc(2)
     Cls

     Volt = Wart_acv * 0.49   `na wejściu tego ADC będzie dzielnik przez 100
     V = Fusing(volt , "#.##")
     Locate 1 , 1
     Lcd "V" ; V ; V


     Amp = Wart_aca * 0.0049
     A = Fusing(amp , "#.##")
     Locate 1 , 8
     Lcd "A" ; A ; A

     Pow = Volt * Amp
     P = Fusing(pow , "#.##")
     Locate 1 , 15
     Lcd "P" ; P ; W

     Vlim = Wart_vlim * 0.49
     Vod = Fusing(vlim , "#.#")
     Locate 2 , 1
     Lcd "Vlim" ; Vod ; V

     Rez = Volt / Amp
     R = Fusing(rez , "#.#")
     Locate 2 , 10
     Lcd "R" ; R ; Ohm
     
     Waitms 500
    Loop
    End


    Niestety moja niewiedza w pisaniu programów jest ogromna więc program nie chce się skompilować bo wyskakują błędy:
    Error 42 w linii 48
    Error 31 w linii 50

    Nie wiem też czy samo wyświetlanie na LCD jest dobrze zrobione.

    Możecie mi podrzucić informację co jest źle bo ja nie mam pojęcia jak to dalej poprawić.

    Pozdrawiam
    Matizz

    0 19
  • Pomocny post
    #2 26 Gru 2007 00:12
    teedd
    Poziom 18  

    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.

    Code:
    $regfile = "m8def.DAT"
    
    $crystal = 8000000

    Config Lcd = 20 * 2

    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portd.3 , Rs = Portd.2       'konfiguracja linii

    Config Adc = Single , Prescaler = Auto , Reference = Avcc

    Cursor Off
    Dim Wart_acv As Word
    Dim Wart_aca As Word
    Dim Wart_vlim As Word
    Dim Volt As Single
    Dim Vlim As Single
    Dim Amp As Single
    Dim Pow As Single
    Dim Rez As Single
    Dim V As Single
    Dim A As Single
    Dim P As Single
    Dim R As Single
    Dim Vod As Single



    Start Adc

    Do
     Wart_acv = Getadc(0)
     Wart_aca = Getadc(1)
     Wart_vlim = Getadc(2)
     Cls

     Volt = Wart_acv * 0.49                                     'na wejściu tego ADC będzie dzielnik przez 100
     V = Fusing(volt , "#.##")
     Locate 1 , 1
     Lcd "U=" ; V ; "V"


     Amp = Wart_aca * 0.0049
     A = Fusing(amp , "#.##")
     Locate 1 , 8
     Lcd "I=" ; A ; "A"

     Pow = Volt * Amp
     P = Fusing(pow , "#.##")
     Locate 1 , 15
     Lcd "P=" ; P ; "W"


     Vlim = Wart_vlim * 0.49
     Vod = Fusing(vlim , "#.#")
     Locate 2 , 1
     Lcd "Vlim=" ; Vod ; "V"

     Rez = Volt / Amp
     R = Fusing(rez , "#.#")
     Locate 2 , 10
     Lcd "R=" ; R ; "Ohm"

     Waitms 500
    Loop
    End

    Pozdrowienia - teedd

    0
  • Pomocny post
    #3 26 Gru 2007 08:59
    M. S.
    Poziom 34  

    Ponieważ Fusing zwraca zmienną tekstową więc deklaracja zmiennych stanowiących wynik tej instrukcji powinna być następująca:

    Code:
    Dim V As String * 6
    
    Dim A As String * 6
    Dim P As String * 6
    Dim R As String * 6
    Dim Vod As String * 6


    Zmienne są wystarczająco długie dla zakresu 99.9.
    Jeśli wartość przekracza 100 powinno być String * 7

    0
  • #4 27 Gru 2007 12:10
    seba_x
    Poziom 31  

    możesz od razu napisać :

    Code:
    Lcd Fusing(napiecie0 , "#.#");


    i nie trzeba deklarować stringów

    0
  • #5 27 Gru 2007 21:35
    Matizz
    Poziom 18  

    seba_x napisał:
    możesz od razu napisać :

    Code:
    Lcd Fusing(napiecie0 , "#.#");


    i nie trzeba deklarować stringów


    Więc mogę wpisać:

    Code:
     Amp = Wart_aca * 0.0049
    
     Locate 1 , 8
     Lcd Fusing(amp , "#.##")

    ale w którym momencie muszę wtedy wstawić "I=" i "A" ?

    Znalazłem w szufladzie czujnik temperatury DS18B20 a na necie kawałki programu do obsługi go, zmiksowałem to z moim programem i wyszedł mi taki "koktajl" :


    Code:

    $regfile = "m8def.DAT"
    $crystal = 8000000

    Config Lcd = 20 * 2

    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portd.3 , Rs = Portd.2       'konfiguracja linii

    Config Adc = Single , Prescaler = Auto , Reference = Avcc

    Config 1wire = Portb.1

    Cursor Off
    Dim Wart_acv As Word
    Dim Wart_aca As Word
    Dim Wart_vlim As Word
    Dim Volt As Single
    Dim Vlim As Single
    Dim Amp As Single
    Dim Pow As Single
    Dim Rez As Single
    Dim V As String * 7
    Dim A As String * 6
    Dim P As String * 6
    Dim R As String * 6
    Dim Vod As String * 7



    Dim I1 As Integer ,
    Dim T1 As String * 6
    Dim Dsid1(8) As Byte

    Deflcdchar 0 , 32 , 28 , 20 , 28 , 32 , 7 , 4 , 7


    Start Adc

    Do
     Wart_acv = Getadc(0)
     Wart_aca = Getadc(1)
     Wart_vlim = Getadc(2)


     Volt = Wart_acv * 0.49                                     'na wejściu tego ADC będzie dzielnik przez 100
     V = Fusing(volt , "#.##")
     Locate 1 , 1
     Lcd "U=" ; V ; "V"


     Amp = Wart_aca * 0.0049
     A = Fusing(amp , "#.##")
     Locate 1 , 8
     Lcd "I=" ; A ; "A"

     Pow = Volt * Amp
     P = Fusing(pow , "#.##")
     Locate 1 , 15
     Lcd "P=" ; P ; "W"


     Vlim = Wart_vlim * 0.49
     Vod = Fusing(vlim , "#.#")
     Locate 2 , 1
     Lcd "Vlim=" ; Vod ; "V"

     Rez = Volt / Amp
     R = Fusing(rez , "#.#")
     Locate 2 , 10
     Lcd "R=" ; R ; "Ohm"

     Waitms 500


    Dsid1(1) = 1wsearchfirst()

     1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       I1 = 1wread(2)

       1wreset
       1wwrite &HCC
       1wwrite &H44

     Waitms 750

       I1 = I1 * 10
       I1 = I1 / 16
       T1 = Str(i1)
       T1 = Format(t1 , " 0.0")
    Locate 2 , 15
    Lcd ; T1 ; Chr(0) ; "C"


    Loop
    End


    Jutro musze uruchomić moje atmegi (obecnie mam tylko ustawione na zegar zewnętrzny) i zacznę wreszcie testować ten kod w praktyce.

    dziękuje i pozdrawiam
    Matizz

    0
  • #6 28 Gru 2007 09:31
    seba_x
    Poziom 31  

    locate 1,8
    lcd "I=" '<- nie mam jak sprawdzić ale tu może trzeba dać średnik
    Lcd Fusing(amp , "#.##")

    0
  • #7 28 Gru 2007 11:26
    PiotrPitucha
    Poziom 33  

    Witam
    Koło rok temu w Elektronice Praktycznej był miernik do zasilacza na Atmega8, zastosowano kilka ciekawych rozwiązań, w artykule był listing, nawet jak zrobisz po swojemu to programowi warto się przyjrzeć
    Piotr

    0
  • #8 28 Gru 2007 14:18
    Matizz
    Poziom 18  

    PiotrPitucha napisał:
    Witam
    Koło rok temu w Elektronice Praktycznej był miernik do zasilacza na Atmega8, zastosowano kilka ciekawych rozwiązań, w artykule był listing, nawet jak zrobisz po swojemu to programowi warto się przyjrzeć
    Piotr


    Przejrzałem na necie dostępne numery EP,niestety nie znalazłem takigo projektu.
    Za to znalazłem trochę o metodach pomiarów prądu.
    Mógłbyś podać trochę bardziej konkretnie kiedy był ten artykuł?

    Jeszcze zastanawia mnie jedna rzecz w tym programiku:
    po odczycie napięć i prądów ma czekać 500ms a dopiero potem odczytać temperaturę więc jest to bez tylko strata czasu.
    Po przestawieniu tego Waitms :

    Code:
    (...)
    

    Rez = Volt / Amp
     R = Fusing(rez , "#.#")
     Locate 2 , 10
     Lcd "R=" ; R ; "Ohm"

    'z tego miejsca'

    Dsid1(1) = 1wsearchfirst()

     1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       I1 = 1wread(2)

       1wreset
       1wwrite &HCC
       1wwrite &H44

     Waitms 750

       I1 = I1 * 10
       I1 = I1 / 16
       T1 = Str(i1)
       T1 = Format(t1 , " 0.0")
    Locate 2 , 15
    Lcd ; T1 ; Chr(0) ; "C"
    'tutaj'
    waitms 500


    Już jest trochę lepiej, ale gdyby całkowicie zrezygnować z tego końcowego waitms 500 i z kasowania ekranu na początku programu - wtedy dane były by tylko uaktualniane i nie trzeba by było czekać na pojawienie się wskaźnika temperatury.

    Dobrze myślę?

    Pozdrawiam
    Matizz

    0
  • #9 29 Gru 2007 07:45
    seba_x
    Poziom 31  

    na końcu nie musisz na nic czekać ! , tak się składa że też piszę prog. do zasilacza i też z pomiarem temp. , ja zrobiłem tak

    Code:
    Temperaturka:
    

       1wreset
       1wwrite &HCC
       1wwrite &H44

       Do
       Incr Opozniacz_przerwania
       Gosub Przyciski
       Gosub Pomiar
       Gosub Wyswietlacz1
       If Opozniacz_przerwania = 50 Then
          Opozniacz_przerwania = 0
       Exit Do
       End If
       Loop

       1wreset
       1wwrite &HCC
       1wwrite &HBE

       Odczyt(1) = 1wread(2)
       1wreset

       Tempe = Makeint(odczyt(1) , Odczyt(2))
       Tempe = Abs(tempe)
       'Tempe = Tempe * 10
       Tempe = Tempe / 16
       Temperatura = Str(tempe)


    Return


    jak widać nawet nie czekam bez sensu 750ms tylko w to miejsce dałem skoki do odpowiednich podprogramów , głównie chodziło mi o to żeby pomiar prądu był bez żadnych przerw bo robię zabezpieczenie po przekroczeniu którego procek odłączy zasilacz

    ekranu nie czyść cls-em tylko nadpisuj odpowiednie miejsca , nie będziesz miał migotania lcd

    jak zrobię porządek w programie to go tu wrzucę

    ten twój zasilacz jest symetryczny (+/-) ? możesz podesłać mi schemat bo ja walczę z lm317/lm337 + tranzystory

    0
  • #10 29 Gru 2007 12:36
    Matizz
    Poziom 18  

    seba_x napisał:
    na końcu nie musisz na nic czekać ! , tak się składa że też piszę prog. do zasilacza i też z pomiarem temp. , ja zrobiłem tak

    Code:
    Temperaturka:
    

       1wreset
       1wwrite &HCC
       1wwrite &H44

       Do
       Incr Opozniacz_przerwania
       Gosub Przyciski
       Gosub Pomiar
       Gosub Wyswietlacz1
       If Opozniacz_przerwania = 50 Then
          Opozniacz_przerwania = 0
       Exit Do
       End If
       Loop

       1wreset
       1wwrite &HCC
       1wwrite &HBE

       Odczyt(1) = 1wread(2)
       1wreset

       Tempe = Makeint(odczyt(1) , Odczyt(2))
       Tempe = Abs(tempe)
       'Tempe = Tempe * 10
       Tempe = Tempe / 16
       Temperatura = Str(tempe)


    Return


    jak widać nawet nie czekam bez sensu 750ms tylko w to miejsce dałem skoki do odpowiednich podprogramów , głównie chodziło mi o to żeby pomiar prądu był bez żadnych przerw bo robię zabezpieczenie po przekroczeniu którego procek odłączy zasilacz

    ekranu nie czyść cls-em tylko nadpisuj odpowiednie miejsca , nie będziesz miał migotania lcd

    jak zrobię porządek w programie to go tu wrzucę

    ten twój zasilacz jest symetryczny (+/-) ? możesz podesłać mi schemat bo ja walczę z lm317/lm337 + tranzystory


    Tak myślałem żeby zacząć od pomiaru temperatury i w czasie jej konwersji odwołać się do SUB z pomiarami prądu i napięcia, ale nie byłem pewien czy tak można i co się stanie gdy pomiar napięć zajmie mniej czasu niż te 750ms.

    a w sprawie zasilacza napisałem na PW żeby nie robić OT.

    pozdrawiam
    Matizz

    0
  • #11 29 Gru 2007 16:37
    PiotrPitucha
    Poziom 33  

    Cześć
    Pamięć bywa zawodna, teraz jestem przy gazetach, to Nowy Elektronik 6/2004, wydawało mi się że było to niedawno :)
    Artykuł nazywa się Uniwersalny V/A do zasilaczy, występuje tez w zestawach do samodzielnego montażu jako zestaw 388-K
    Zakres pomiarowy 0-100V i 0-9A, oczywiście przerabiając bocznik możemy zakres zmienić
    Piotr

    0
  • #12 30 Gru 2007 20:52
    Matizz
    Poziom 18  

    Miernik jest już uruchomiony i działa w miarę dobrze.
    Wady jakie wykryłem to:

    -za mały wyświetlacz- nie mieszczą się wszystkie wyniki w obecnej postaci :/
    -ponieważ nie kasuje ekranu to gdy wynikiem będzie np. 123.4V to po zmniejszeniu napięcia do np. 45.3 na wyświetlaczu pojawia się 45.3VV

    ale znalazłem już na to sposób- zastosuję zamiast polecenia Fusing polecenie Format :

    Code:
     Amp = Wart_aca * 0.0049
    
     A = Format (amp , "000")
     Locate 1 , 8
     Lcd "I" ; A ; Chr(1)


    Jutro przetestuję to w praktyce.

    Kolejny problem to rozdzielczość pomiaru Rezystancji-
    od 15ohm do 450 kohm.

    Bardzo pomocna była by tutaj automatyczna zmiana zakresu pomiarowego(nigdzie na necie nie znalazłem jakiegoś przykładu ze źródłem :/ ).

    Spróbuję więc tutaj polecenia Select-case i zobaczę co wyjdzie.

    Ale dalej nie wiem jak zrobić sygnalizację przekroczenia temperatury i maksymalnej mocy strat na tranzystorze :/
    Przy poleceniu If -> Then wyskakują mi głupie błędy.
    Muszę poszukać więcej przykładów na necie.

    Gdybyście mieli jakieś sugestie co jeszcze można by było poprawić/zmienić/udoskonalić to chętnie wszystkiego wysłucham.

    Pozdrawiam
    Matizz

    0
  • #13 02 Sty 2008 10:20
    seba_x
    Poziom 31  

    możesz tak wykombinować :

    locate 1,8
    if napiecie < 100 then
    lcd " ";napiecie;"V"
    else
    lcd napiecie;" V"

    pisałem na szybko z głowy , musisz sprawdzić , litera "V" powinna być cały czas w tym samym miejscu tylko wynik będziesz miał z pustym miejscem na początku jak będzie poniżej 100

    automatyczna zmiana zakresu ? napięcia ? to napisz tak :
    jeśli nap. większe od jakiegoś tam to wystaw 1 na jakimś pinie (tu podłanczasz przekazniczek który przełączy ci rezystorki w dzielniku , dodatkowo zabezpiecz adc przed zbyt wysokim napięciem (rezystorek+zenerka5.1v))

    tak samo z temp. : jeśli większa od nastawionej to daj ostrzeżenie na lcd

    daj to wszystko w pętli głównej i po problemie

    ot : zasilacz masz "wypasiony" mój to cienki pikuś przy twoim :D

    0
  • #14 02 Sty 2008 11:44
    Matizz
    Poziom 18  

    Witam

    Wyświetlanie wyników zrobiłem już trochę inaczej:

    Code:

    Locate 1 , 1                                             'napięcie
       Lcd "U" ; V
       Locate 1 , 5
       Lcd "V "


    Przy napięciach do 10V mam na wyświetlaczu 9.00V,
    do 100V mam 99.V,
    a powyżej 100V. można się do tego przyzwyczaić tylko że napięcie poniżej 100V ma już dość spory błąd pomiarowy(myślę że ze względu na duży dzielnik wejściowy - 750k->7k5). chwilowo układ jest złożony na płytce uniwersalnej i nie mam miejsca na przekaźnik do przełączania zakresów.

    Narazie to zostawiłem i bawię się z przekroczeniem temperatury.
    Właściwie to już działa ale poziom alarmu ustawia się w czasie programowania, a chciałbym żeby można było zmienić tą wartość i była ona zapamiętana.
    Wymyśliłem więc coś takiego:
    Code:

    Dim Tmax As Integer

    Config Pinb.1 = Input
    Config Pinb.2 = Input
    Config Pinb.3 = Input
    Declare Sub Tmaxset
    Declare Sub Main

    Up Alias Pinb.1
    Down Alias Pinb.2
    Sel Alias Pinb.3

    Do

    If Sel = 1 Then
    Gosub Tmaxset
    Else Gosub Main
    End If

    Loop

    Sub Tmaxset

    Readeeprom Tmax , 1
    Locate 2 , 15
    Lcd Tmax

    If Up = 1 Then
    Tmax = Tmax + 10
    Writeeeprom Tmax , 1
    End If

    If Down = 1 Then
    Tmax = Tmax - 10
    Writeeeprom Tmax , 1
    End If

    End Sub

    End


    i przy pomiarze temperatury :

    Code:


    readeeprom tmax ,1
    If I1 >= Tmax Then
    Gosub Ot



    Tylko że widziałem kilka programów które odnoszą sie do pamięci eprom i każdy był napisany inaczej :/ więc nie wiem czy to co mi wyszło jest OK.

    Co do zmiany zakresów to narazie wygospodarowałem tyle miejsca na LCD że nie musze tego robić(ale to stan przejściowy, i poprawię to).

    A tak w ogóle to mi się kończy możliwość programu :/ bo wersja demo


    Pozdrawiam
    Matizz

    0
  • #15 02 Sty 2008 13:32
    seba_x
    Poziom 31  

    temperatura alarmu musi być "nastawiana" ? zaoszczędził byś trochę miejsca jak byś np. tak jak ja dał sobie stałą temp. alarmu .


    twoje demko ma ograniczenie do 4kb ?

    0
  • #16 02 Sty 2008 17:35
    Matizz
    Poziom 18  

    seba_x napisał:
    temperatura alarmu musi być "nastawiana" ? zaoszczędził byś trochę miejsca jak byś np. tak jak ja dał sobie stałą temp. alarmu .


    Naprawdę aż tak źle napisałem ten kawałek programu? ;)

    Temperatura co prawda nie musi być ustawiana, ale często zmieniam tranzystory obciążające i tu by mi się przydało zmieniać ich Pmax bez przeprogramowania układu.

    Tak moje demko(v.1.11.8.7) ma ograniczenie do 4kb kodu (zostało mi jeszcze 5%)

    Cytat:

    możesz tak wykombinować :

    locate 1,8
    if napiecie < 100 then
    lcd " ";napiecie;"V"
    else
    lcd napiecie;" V"

    Właśnie przetestowałem i po drobnej modyfikacji pasuje idealnie(zamiast wartości napięcia dałem wartość adc, bo u mnie U jest zapisane jako string więc nie pasuje do IF)

    Btw. czy jest jakaś funkcja która by wyświetliła znaki w negatywie czy trzeba to ręcznie wpisywać w LCD desinger?

    pozdrawiam
    Matizz

    0
  • #17 03 Sty 2008 08:23
    seba_x
    Poziom 31  

    w negatywie nie (też to kiedyś przerabiałem ;-) ) zostaje tylko lcd designer , zapisywanie temperatury do epromu , nie wiem ile to pamięci zabiera sprawdz czy np przy pomocy debounce i dwuch przycisków ( + , - ) mógłbyś ustawić sobie (niestety za każdym razem jak wyłączysz zasilanie) temperaturę alarmu , może zaoszczędzisz trochę pamięci


    trochę poprawiłem twój prog. zaoszczędziłem 76 bajty ramu (może nie wiele ale przy ograniczeniu do 4kb to zawsze "coś")

    znak stopnia masz zdefiniowany , to zabiera dużo pamięci , sprawdz w pdf-ie od lcd czy ma taki znaczek , wystarczy tylko że każesz mu go wyświetlić i już

    Code:
                                                         $regfile = "m8def.DAT"
    
    $crystal = 8000000

    Config Lcd = 20 * 2

    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portd.3 , Rs = Portd.2       'konfiguracja linii

    Config Adc = Single , Prescaler = Auto , Reference = Avcc

    Config 1wire = Portb.1

    Cursor Off
    Dim Wart_acv As Word
    Dim Wart_aca As Word
    Dim Wart_vlim As Word
    Dim Volt As Single
    Dim Vlim As Single
    Dim Amp As Single
    Dim Pow As Single
    Dim Rez As Single
    'Dim V As String * 7
    'Dim A As String * 6
    'Dim P As String * 6
    'Dim R As String * 6
    'Dim Vod As String * 7



    Dim I1 As Integer ,
    Dim T1 As String * 6
    Dim Dsid1(8) As Byte

    'Deflcdchar 0 , 32 , 28 , 20 , 28 , 32 , 7 , 4 , 7


    Start Adc

    Do
     Wart_acv = Getadc(0)
     Wart_aca = Getadc(1)
     Wart_vlim = Getadc(2)


     Volt = Wart_acv * 0.49                                     'na wejściu tego ADC będzie dzielnik przez 100
     'V = Fusing(volt , "#.##")
     Locate 1 , 1
     Lcd "U="
     Lcd Fusing(volt , "#.##")
     Lcd "v"




     Amp = Wart_aca * 0.0049
     'A = Fusing(amp , "#.##")
     Locate 1 , 8
     Lcd "I="
     Lcd Fusing(amp , "#.##")
     Lcd "a"



     Pow = Volt * Amp
     'P = Fusing(pow , "#.##")
     Locate 1 , 15
     Lcd "P="
     Lcd Fusing(pow , "#.##")
     Lcd "w"


     Vlim = Wart_vlim * 0.49
     'Vod = Fusing(vlim , "#.#")
     Locate 2 , 1
     Lcd "Vlim="
     Lcd Fusing(vlim , "#.#")
     Lcd "v"



     Rez = Volt / Amp
     'R = Fusing(rez , "#.#")
     Locate 2 , 10
     Lcd "R="
     Lcd Fusing(rez , "#.#")
     Lcd "ohm"


     'Waitms 500


    Dsid1(1) = 1wsearchfirst()

     1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       I1 = 1wread(2)

       1wreset
       1wwrite &HCC
       1wwrite &H44

     Waitms 750

       I1 = I1 * 10
       I1 = I1 / 16
       T1 = Str(i1)
       'T1 = Format(t1 , " 0.0")
    Locate 2 , 15
    Lcd Format(t1 , " 0.0")
    Lcd "c"


    Loop
    End

    0
  • #18 26 Sty 2008 22:14
    Matizz
    Poziom 18  

    Witam
    Program do miernika jest już prawie skończony, zostało mi tylko dopracować menu i zmienić rezystory w dzielnikach na 1%.

    Wartość maksymalnej temperatury jest ustawiana przy pierwszym włączeniu i zapisywana do eeprom.

    Chciałbym sie jeszcze tylko dowiedzieć w jaki sposób zadeklarować w programie żeby przy programowaniu zapisało do pamięci eeprom domyślną wartość ograniczenia temperaturowego - tak by nie trzeba było tego ustawiać przy pierwszym włączeniu miernika, ale można było ją puźniej zmienić i zapamiętać (więc coś takiego na początku programu:

    Code:

    tmax = 100
     writeeeprom tmax ,1


    odpada)

    znalazłem kilka przykładów ale nie potrafię ich rozgryść(gdzie jest określone miejsce w eepromie a gdzie wartość do zapisania):

    Cytat:
    Dta1:
    Data &H0 , &H00 , &H28 , &H54
    Data &H0 , &H0A , &H05 , &H47
    Data &H1 , &H1E , &H2E , &H14
    Data &H0D , &H89 , &H36 , &H27



    Pozdrawiam
    Matizz

    0
  • #19 05 Lut 2012 03:51
    gagarin33
    Poziom 9  

    Witam. Potrzebuję pomocy. Kupiłem zestaw NE388 i po złożeniu okazuje się że nie reaguje na pomiary podejrzewam ubity procesor. Czy ktoś ma może wsad do tego miernika ? Zapłacę. Próbowałem skontaktować się z producentem, ale nie działają numery telefonów.

    0