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] Menu z 3 przyciskami - góra, dół i enter.

marek19951 29 Sty 2010 13:04 6823 42
  • #1 29 Sty 2010 13:04
    marek19951
    Poziom 16  

    Witam,

    Zamierzam stworzyć menu w którym będzie można ustawiać używając 3 przycisków temperaturę.

    Napisałem taki kod:

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

    Config Portb = Output
    Config Pind.5 = Input
    Config Pind.6 = Input
    Config Pind.7 = Input

    Portb = &B0000000
    Portd = &B0000000

    Dim Tempzadana As Long

    Declare Sub Menu
    Declare Sub Normal

    Enter Alias Portd.7
    Gora Alias Portd.6
    Dol Alias Portd.5

    Tempzadana = 70

    Do

       Call Normal

    Loop

    Sub Normal:

       Cls
       Lcd "Temp Zadana:" ; Tempzadana
       Lowerline
       Lcd " Wcicisnij ENTER aby ja zmienic"
       Do
          If Enter = 1 Then
             Call Menu
          End If
       Loop

    End Sub

    Sub Menu:
       Cls
       Lcd "Temp Zadana:" ; Tempzadana
       Lowerline
       Lcd "Aby zmienic, wcisnij GORA lub DOL"

          Do

             If Gora = 1 Then
                Tempzadana = Tempzadana + 5
                Cls
                Lcd "Temp Zadana:" ; Tempzadana
                Lowerline
                Lcd "Aby zapisac wcisnij ENTER"

             Elseif Dol = 1 Then
                Tempzadana = Tempzadana - 5
                Cls
                Lcd "Temp zadana:" ; Tempzadana
                Lcd "Aby zapisac wcisnij ENTER"
             End If

          Loop Until Enter = 1

    End Sub


    Config LCD brakuje, bo jeszcze nie jestem pewien, które to będą piny.
    Kod napisałem w oparciu o helpa i inne menu przedstawione na elektrodzie, nie mam na razie możliwości czy będzie to działać jak należy, ale mam kilka pytań.

    1. Czy będzie to działać? Jest dobrze napisane?
    2. Może da się jakoś skrócić ten kod?
    3. Gdzie umieścić resztę programu tak, aby non-stop program sprawdzał czy nie został wciśnięty ENTER? W pierwszy Do:Loop?
    4. Gdy będę zmieniał temperaturę, wtedy reszta programu nie będzie się wykonywać, tak?

    Z góry dzięki za pomoc.

    0 29
  • #3 29 Sty 2010 14:10
    marek19951
    Poziom 16  

    Faktycznie zapomniałem o tym.
    Ale widzę, że gdy używam Debounce, nie mogę używać aliasów.

    Gdy napiszę
    If debounce gora , 1 then
    Wyskakują błędy.

    Nawet jeśli zmienię na Gora alias PIND.6, jest to samo.
    Czyli gdy używam debounce muszę zrezygnować z aliasów?
    Czy po prostu dodać opóźnienie po Then?

    0
  • #5 29 Sty 2010 16:37
    marek19951
    Poziom 16  

    Faktycznie, nie doczytałem... Już poprawiam, dzięki.

    Dodano po 12 [minuty]:

    Co sądzicie teraz, o tym menu?
    Jest dobrze?

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

    Config Portb = Output
    Config Pind.5 = Input
    Config Pind.6 = Input
    Config Pind.7 = Input

    Portb = &B0000000
    Portd = &B0000000

    Dim Tempzadana As Long

    Declare Sub Menu
    Declare Sub Normal
    Declare Sub Plus
    Declare Sub Minus

    Enter Alias Portd.7
    Gora Alias Portd.6
    Dol  Alias Portd.5

    Tempzadana = 70

    Do

       Call Normal

    Loop

    Sub Normal:

       Cls
       Lcd "Temp Zadana:" ; Tempzadana
       Lowerline
       Lcd " Wcicisnij ENTER aby ja zmienic"
       Do
          Debounce Enter , 1 , Menu , Sub
       Loop

    End Sub

    Sub Menu:
       Cls
       Lcd "Temp Zadana:" ; Tempzadana
       Lowerline
       Lcd "Aby zmienic, wcisnij GORA lub DOL"

          Do
             Debounce Gora , 1 , Plus , Sub
             Debounce Dol , 1 , Minus , Sub
          Loop Until Enter = 1

    End Sub

    Sub Plus:
       Tempzadana = Tempzadana + 5
       Cls
       Lcd "Temp Zadana:" ; Tempzadana
       Lowerline
       Lcd "Aby zapisac wcisnij ENTER"
       Debounce Gora , 1 , Plus , Sub
       Debounce Dol , 1 , Minus , Sub
       Debounce Enter , 1 , Normal , Sub
    End Sub

    Sub Minus:
       Tempzadana = Tempzadana - 5
       Cls
       Lcd "Temp zadana:" ; Tempzadana
       Lcd "Aby zapisac wcisnij ENTER"
       Debounce Gora , 1 , Plus , Sub
       Debounce Dol , 1 , Minus , Sub
       Debounce Enter , 1 , Normal , Sub
    End Sub[/quote]

    I nadal proszę o odpowiedź na pytania zawarte w 1 poście.

    [size=9][color=#999999]Dodano po 2 [godziny] 7 [minuty]:[/color][/size]

     Spróbowałem stworzyć bardziej rozbudowane menu, co o nim sądzicie? Będzie działać?



    [quote]$regfile = "m8def.dat"                                      'program jest pisany na procesor atmega8
    $crystal = 8000000                                          'procesor będzie pracował z kwarcem bądź na wewnętrznym oscylatorze 8Mhz





    Config Portb = Output
    Config Pind.5 = Input
    Config Pind.6 = Input
    Config Pind.7 = Input

    Portb = &B0000000
    Portd = &B0000000

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.7 , Db5 = Portd. 4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd. 5 , Rs = Portd.6

    Dim Tempzadana As Long
    Dim Pracap As Long
    Dim Przerwap As Long
    Dim Pracaw As Long
    Dim Przerwaw As Long
    Dim Tempawaryjna As Long

    Declare Sub Menu
    Declare Sub Plus
    Declare Sub Minus
    Declare Sub Normal
    Declare Sub 11
    Declare Sub 2
    Declare Sub 22
    Declare Sub 3
    Declare Sub 33
    Declare Sub 4
    Declare Sub 44
    Declare Sub 5
    Declare Sub 55
    Declare Sub 6
    Declare Sub 66
    Declare Sub Minuspracap
    Declare Sub Pluspracap
    Declare Sub Minusprzerwap
    Declare Sub Plusprzerwap
    Declare Sub Minuspracaw
    Declare Sub Pluspracaw
    Declare Sub Minusprzerwaw
    Declare Sub Plusprzerwaw
    Declare Sub Minustempawaryjna
    Declare Sub Plustempawaryjna

    Enter Alias Portd.7
    Gora Alias Portd.6
    Dol Alias Portd.5


    Tempzadana = 70

    Do
    'MENU::
    '**************************************************
    Do

       Debounce Enter , 1 , Normal , Sub

    Loop

    Normal:

       Cls
       Lcd "1. Zmien temp zadana"
       Lowerline
       Lcd "Nawigacja: Gora-Dol. Wejdz: Enter. Wyjdz: Przytrzymaj Enter."
       Do
          Debounce Enter , 1 , 11 , Sub
          Debounce Dol , 1 , 2 , Sub
          Debounce Gora , 1 , 3 , Sub
          If Enter = 1 Then
          Wait 2
             If Enter = 1 Then
             Return
             End If
          End If
       Loop

    2:
       Do
       Cls
       Lcd "2. Zmien czas pracy podajnika"
       Lowerline
       Lcd "Nawigacja: Gora-Dol. Wejdz: Enter"
       Debounce Enter , 1 , 22 , Sub
       Debounce Dol , 1 , 3 , Sub
       Debounce Gora , 1 , 1 , Sub
       Loop

    22:
       Do
       Cls
       Lcd "Praca podajnika wynosi" ; Pracap ; "sek"
       Debounce Dol , 1 , Minuspracap , Sub
       Debounce Gora , 1 , Pluspracap , Sub
       Debounce Enter , 1 , Normal , Sub
       Loop

    11:
       Do
       Cls
       Lcd "Temp zadana wynosi:" ; Tempzadana ; "'C"
       Debounce Gora , 1 , Plus , Sub
       Debounce Dol , 1 , Minus , Sub
       Debounce Enter , 1 , Normal , Sub
       Loop

    3:
       Do
       Cls
       Lcd "3. Zmien czas przerwy podajnika"
       Lowerline
       Lcd "Nawigacja: Gora-Dol. Wejdz: Enter"
       Debounce Enter , 1 , 33 , Sub
       Debounce Dol , 1 , 4 , Sub
       Debounce Gora , 1 , 2 , Sub
       Loop

    33:
       Do
       Cls
       Lcd "Czas przerwy podajnika wynosi" ; Przerwap ; "sek"
       Debounce Dol , 1 , Minusprzerwap , Sub
       Debounce Gora , 1 , Plusprzerwap , Sub
       Debounce Enter , 1 , Normal , Sub
       Loop

    4:
       Do
       Cls
       Lcd "4. Zmien czas pracy wentylatora"
       Lowerline
       Lcd "Nawigacja: Gora-Dol. Wejdz: Enter"
       Debounce Dol , 1 , 5 , Sub
       Debounce Gora , 1 , 3 , Sub
       Debounce Enter , 1 , 44 , Sub
       Loop

    44:
       Do
       Cls
       Lcd "Czas pracy wentylator wynosi:" ; Pracaw ; "sek"
       Debounce Dol , 1 , Minuspracaw , Sub
       Debounce Gora , 1 , Pluspracaw , Sub
       Debounce Enter , 1 , Normal , Sub
       Loop

    5:
       Do
       Cls
       Lcd "5. Zmien czas przerwy wentylatora"
       Lowerline
       Lcd "Nawigacja: Gora-Dol. Wejdz: Enter"
       Debounce Dol , 1 , 4 , Sub
       Debounce Gora , 1 , 6 , Sub
       Debounce Enter , 1 , 55 , Sub
       Loop

    55:
       Do
       Cls
       Lcd "Czas przerwy wentylatora wynosi:" ; Przerwaw ; "sek"
       Debounce Dol , 1 , Minusprzerwaw , Sub
       Debounce Gora , 1 , Plusprzerwaw , Sub
       Debounce Enter , 1 , Normal
       Loop

    6:
       Do
       Cls
       Lcd "6. Zmien temp awaryjna"
       Lowerline
       Lcd "Nawigacja: Gora-Dol. Wejdz: Enter"
       Debounce Gora , 1 , 1 , Sub
       Debounce Dol , 1 , 5 , Sub
       Debounce Enter , 1 , 66 , Sub
       Loop

    66:
       Do
       Cls
       Lcd "Temp awaryjna wynosi:" ; Tempawaryjna ; "'C"
       Debounce Gora , 1 , Plustempawaryjna , Sub
       Debounce Dol , 1 , Minustempawaryjna , Sub
       Debounce Enter , 1 , Normal , Sub
       Loop

    Loop

    Plus:
       Tempzadana = Tempzadana + 5
       Return

    Minus:
       Tempzadana = Tempzadana - 5
       Return

    Minuspracap:
       Pracap = Pracap - 1
       Return

    Pluspracap:
       Pracap = Pracap + 1
       Return

    Minusprzerwap:
       Przerwap = Przerwap - 1
       Return

    Plusprzerwap:
       Przerwap = Przerwap + 1
       Return

    Minuspracaw:
       Pracaw = Pracaw - 1
       Return

    Pluspracaw:
       Pracaw = Pracaw + 1
       Return

    Minusprzerwaw:
       Przerwaw = Przerwaw - 1
       Return

    Plusprzerwaw:
       Przerwaw = Przerwaw + 1
       Return

    Minustempawaryjna:
       Tempawaryjna = Tempawaryjna - 5
       Return

    Plustempawaryjna:
       Tempawaryjna = Tempawaryjna + 5
       Return

    End


    Niestety tego menu chyba nie użyję w programie, bo gdy kompiluje menu i program wyskakuje błąd 999, chyba każdy wie co to znaczy :D. Na pewno da się wszystko lepiej upchnąć, ale ja nie wiem jak, macie jakiś pomysł?

    I muszę dawać SUB'y tak jak to robiłem w menu post wyżej, czy wystarczy robić tak jak zrobiłem w tym menu?

    0
  • #7 29 Sty 2010 18:14
    marek19951
    Poziom 16  

    Chciałbym aby wyświetlało jedną linijkę z menu

    1. Zmien temp zadaną
    2. Zmien czas pracy podajnika
    3. Zmien czas przerwy podajnika
    4. Zmien czas pracy wentylatora
    5. Zmien czas przerwy wentylatora
    6. Zmien temp awaryjną

    Czyli coś podobnego jak przedstawiłem w tym 2-gim menu, tylko żeby to mniej zajmowało, przedstawiłbyś mi to w jednym menu i podmenu jak to zrobić? Bo tak jak ja to rozpisałem jest zbyt pamięciożerne no i nie wiem nawet czy do końca dobre.

    Dodano po 10 [minuty]:

    Menu miałoby tak wyglądać:

    1. Zmien temp zadaną
    - Temp zadana wynosi: X 'C
    2. Zmien czas pracy podajnika
    - Czas pracy podajnika wynosi: X sek
    3. Zmien czas przerwy podajnika
    - Czas przerwy podajnika wynosi: X sek
    4. Zmien czas pracy wentylatora
    - Czas pracy wentylatora wynosi: X sek
    5. Zmien czas przerwy wentylatora
    - Czas przerwy wentylatora wynosi: X sek
    6. Zmien temp awaryjną
    - Temp awaryjna wynosi: X 'C

    Podczas pod menu czyli np. Temp awaryjna wynosi: X 'C
    Chciałbym przyciskami góra dół zwiększać i zmniejszać tą temperaturę o 5'C. Wciskam enter i jestem znowu w menu głównym, a przytrzymuje ENTER przez 2 sekundy i wychodzę z menu.

    To menu co pokazałem ostatnie jest wogóle dobre, czy nie będzie działać tak jak zamierzam?

    0
  • #8 29 Sty 2010 18:18
    marco47
    Poziom 41  

    Czy robiłeś coś z Select case

    Code:
         Select Case Menu
    
           Case 0: 'Zmien temp zadaną
              'Coś do wykonania
           Case 1: 'Zmien czas pracy podajnika
                 'Coś do wykonania
           Case 2: 'Zmien czas przerwy podajnika
                 'Coś do wykonania
           Case 3: 'Zmien czas pracy wentylatora
                 'Coś do wykonania
           Case 4: 'Zmien czas przerwy wentylatora
                 'Coś do wykonania     
           Case 5: 'Zmien temp awaryjną
                 'Coś do wykonania
    End Select

    0
  • #9 29 Sty 2010 18:22
    marek19951
    Poziom 16  

    Marco47, o select case muszę jeszcze poczytać w helpie, nie próbowałem na tym robić menu. Ale chciałbym przypomnieć, że chcę to zrobić używając tylko 3 przycisków. Jeśli masz chwilę, to prosiłbym o pokazanie na jednym z menu czyli np. wyświetlenie 1. Zmien temp zadaną, wejście do menu itd.
    I odp. czy to menu, które ja dałem by działało dobrze, tylko zbyt dużo miejsca zajmuje, czy jest niepoprawnie napisane?

    0
  • #11 29 Sty 2010 18:36
    marek19951
    Poziom 16  

    A w jaki sposób odbywała by się nawigacja używając dwóch przycisków? Bo chodzi mi też o prostotę w ustawianiu, bo nie tylko ja będę to używał, sam rozumiesz...

    0
  • #12 29 Sty 2010 18:50
    marco47
    Poziom 41  

    Dłuższe naciśnięcie to przechodzenie między ekranami menu UP , DOWN.
    Krótkie naciśnięcie to ustawianie tego co jest na aktualnie wyświetlanym ekranie .
    Wszystko musimy wsadzić do pętli do...loop ( przyciski , menu , ustawianie itp.) a wyświetlanie do podprogramu .
    Chcesz prawie gotowy kod czy wolisz sam go pisać , będąc nakierowywany przez kolegów .

    0
  • #13 29 Sty 2010 19:52
    marek19951
    Poziom 16  

    Nie chcę gotowca, bo się nic nie nauczę, a nie o to chodzi... Spróbuję napisać to w select case z 3 przyciskami i przedstawię to, edytując tego posta.

    Dodano po 49 [minuty]:

    O to mniej więcej chodziło?

    Wiadomo, wykroiłem samo menu bez reszty typu Ust1 czy ustaleniu, że Menu jest bitem (byte).

    Cytat:
    Do

    If Enter = 1 Then
    If Gora = 1
    Incr Menu
    End If
    End If

    If Menu = 7 Then
    Menu = 1
    End If

    Select Case Menu
    Case 1 : Lcd "Temp zadana:" ; Tempzadana ; "'C"
    Debounce Enter , 1 , Ust1 , Sub
    Case 2 : Lcd "Praca podajnika:" ; Pracap ; "sek"
    Debounce Enter , 1 , Ust2 , Sub
    Case 3 : Lcd "Przerwa podajnika" ; Przerwap ; "sek"
    Debounce Enter , 1 , Ust3 , Sub
    Case 4 : Lcd "Praca wentylatora:" ; Pracaw ; "sek"
    Debounce Enter , 1 , Ust4 , Sub
    Case 5 : Lcd "Przerwa wentylatora:" ; Przerwaw ; "sek"
    Debounce Enter , 1 , Ust5 , Sub
    Case 6 : Lcd "Temp awaryjna:" ; Tempawaryjna ; "'C"
    Debounce Enter , 1 , Ust6 , Sub
    Loop


    W ten sposób mniej więcej ma się to odbywać?

    0
  • #15 29 Sty 2010 20:23
    marek19951
    Poziom 16  

    Z reguły sprawdzam, teraz przy tym menu nie sprawdzałem, bo chciałem przedstawić na forum jak ja to widzę i czy dobrze, bo jeszcze nie mam napisanego Ust1-Ust6 itd.

    Bez debounce czyli If enter = 1 then gosub ust1, tak?
    W Case 0: co mam wpisać? Nic nie wpisywać, czy co?

    Robię tak jak mówisz z tym menu, mam np. ******* Odczyt temperatury *****. Tyle, że menu robię teraz jako osobny plik *.BAS do testów, jak będę dodawał go do programu to wtedy pododaję też komentarze.

    Zaraz przedstawię jak bym widział np. Ust1, zerkniesz czy dobrze.

    I mam jeszcze jedno pytanko, jeżeli są dwię pętle Do:Loop np.

    Do
    Włącz
    Czekaj 10s
    Wyłącz
    Loop

    Do
    Włącz
    Czekaj 20s
    Wyłącz
    Loop

    To czy one działają niezależnie od siebie czy program leci po kolei i nie przejdzie do drugiej pętli dopóki nie wyjdzie z pierwszej (co w tej chwili jest oczywiście niemożliwe)?

    Pytam bo chciałbym zrobić SUB: przedmuch oraz podaj i chciałbym aby niezależnie odliczało czasy i niezależnie jedno od drugiego się załączało i wyłączało.

    0
  • #16 29 Sty 2010 20:34
    marco47
    Poziom 41  

    Najlepiej jakbyś wklejał kod nad którym pracujesz , aby można było na bieżąco sprawdzać postępy jakie robisz .

    Code:
    Do
    
    '_______________  Menu  _______________________
    If Enter = 1 Then
        If Gora = 1
           Incr Menu
       End If
    End If

    If Menu = 6 Then
       Menu = 0
    End If

    Select Case Menu
       Case 0 : Lcd "Temp zadana:" ; Tempzadana ; "'C"
            Debounce Enter , 1 , Ust1 , Sub
       Case 1 : Lcd "Praca podajnika:" ; Pracap ; "sek"
            Debounce Enter , 1 , Ust2 , Sub
       Case 2 : Lcd "Przerwa podajnika" ; Przerwap ; "sek"
            Debounce Enter , 1 , Ust3 , Sub
       Case 3 : Lcd "Praca wentylatora:" ; Pracaw ; "sek"
            Debounce Enter , 1 , Ust4 , Sub
       Case 4 : Lcd "Przerwa wentylatora:" ; Przerwaw ; "sek"
            Debounce Enter , 1 , Ust5 , Sub
       Case 5 : Lcd "Temp awaryjna:" ; Tempawaryjna ; "'C"
          Debounce Enter , 1 , Ust6 , Sub
     End select
    '_____________________________________________
    Loop


    Staraj się opisywać każdą linijkę kodu czego ona dotyczy i co robi .To bardzo ułatwia późniejszą korektę lub wprowadzanie zmian w programie . Wyszczególniaj bloki funkcyjne tak jak pokazałem wyżej .

    0
  • #17 29 Sty 2010 20:34
    leon1313
    Poziom 14  

    DEBOUNCE powinno być zabronione prawem ( a może i lewem? )
    Zrób obsługę przycisków w 3 sub-ach, i przekazuj ewentualne wciśnięcie poprzez flagi (Przycisk_zwieksz=1: przycisk_zmniejsz=1: przycisk_nastepny=1)

    0
  • #18 29 Sty 2010 20:47
    marek19951
    Poziom 16  

    To zamiast debounce dawać po prostu if enter = 1 then ... ?
    Leon1313, mógłbyś rozwinąć swoją wypowiedź odnośnie subów, bo niewiele mi to mówi.

    PS. Zeedytowałem posta, który jest wyżej, zerknijcie.

    Dodano po 6 [minuty]:

    Cytat:
    Ust1:
    If Gora = 1 Then
    Tempzadana = Tempzadana + 5
    Elseif Dol = 1 Then
    Tempzadana = Tempzadana - 5
    Elseif Enter = 1 Then
    Return


    Czy może każda z UstX tak wyglądać? Czy dozwolone jest w tym przypadku używanie return, aby powróciło od nowa do select case?

    0
  • Pomocny post
    #19 29 Sty 2010 20:47
    marco47
    Poziom 41  

    Zmień całkowicie podejście do pętli Do...loop.
    Jeżeli zaczynasz zabawę z programowaniem stosuj tylko jedną pętlę Do..loop
    Wszystko co będziesz pisał umieszczaj w tej jednej pętli , nigdy nie stosuj Wait'a , nie skacz niepotrzebnie do rozbudowanych podprogramów itd.

    Kolego leon1313
    Zgadzam się z Tobą ( wcześniej przecież napisałem co sądzę o DEBOUNCE )

    0
  • #20 29 Sty 2010 20:50
    marek19951
    Poziom 16  

    Czyli zamiast debounce mam użyć tak jak pisałem wyżej If Enter = 1 Then ... ?
    Niestety muszę stosować wait, ponieważ muszę przez pewien czas podtrzymać załączony tranzystor, a potem go wyłączyć, w ten sposób muszę obsłużyć 2 tranzystory, a niedługo dojdzie 3.

    0
  • Pomocny post
    #21 29 Sty 2010 20:57
    leon1313
    Poziom 14  

    marco47 - przepraszam, nie zauważyłem.
    marek19951 - proste if-then nie załatwi problemu. Jeżeli masz zapał, a widzę , że masz, zacznij od procedury obsługi klawiatury , która nie powoduje opóźnień poprzez martwe pętle ( czyli m.in wait, debounce, bitwait itp).
    Ja to zrobiłem na przerwaniu programowym z timer1, które odliczało mi okresy 10 ms w połączeniu ze zliczaniem tych okresów, jeśli został wciśnięty przycisk lub rozpoczęto już zliczanie.
    Dlaczego 10ms? Jeśli zechcesz wprowadzić sterowanie fazowe mocą wentylatora, szybko się przekonasz.

    0
  • #23 29 Sty 2010 21:05
    marek19951
    Poziom 16  

    Leon1313 nie chcę sterować mocą wentylatora, to będzie tylko załącz wyłącz. Co do tej klawiatury to faktycznie pomyślę o tym, ale jutro, bo na jutro rano muszę przygotować sterownik (na razie bez menu i lcd).

    Marco47, źle się wyraziłem, chodziło mi o coś tego typu
    Podaj:
    Podajnik = 1
    Ledp = 1
    Wait Pracap
    Podajnik = 0
    Ledp = 0
    Return

    Chcę po prostu aby załączyć podajnik, odczekać ilość pracy podajnika i go wyłączyć i powrócić do reszty kodu, tak sobie to umyślałem, nie wiem czy robię dobrze, ale żądany efekt spełnia.

    0
  • Pomocny post
    #24 29 Sty 2010 21:13
    marco47
    Poziom 41  

    Jasne że spełnia , tylko że polecenie Wait zatrzymuje działanie procesora i po minięciu określonego Wait'em czasu rusza dalej do pracy . A przecież w tym czasie powinien robić coś pożytecznego a nie labować .

    0
  • Pomocny post
    #25 29 Sty 2010 21:17
    leon1313
    Poziom 14  

    Jeśli działa, to ok.
    My po prostu próbujemy Ci uzmysłowić, że nie zawsze najprostsza droga jest najlepsza, ale chyba w tym przypadku to nie gra roli.
    Ja zacząłem programować uC miesiąc temu, mając - tak sądzę - solidne podstawy przy programowaniu wielowątkowym w perlu. Komenda wait wywołała u mnie stan przedzawałowy po 2 godzinach...
    Prz zegarze 8M opóźnienie 40 ms to ok.. 320 000 taktów zegara, a większość rozkazów jest wykonywana w jednym takcie.

    0
  • #26 29 Sty 2010 21:17
    marek19951
    Poziom 16  

    Cytat:
    $regfile = "m8def.dat" 'program jest pisany na procesor atmega8
    $crystal = 8000000 'procesor będzie pracował z kwarcem bądź na wewnętrznym oscylatorze 8Mhz

    Config Portb = Output
    Config Pind.5 = Input
    Config Pind.6 = Input
    Config Pind.7 = Input

    Portb = &B0000000
    Portd = &B0000000

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.7 , Db5 = Portd. 4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd. 5 , Rs = Portd.6

    Dim Tempzadana As Long
    Dim Pracap As Long
    Dim Przerwap As Long
    Dim Pracaw As Long
    Dim Przerwaw As Long
    Dim Tempawaryjna As Long

    Declare Sub Podaj
    Declare Sub Podtrzymanie

    Enter Alias Portd.7
    Gora Alias Portd.6
    Dol Alias Portd.5
    Podajnik Alias Portd.0
    Wentylator Alias Portd.1
    Ledp Alias Portd.4
    Ledw Alias Portd.5

    Tempzadana = 70
    Tempawaryjna = 85
    Pracap = 20
    Przerwap = 20
    Pracaw = 10
    Przerwaw = 10

    Do
    ' Odczyt temperatury::
    '**************************************************
    Deflcdchar 0 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32
    Config 1wire = Portb.0
    Dim Odczyt(2) As Byte
    Dim Db(2) As Byte
    Dim T As Integer
    Dim Ulamek As Integer
    Cls
    Cursor Off
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 750
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Db(1) = 1wread(2)
    T = Makeint(db(1) , Db(2))
    T = T * 10
    T = T / 16
    Ulamek = T Mod 10
    T = T / 10



    'Wyświetlanie temperatury::
    '**************************************************
    Locate 1 , 1
    Lcd "Tem= " ; T ; "," ; Ulamek ; Chr(0) ; "C"

    'PROGRAM::
    '**************************************************
    If T < Tempzadana Then
    Wentylator = 1
    Ledw = 1
    Gosub Podaj

    Elseif T > Tempzadana And T < 90 Then
    Gosub Podtrzymanie
    Wait 60

    Elseif T > 90 Then
    Wentylator = 0
    Ledw = 0
    Podajnik = 0
    Ledp = 0

    End If


    Loop

    'Podawanie::
    '**************************************************
    Podaj:
    Podajnik = 1
    Ledp = 1
    Wait Pracap
    Podajnik = 0
    Ledp = 0
    Return

    'Podtrzymanie::
    '**************************************************
    Podtrzymanie:
    Wentylator = 1
    Ledw = 1
    Wait Pracaw
    Wentylator = 0
    Ledw = 0
    Return

    End


    Tak wygląda mój program, którym właśnie zaprogramowałem ATmege8, na razie bez menu, bo jutro rano będę testował podajnik i chce odrazu sterownik przetestować. Macie jakieś pomysły aby ulepszyć/zoptymalizować ten kod?

    0
  • Pomocny post
    #27 29 Sty 2010 21:20
    leon1313
    Poziom 14  

    Podciągnij użuwane piny portu D do zasilania poprzez (choćby):

    Code:
    Set portd.5

    0
  • Pomocny post
    #28 29 Sty 2010 22:12
    marco47
    Poziom 41  

    Propozycja zmian

    Code:
    $regfile = "m8def.dat" 'program jest pisany na procesor atmega8
    
    $crystal = 8000000 'procesor będzie pracował z kwarcem bądź na wewnętrznym oscylatorze 8Mhz

    '----------------------------------------------------------------------------
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc. 4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc. 1 , Rs = Portc.0

    Deflcdchar 0 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32
    '-------------------------------------------------------------------------------
    Config Portb = &B11111111
            Portb = &B00000000
    Config Portc = &B11111111
            Portc = &B00000000
    Config Portd = &B00011111
            Portd = &B11100000

    Dim Tempzadana As Byte
    Dim Pracap As Byte
    Dim Przerwap As Byte
    Dim Pracaw As Byte
    Dim Przerwaw As Byte
    Dim Tempawaryjna As Byte

    Config 1wire = Portb.0
    Dim Odczyt(2) As Byte
    Dim Db(2) As Byte
    Dim T As Integer
    Dim Ulamek As Integer


    Enter Alias Portd.7
    Gora Alias Portd.6
    Dol Alias Portd.5
    Podajnik Alias Portd.0
    Wentylator Alias Portd.1
    Ledp Alias Portd.4
    Ledw Alias Portd.5

    Tempzadana = 70
    Tempawaryjna = 85
    Pracap = 20
    Przerwap = 20
    Pracaw = 10
    Przerwaw = 10

    Cls
    Cursor Off

    Do

    '*********************  Program sterownika  ************************************
    If T < Tempzadana Then
          Wentylator = 1
            Ledw = 1
             Podajnik = 1
               Ledp = 1
       End If

    If T > Tempzadana Then
          Wentylator = 0
            Ledw = 0
              Podajnik = 0
               Ledp = 0
       End If

    If T > 90 Then
          Wentylator = 0
            Ledw = 0
              Podajnik = 0
               Ledp = 0

    End If
    '**************  Odczyt temperatury  *******************************************


    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 750
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Db(1) = 1wread(2)
    T = Makeint(db(1) , Db(2))
    T = T * 10
    T = T / 16
    Ulamek = T Mod 10
    T = T / 10

    '**************  Wyświetlanie temperatury  *************************************
    Locate 1 , 1
    Lcd "Tem= " ; T ; "," ; Ulamek ; Chr(0) ; "C"

    '*******************  koniec programu  *****************************************
    Loop

    0
  • #29 29 Sty 2010 22:51
    marek19951
    Poziom 16  

    Marco47, dzięki za poprawiony i dużo bardziej przejrzysty kod, a o tych ifach w ifach nawet nie pomyślałem :). Dodałem jeszcze tylko Sub'y Podaj: i Podtrzymywanie i zmieniłem program sterownika i jest dużo czytelniejszy, diody mi nie chciały świecić, ale wyszło na to, że się pomyliłem w portach przy aliasach i dlatego, teraz ładnie wszystko chodzi, steruje tranzystorami i diodami dobrze. Jutro przetestuje w praktyce przy piecu :). Daje Wam pomógł jak na razie, ale pewnie będę kontynuował temat o menu, ale jutro po testach. Dzięki za pomoc i wyrozumiałość :).

    0
  • #30 30 Sty 2010 09:25
    Freddy
    Poziom 43  

    Kazaliście mu wyrzucić Debounce, a dla początkujących, umiejętnie użyta jest bardzo przydatna.
    Początkujący będzie miał problemy z własną obsługą drgania zestyków.

    0