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

[ATmega16][Bascom]Wadliwy odczyt DS18B20

sumara17 15 Maj 2013 22:46 4572 16
  • #1 15 Maj 2013 22:46
    sumara17
    Poziom 15  

    Witam
    Zaczynam zabawę z z atmegą 16 i czujnikiem DS18B20 i mam jak każdy na tym forum mały kłopot. Czujnik podłączyłem dobrze układ mierzy mi temperaturę ale dopiero od 30 stopni. zaraz po wgraniu pokazuje - 0.1 stopni a gdy czujnik dotykam temperatura się zmienia na 31 stopni gdy puszcze powraca do -0,1.
    Program:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    $regfile = "m16adef.dat"
    $crystal = 1000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Rs = Portc.7 , E = Portc.6 , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2



    Config 1wire = Porta.2 ' termometr ds18b20
    Dim I As Integer 'zmienne do odczytu temp.
    Dim S As Single
    Dim T As String * 4

    Deflcdchar 0 , 6 , 9 , 6 , 32 , 32 , 32 , 32 , 32 ' znak stopnia

    Cursor Off
    Cls

    'pomiar temp. na termometrze ds18b20
    Do


    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 750

    1wreset
    1wwrite &HCC
    1wwrite &HBE

    I = 1wread(2)
    S = I / 16
    T = Fusing(s , "##.#")

    Locate 1 , 1
    Lcd "Temp:" ; T ; Chr(0) ; "C"



    Loop
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    hm co jest nie tak ? . Prosił bym o podpowiedz
    Poprawiono tytuł, LordBlick

    0 16
  • CControls
  • #2 15 Maj 2013 22:55
    Ture11
    Poziom 34  

    Czy mówiąc, że dobrze podłączyłeś czujnik, masz na myśli, że dodałeś rezystor podciągający?

    0
  • CControls
  • #3 15 Maj 2013 23:08
    sumara17
    Poziom 15  

    Dodałem rezystor 4,7 kohm i kilka razy sprawdzałem poniższy schemat
    [ATmega16][Bascom]Wadliwy odczyt DS18B20
    Podłączyłem tak
    [ATmega16][Bascom]Wadliwy odczyt DS18B20

    0
  • #4 16 Maj 2013 06:20
    emarcus
    Poziom 35  

    sumara17 napisał:
    Witam
    Zaczynam zabawę z z atmegą 16 i czujnikiem DS18B20 i mam jak każdy na tym forum mały kłopot............

    hm co jest nie tak ? . Prosił bym o podpowiedz

    Spróbuj ten, troche zmieniony code:

    [code]
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Ponadto nie masz potrzeby tak często convertowac i odczytywac temperaturę z DS.
    Zmiany temperatury mierzonego środowiska a także samego sensora mają dośc dużą bezwładnośc i pomiar co kilka/kilkanaście sekund byłby wystarczający. W tym celu możesz zastosowa jeden z timerów i po określonym czasie następowałby odczyt temperatury i wyświetlenie wyniku na LCD. Wtedy pozbyłbyś się instrukcji "waitms 750", oraz wrażenia mrugania LCD. Wymagałoby nie wielkiej zmiany w listingu.

    e marcus

    0
  • #5 16 Maj 2013 17:38
    sumara17
    Poziom 15  

    Witam wgrałem Twój program dalej termometr wskazuje -0,1 i mierzy powyżej 25 stopni (jak czujnik dotykam ) i przechodzi do -0.1 stopnia (po puszczeniu czujnika)
    Gdy spadnie poniżej 25 stopni termometr wariuje i stabilizuje się na -0.1 stopnia
    tak jak na filmie

    0
  • #7 18 Maj 2013 15:59
    sumara17
    Poziom 15  

    Witam
    Po woli tracę cierpliwość. Przeanalizowałem wiele tematów związanych z pomiarem temperatury przy pomocy atmegi 16 oraz czujnika temperatury Dallas DS18B20 1239C4+950AC i nadal mam problem czujnik mi mierzy dobrze powyżej temperatury 24 stopni
    O co chodzi ? gdzie robię błąd?

    Dodano po 56 [minuty]:

    W końcu działa należało zmienić częstotliwość oscylatora wewnętrznego

    Dodano po 9 [minuty]:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    $regfile = "m16adef.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Rs = Portc.7 , E = Portc.6 , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2



    Config 1wire = Porta.2 ' termometr ds18b20
    Dim I As Integer 'zmienne do odczytu temp.
    Dim S As Single
    Dim T As String * 4

    Deflcdchar 0 , 24 , 24 , 32 , 7 , 8 , 8 , 7 , 32 ' znak stopnia

    Cursor Off
    Cls

    'pomiar temp. na termometrze ds18b20
    Do


    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 750

    1wreset
    1wwrite &HCC
    1wwrite &HBE

    I = 1wread(2)
    S = I / 16
    T = Fusing(s , "#.#")

    Locate 1 , 1
    Lcd "Pomieszczenie 1"
    Locate 2 , 1
    Lcd "Temp:" ; T ; Chr(0) ;


    $prog &HFF , &HD4 , &HD9 , &H00 ' generated. Take care that the chip supports all fuse bytes.

    Loop
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Teraz jak bym chciał np.
    Gdy temperatura mi osiągnie 30 stopnie niech załączy pind.7.
    Jak zastosować to w moim programie?

    0
  • #8 18 Maj 2013 16:20
    Ture11
    Poziom 34  

    Dopisz w polu konfiguracji "Config pind.7 = output", a w pętli prosty warunek If..then. Gdybyś miał problemy z warunkiem If od zmiennej T, spróbuj dać warunek od zmiennej S, uwzględniając jej zapis.

    0
  • #9 19 Maj 2013 19:15
    sumara17
    Poziom 15  

    Witam dopisałem ale coś nie działa do zmiennej T nie mogę się odnieść ponieważ wyrzuca mi błąd odwołałem się do zmiennej S ale program nie działa poprawnie. Co robię źle ?.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    $regfile = "m16adef.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Rs = Portc.7 , E = Portc.6 , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2

    Config Pind.7 = Output




    Config 1wire = Porta.2 ' termometr ds18b20
    Dim I As Integer 'zmienne do odczytu temp.
    Dim S As Single
    Dim T As String * 4

    Deflcdchar 0 , 24 , 24 , 32 , 7 , 8 , 8 , 7 , 32 ' znak stopnia

    Cursor Off
    Cls

    'pomiar temp. na termometrze ds18b20
    Do
    If S > 30 Then
    Set Pind.7
    Else
    Reset Pind.7
    End If

    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 750

    1wreset
    1wwrite &HCC
    1wwrite &HBE

    I = 1wread(2)
    S = I / 16
    T = Fusing(s , "#.#")

    Locate 1 , 1
    Lcd "Pomieszczenie 1"
    Locate 2 , 1
    Lcd "Temp:" ; T ; Chr(0) ;


    $prog &HFF , &HD4 , &HD9 , &H00 ' generated. Take care that the chip supports all fuse bytes.

    Loop
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #10 19 Maj 2013 20:06
    Ture11
    Poziom 34  

    No to wyrzuć zmienną S na wyświetlacz, bo ona zapewne nie będzie wynosić 30 przy temperaturze 30. Ale to tak dla pewności. Do zmiennej T nie możesz się odnieść, bo jest rozdzielona przecinkiem, a właściwie to zapewne dlatego, że jest zmienną string.

    Ale Twój program nie działa z prostszego powodu. Piny pojedyńczo konfiguruje się używając "config pind.7" (to masz dobrze), ale w programie ustawia się je lub resetuje nie jako Pind.7, lecz jako PORTD.7.
    Więc teraz zamień "set/reset pind.7" na "set/reset portd.7"

    0
  • #11 20 Maj 2013 10:47
    sumara17
    Poziom 15  

    Witam
    Dokonałem tej zmiany i także wyrzuciłem zmienna S na Lcd i dalej program nie działa tak jak bym chciał. Powyżej 30 stopni ma się załączyć pind7 a poniżej 30 wyłączyć. Dlaczego program mi nie działa??

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    $regfile = "m16adef.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Rs = Portc.7 , E = Portc.6 , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2

    Config Pind.7 = Output




    Config 1wire = Porta.2 ' termometr ds18b20
    Dim I As Integer 'zmienne do odczytu temp.
    Dim S As Single
    Dim T As String * 4

    Deflcdchar 0 , 24 , 24 , 32 , 7 , 8 , 8 , 7 , 32 ' znak stopnia

    Cursor Off
    Cls

    'pomiar temp. na termometrze ds18b20
    Do
    If S > 30 Then
    Set Portd.7
    Else
    Reset Portd.7
    End If

    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 750

    1wreset
    1wwrite &HCC
    1wwrite &HBE

    I = 1wread(2)
    S = I / 16
    T = Fusing(s , "#.#")

    Locate 1 , 1
    Lcd "zmienna" ; S
    Locate 2 , 1
    Lcd "Temp:" ; T ; Chr(0) ;


    $prog &HFF , &HD4 , &HD9 , &H00 ' generated. Take care that the chip supports all fuse bytes.

    Loop
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Dodano po 19 [minuty]:

    Jest ok zmieniłem znak ''<" i działa . Do swojej podstawki programującej mam podłączone 2 przyciski do pin d.0 pierwszy do pind.1 drugi gdybym chciał zmieniać progi załączania pind.7 tymi przyciskami (czyli regulować temperaturę załączania w dół i gorę) Co w programie należny zmienić oprócz definiowania tych wejść

    0
  • Pomocny post
    #12 20 Maj 2013 13:51
    emarcus
    Poziom 35  

    sumara17 napisał:
    Witam
    Dokonałem tej zmiany i także wyrzuciłem zmienna S na Lcd i dalej program nie działa tak jak bym chciał.
    ................
    Jest ok zmieniłem znak ''<" i działa . Do swojej podstawki programującej mam podłączone 2 przyciski do pin d.0 pierwszy do pind.1 drugi gdybym chciał zmieniać progi załączania pind.7 tymi przyciskami (czyli regulować temperaturę załączania w dół i gorę) Co w programie należny zmienić oprócz definiowania tych wejść


    Ta pierwsza wersja (znak ">") była raczej też poprawna. To zależy co i jak będzie podłączone do portu wyjściowego.
    Jeżeli chcesz regulowac temperaturę (góra, dół) to zapoznaj się z tym tematem:

    https://www.elektroda.pl/rtvforum/viewtopic.php?p=12230888#12230888

    e marcus

    0
  • #13 21 Maj 2013 13:39
    sumara17
    Poziom 15  

    e marcus
    Chciałbym trochę zrozumieć zasadę działanie programu a nie na sucho przepisać program. Dlatego proszę o podpowiedzi , abym sukcesywnie sam rozwiązał problem ale dzięki waszej pomocy

    Wracając do programu by móc regulować dwoma przyciskami temperaturę w dół i górę muszę zdefiniować te dwa piny jako wejścia i przypisać jakąś nazwę. Teraz co dalej czy korzystać z pętli If czy jak bo mam największy problem z dalszą częścią.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    $regfile = "m16adef.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Rs = Portc.7 , E = Portc.6 , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2

    Config Pind.7 = Output
    Config Pind.0 = Input
    Config Pind.1 = Input
    Przycisk1 Alias Pind.0 ' temperatura w góre
    Przycisk2 Alias Pind.1 ' temperatura w dół



    Config 1wire = Porta.2 ' termometr ds18b20
    Dim I As Integer 'zmienne do odczytu temp.
    Dim S As Single
    Dim T As String * 4

    Deflcdchar 0 , 24 , 24 , 32 , 7 , 8 , 8 , 7 , 32 ' znak stopnia

    Cursor Off
    Cls

    'pomiar temp. na termometrze ds18b20
    Do
    If S < 25 Then
    Set Portd.7
    Else
    Reset Portd.7
    End If

    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 750

    1wreset
    1wwrite &HCC
    1wwrite &HBE

    I = 1wread(2)
    S = I / 16
    T = Fusing(s , "#.#")

    Locate 1 , 1
    Lcd "Pomieszczenie1"
    Locate 2 , 1
    Lcd "Temp:" ; T ; Chr(0) ;


    $prog &HFF , &HD4 , &HD9 , &H00 ' generated. Take care that the chip supports all fuse bytes.

    Loop
    [zumek][/color]
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #14 23 Maj 2013 05:40
    emarcus
    Poziom 35  

    sumara17 napisał:
    e marcus
    Chciałbym trochę zrozumieć zasadę działanie programu a nie na sucho przepisać program. Dlatego proszę o podpowiedzi , abym sukcesywnie sam rozwiązał problem ale dzięki waszej pomocy..........



    Kierując twoją uwagę do tamtej dyskusji j.w., nie miałem na myśli kopiowania programu, który i tak wymaga pewnej korrekty, ale na przeanalizowanie możliwości zastosowania subrutyny w formie "menu" do ustawienia w zasadzie dwóch poziomów temperatury; załączania i wyłączania urządzenia peryferyjnego, bądź to jest grzałka lub wentylator (ogrzewanie/chłodzenie kontrolowanego środowiska). Budując termostat (wnioskuję że to masz na celu) nie możesz pozostac przy tylko jednym poziomie temperatury. W granicznej sytuacji miałbyś zbyt częste oscylacje załączania i wyłączania peryferiów; dlatego konieczne jest wprowadzenie histerezy (offset).
    Drugie zagadnienie w tamtym wątku to metoda korzystania z eeprom dla zapisu ustawionych parametrów na wypadek chwilowego zaniku napięcia lub odłączenia urządzenia od zasilania.
    Może nie był to najlepiej 'zredagowany dydaktycznie' przykład, w którym autor nie zbyt trafnie dobrał nazwy zmiennych (które są z zasady dowolne, lecz jednak powinny w jakims przybliżonym stopniu kojarzyc się z funkcją reprezentowanej zmiennej).
    Niemniej jednak przy głębszej analizie, mógłbyś wiele z tego skorzystac.

    Twój koncept programu wymaga wlaśnie zastosowania takigo pojedynczego/jednostopniowego 'menu' do ustawienia kontrolowanej temperatury: góra/dół, a po jej ustawieniu wychodząc z menu należałoby dołączyc zapis ustawianych parametrów do eeprom. W tym celu potrzebny będzie trzeci przycisk, ktory wykorzystasz jako wejście do menu, a następnie tymsamym przyciskiem zapiszesz eeprom i opuścisz menu powracając do funkcjonalności programu.
    Podczas startu systemu, umieścisz przed programem głównym (Do...Loop) odczyt z eeprom wartości zmiennej dla uprzednio ustawionej temperatury, przez co nie będzie konieczne każdorazowe jej ustawianie, a jedynie tylko wtedy gdy zajdzie potrzeba jej zmiany na inną.

    e marcus

    0
  • #15 27 Maj 2013 22:57
    sumara17
    Poziom 15  

    Po ciężkim weekendzie wracam do mojego problemu. Emarkus zaczne analizować ten przypadek który mi przedstawiłeś nie długo sie odezwe

    0
  • #16 28 Maj 2013 20:25
    sumara17
    Poziom 15  

    Witam Analizując
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=12230888#12230888
    program w niektórych przypadkach mam problem ze zrozumieniem

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    $regfile = "m8def.dat" 'deklaracja bibloteki
    $crystal = 8000000 'deklaracja cześtotliwośći

    '*******************************************************************************

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0 'deklaracja podłączenie wyświetlacza
    Config 1wire = Portb.0 'deklaracja podłączenia ds18b20
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32 'deklaracja skali

    '*******************************************************************************

    Config Portc.0 = Output 'deklaracja wyjść
    Config Portc.1 = Output
    Config Portc.2 = Output
    Config Portc.3 = Input 'deklaracja wejść
    Config Portc.4 = Input
    Config Portc.5 = Input

    Reset Portc.0 'resetowanie portów (po co?)
    Reset Portc.1
    Reset Portc.2

    Went1 Alias Portc.0 'przypisanie zmiennych do portów
    Went2 Alias Portc.1
    Went3 Alias Portc.2

    Set Portc.3 'włączenie portów (ustawienie, po co?)
    Set Portc.4
    Set Portc.5

    S1 Alias Pinc.3 'deklaracja przycisków
    S2 Alias Pinc.4
    S3 Alias Pinc.5



    '*******************************************************************************
    'po co tyle zmiennych która od czego do czego?????
    Dim Liczba As Single
    Dim Eliczba As Eram Single At 2
    Dim Buzz As Single
    Dim Ebuzz As Eram Single At 8
    Dim Hist As Single
    Dim Lsb As Byte
    Dim Msb As Byte
    Dim T As Single
    Dim Tekst As String * 4
    Dim Tmin As Single

    Declare Sub Menu
    Declare Sub Zapis

    '*******************************************************************************

    Hist = 2


    Cls
    Cursor Off

    Lcd " Termostat "
    Lowerline
    Lcd " elektroniczny "
    Wait 2

    Cls

    Readeeprom Liczba , Eliczba
    Readeeprom Buzz , Ebuzz

    Do

    '****************** Program sterownika *****************************************

    Locate 1 , 1
    Lcd "TEMP: " ; Tekst ; Chr(0) ; "C"
    Locate 2 , 1
    Lcd "NAST: " ; Liczba ; Chr(0) ; "C"
    Waitms 100

    Tmin = Liczba - Hist



    If T > Liczba Then
    Went1 = 1
    Went2 = 1
    Went3 = 1
    End If


    If T < Tmin Then
    Went1 = 0
    Went2 = 0





    Went3 = 0
    End If


    '****************** Odczyt temperatury *****************************************

    1wreset

    1wwrite &HCC
    1wwrite &H44
    Waitms 750

    1wreset

    1wwrite &HCC
    1wwrite &HBE

    Lsb = 1wread()
    Msb = 1wread()

    'T = Msb * 256
    T = Msb
    Shift T , Left , 8
    T = T + Lsb
    'T = T / 16
    Shift T , Right , 4

    Tekst = Fusing(t , "#.#")

    '*******************************************************************************

    If Pinb.3 = 0 Then
    Waitms 200
    Gosub Menu
    End If

    Loop

    End

    '****************** Ustawienie MENU *******************************************

    Menu:

    Locate 1 , 1
    Lcd " GRANICA TEMP "
    Locate 2 , 1
    Lcd "USTAW: " ; Liczba ; Chr(0) ; "C"
    Waitms 200

    Do

    Locate 2 , 1
    Lcd "USTAW: " ; Liczba ; Chr(0) ; "C"

    If Pinc.1 = 0 Then
    Incr Liczba
    Waitms 200
    End If

    If Pinc.2 = 0 Then
    Decr Liczba
    Waitms 200
    End If

    If Liczba > 80 Then Liczba = 80
    If Liczba < 20 Then Liczba = 20

    If Pinc.3 = 0 Then
    Waitms 200
    Exit Do
    End If

    Loop


    Locate 1 , 1
    Lcd " ALARM! "
    Locate 2 , 1
    Lcd "USTAW: " ; Buzz ; Chr(0) ; "C"


    Do

    Locate 2 , 8
    Lcd Buzz ; Chr(0); "C"

    If Pinc.1 = 0 Then
    Incr Buzz
    Waitms 200
    End If

    If Pinc.2 = 0 Then
    Decr Buzz
    Waitms 200
    End If

    If Buzz > 100 Then Buzz = 100
    If Buzz < 30 Then Buzz = 30


    If Pinc.3 = 0 Then
    Gosub Zapis
    Waitms 200
    Exit Do
    End If

    Loop

    Return

    '****************** Zapis danych ***********************************************

    Zapis:

    Writeeeprom Liczba , Eliczba
    Writeeeprom Buzz , Ebuzz
    Cls
    Return

    '*******************************************************************************
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    nie rozumiem całego menu
    Menu:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Jak stworzyć takie menu u mnie tak abym mogl zmieniać zakres załączanie wyjścia

    Dodano po 1 [godziny] 18 [minuty]:

    Napisałem coś sam ale coś nie działa dobrze. Dlaczego nie zmienia mi się zmienna ,,Liczba''. Gdy wciskam S1 lub S2 ( zmienia się ale jakoś dziwnie )
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    $regfile = "m16adef.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Rs = Portc.7 , E = Portc.6 , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2

    Config Pind.7 = Output
    Config Pind.0 = Input
    Config Pind.1 = Input
    Config Pind.2 = Input
    S1 Alias Pind.0
    S2 Alias Pind.1





    Config 1wire = Porta.2 ' termometr ds18b20
    Dim I As Integer 'zmienne do odczytu temp.
    Dim S As Single
    Dim T As String * 4
    Dim Liczba As Single

    Deflcdchar 0 , 24 , 24 , 32 , 7 , 8 , 8 , 7 , 32 ' znak stopnia

    Cursor Off
    Cls


    Do

    If S < Liczba Then
    Set Portd.7
    Else
    Reset Portd.7
    End If
    If S1 = 1 Then Liczba = Liczba + 1

    If S2 = 1 Then Liczba = Liczba -1


    Locate 2 , 12
    Lcd ; Liczba ; "c"
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 750

    1wreset
    1wwrite &HCC
    1wwrite &HBE

    I = 1wread(2)
    S = I / 16
    T = Fusing(s , "#.#")

    Locate 1 , 1
    Lcd "Aktualna--Zadana"
    Locate 2 , 1
    Lcd "Temp:" ; T ; Chr(0) ;


    $prog &HFF , &HD4 , &HD9 , &H00 ' generated. Take care that the chip supports all fuse bytes.

    Loop
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    Poprawiono składnię fragmentu dotyczącego menu, LordBlick

    0
  • #17 29 Maj 2013 07:01
    emarcus
    Poziom 35  

    sumara17 napisał:
    Witam Analizując
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=12230888#12230888
    program w niektórych przypadkach mam problem ze zrozumieniem


    Trudno zrozumiec, bo akurat wybrałeś jego pierwszą wersję (zupełnie błędną), która uległa kolejnym poprawkom w dalszej dyskusji. Najbliższa do porawnej była umieszczona pod postem #10 (chociaż i ta wymaga pewnej korrekty tak jak wcześniej pisałem). Niezależnie od tego, winieneś był przeczytac wszystkie posty w tej dyskusji - każdy coś wnosi.

    Cytat:

    nie rozumiem całego menu
    ................

    Jak stworzyć takie menu u mnie tak abym mogl zmieniać zakres załączanie wyjścia


    "Menu" to tylko nazwa subrutyny (label); możesz ją nazwac dowolnie.
    Jednak przyjmuje się taką nazwę bo faktycznie kojarzy sięona z wyborem/ustawieniem wartości zmiennych. Ponieważ ta czynnośc jest wykonywana sporadycznie (powiedzmy 'na rządanie' w odróżnieniu od pomiaru temperatury, która jest monitorowana ciągle), wyłączono tą procedurę z programu głównego i stanowi jakoby w pełni funkcjonalny podprogram z nieskończoną pętlą "Do..Loop" i użyciem wyświetlacza dla monitorowania tego co robimy w tej subrutynie.
    Aby wejśc do tej subrytyny ("Menu") potrzebujesz umieścic w programie głównym warunek dla trzeciego przycisku np:
    .............
    If S3 = 0 then
    .........
    gosub Menu
    ..........

    Dalej, aby wyjśc z subrutyny 'menu' (będąc tam ciągle w nieskończonej pętli Do...loop), potrzebujesz umieścic znów instrukcję warunkową wykorzystując ten sam przycisk ...
    If S3 = 0 then
    ......
    Exit Do
    co spowoduje pominięcie lini zawierającej "Loop" i w konsekwencji kolejna instrukcja jest "Return" kierująca processor do programu głównego, do miejsca z którego została wywołana instrukcja 'gosub'.
    Powtarzające sie krótkie 'waitms' po naciśnięciu przycisków autor miał zapewne na myśli zastępczą formę zamiast stosowania instrukcji 'Debounce' oraz dac czas na uwolnienie przycisku w celu uniknięcia wielokrotnego zaliczenia incrementowania/decr. zmiennej w pętli.

    W twoim przykładzie brakuje aliasu do S3,
    brak również podciągania pinów wejściowych do Vcc np:
    PORTD = &H7, albo
    PORTD = 7, albo
    PORTD = &B00000111

    oraz ten wpis:
    $prog &HFF , &HD4 , &HD9 , &H00 - jest zupełnie nie potrzebny!
    ponadto zmień nazwę "Liczba" na coś sensownego np:
    'Temp_max' albo 'Temp_gr'
    Na koniec, skoro stosuje się podciąganie portów wejściowych do Vcc, przyciski S1, S2, S3 winny zwierac piny wejściowe do GND (nie masz podciągania do GND).

    If Sx = 0 Then
    ............

    e marcus

    0