logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8][Bascom] Przyciski

dukes-soft 20 Sie 2008 19:05 5308 10
REKLAMA
  • #1 5457163
    dukes-soft
    Poziom 12  
    Witam!
    Robie sterownik grzałki do wytrawiarki, który odczytuje temp cieczy z DS18B20, porównuje z temp zadaną i grzeje dopuki nie uzyska zadanej temp. Ale nie o tym chciałem pogadać :)

    Otóż do ustawienia temp zadanej wykorzystuje dwa przyciski, do procedury ustawiania temp wchodzi się przez wciśnięcie obydwóch przycisków jednocześnie. I teraz mam problem, aby wyjść z menu. Nie chciałbym stosować trzeciego przycisku. Mój (tak nie do końca :) ) pomysł polega na tym aby uC wychodził z trybu ustawiania temp gdy żaden przycisk nie jest wciśnięty przez powiedzmy 3s.
    Próbowałem zrobić to w ten sposób:
    
    If PIND.3 = 1 And PIND.4 = 1 Then
    Wait 3
    If PIND.3 = 1 And PIND.4 = 1 Then
    Goto Sub Main
    End if
    End if
    


    Ale nie działa to tak jakbym chciał. Bo jeśli np. po 1 sekundzie zmienie zdanie i będę chciał ustawić inna temperature to musze czekac te 3s aż program sprawdzi czy przyciski były ruszane. Czy wiecie może jak to zrobić abym mógł zmienić temp w każdym momencie?
    Z góry dziękuje za pomoc :)

    EDIT:
    Zapomniałem napisać, ale chyba to jest oczywiste, że po wciśnięciu jednego z przycisków zwiększamy lub zmniejszamy temp zadaną :)
  • REKLAMA
  • Pomocny post
    #2 5457208
    BoskiDialer
    Poziom 34  
    Robisz sobie dwie zmienne: blokada i aktywność. Blokada jako prosta wartość 0 lub 1: jeśli blokada jest założona i wykryjesz, że oba przyciski są naciśnięte, to ustawiasz blokadę na 0 (i aktywność na 0, dodatkowo można dać opóźnienie, aby nie uwzględniać naciśniętych przycisków dalej). Jeśli blokada jest zdjęta, to robisz wszystkie testy, dodatkowo jeśli jest naciśnięty któryś przycisk, zerujesz zmienną aktywność, jeśli żaden nie jest naciśnięty, zwiększasz zmienną aktywność (np co 10ms) - jeśli po zwiększeniu wartość dojdzie do 300 (3sekundy) to ustawiasz blokadę i znów trzeba nacisnąć przyciski.
  • REKLAMA
  • #3 5457250
    maly_elektronik
    Poziom 23  
    Nie wiem jak jest w Bascomie ale chyba porównanie w tym języku daje się == a nie = (przynajmniej tak jest w c). A w twoim kodzie brakuje czegoś bo jeżeli masz
    If PIND.3 = 1 And PIND.4 = 1 Then 
    Wait 3 
    If PIND.3 = 1 And PIND.4 = 1 Then 
    Goto Sub Main 
    End if 
    End if


    a w tej drugiej lini instrukcji warunkowej powinneś miec
    If PIND.3 = 1 And PIND.4 = 1 Then 
    Wait 3 
    If PIND.3 = 0 And PIND.4 = 0 Then 
    Goto Sub Main 
    End if 
    End if


    Oczywiście jeżeli dobrze interpretuje twój kod :D
  • REKLAMA
  • #4 5457569
    dukes-soft
    Poziom 12  
    Witam!
    W tej drugiej lini wartości na pinach muszą byc równe 1 bo tzn. że przyciski nadal nie są wduszone i uC ma wyjść z trybu ustawień temp.

    BoskiDialer: dzięki za pomysł, popróbuje i dam znać czy jest ok ;)
  • #5 5457818
    Utul
    Poziom 13  
    Witam

    dukes-soft napisał:
    Witam!
    Robie sterownik grzałki do wytrawiarki, który odczytuje temp cieczy z DS18B20, porównuje z temp zadaną i grzeje dopuki nie uzyska zadanej temp. Ale nie o tym chciałem pogadać :)

    Otóż do ustawienia temp zadanej wykorzystuje dwa przyciski, do procedury ustawiania temp wchodzi się przez wciśnięcie obydwóch przycisków jednocześnie. I teraz mam problem, aby wyjść z menu.


    Nie wiem po co Ci wchodzenie do menu w wytrawiarce :?:
    Ja bym to zrobił najprościej jak można, od razu klikam na przycisk i zmienia się ustawianą temp. Nie wiem co tam jeszcze chcesz ustawiać na tych klawiszach :idea:

    Pozdro
  • #6 5457854
    dukes-soft
    Poziom 12  
    Próbowałem ale zmiana trwa bardzo długo ze względu na konwersje temp dla DS'a (750ms). Nieraz trzeba było czekać aż 10s aby trafic idealnie przyciskiem w miejsce programu :D

    Wykombinowałem takie coś:
    
    Ustaw:
    Sub Ustaw_temp
    Debounce Pind.4 , 0 , Up
    Debounce Pind.3 , 0 , Down
    
       Temp = Fusing(i2 , "00.0")
       Cls
       Locate 1 , 2
       Lcd "Ustaw temp:";
    
       Locate 2 , 6
       Lcd Temp ; Chr(0);
    
    
    
       If Pind.3 = 1 And Pind.4 = 1 Then
       Waitms 10
       Incr Aktywnosc
       End If
    
       If Aktywnosc = 500 Then
       A = I2
       Writeeeprom A , 1
       Goto Main
       End If
    End Sub
    
    Up:
    Aktywnosc = 0
    Incr I2
    Goto Ustaw
    
    Down:
    Aktywnosc = 0
    Decr I2
    Goto Ustaw
    


    I jest problem bo program odrazu wychodzi z trybu ustawiania temp po może 1-2 sekundach :(. Co skopałem? :P
  • #7 5457892
    Utul
    Poziom 13  
    Opcji jest mnóstwo, chociażby przyciski podłączyć do INTx.
    Ale ja bym to zrobił tak:
    Skok co 1s. do przerwania timera1, a w nim najpierw odczyt z DS-a, a po odczycie daje mu konwersje. Koniec przerwania.
    Pętla Do-Loop gdzie obsługuje przyciski, wyświetlacz itp.
    End
  • #8 5459295
    dukes-soft
    Poziom 12  
    dukes-soft napisał:

    I jest problem bo program odrazu wychodzi z trybu ustawiania temp po może 1-2 sekundach :(. Co skopałem? :P

    Odpowiem sobie sam, zapomniałem dodać pętle Do-Loop w całym Sub'ie. Dodałem też linijke w drugiej instrukcji warunkowej aby przy wychodzeniu z trybu ustawiania temp zmienna "Aktywnosc" miała wartość 0 :)

    
    If Aktywnosc = 500 Then 
    A = I2 
    Writeeeprom A , 1
    Aktywnosc = 0
    Goto Main 
    End If
    
  • #9 6426507
    syla_85
    Poziom 11  
    Witam mój problem polega na zmniejszeniu kodu źródłowego przełącznika
    gdyż po dodaniu kodu termostatu z regulacją wtedy sw1-sw5 kuleją. Czy można to jakoś inaczej napisać
    :|

    $regfile = "m32def.dat"
    $crystal = 16000000                                         
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.1 , Db6 = Portc.0 , Db7 = Portc.5 , E = Portc.3 , Rs = Portc.4
    
    Config Portb = &B11111111                                   '-------wyjscie
            Portb = &B11111111                                  '-----wyjscie
    Config Portd = &B11110000                                   '-wejscie
            Portd = &B11111111                                  '-wejscie
    Do
    If Pind.1 = 0 Then Portb.5 = 1
    If Pind.1 = 0 Then Portb.1 = 0
    If Pind.2 = 0 Then Portb.1 = 1          '------------------ 1 sw
    If Pind.1 = 0 Then Portb.3 = 1
    If Pind.1 = 0 Then Portb.4 = 1
    '------------------------------------
    If Pind.2 = 0 Then Portb.5 = 1
    If Pind.2 = 0 Then Portb.2 = 0
    If Pind.1 = 0 Then Portb.2 = 1          '-------------2sw
    If Pind.2 = 0 Then Portb.3 = 1
    If Pind.2 = 0 Then Portb.4 = 1
    '------------------------------
    If Pind.3 = 0 Then Portb.5 = 1
    If Pind.3 = 0 Then Portb.4 = 1
    If Pind.3 = 0 Then Portb.3 = 0          '------------3sw
    If Pind.3 = 0 Then Portb.2 = 1
    If Pind.3 = 0 Then Portb.1 = 1
    '------------------------------------
    If Pind.4 = 0 Then Portb.5 = 1
    If Pind.4 = 0 Then Portb.4 = 0
    If Pind.4 = 0 Then Portb.1 = 1
    If Pind.4 = 0 Then Portb.2 = 1         '---------------4sw
    If Pind.4 = 0 Then Portb.3 = 1
    '-----------------------------------
    If Pind.5 = 0 Then Portb.5 = 0
    If Pind.5 = 0 Then Portb.1 = 1          '------------5sw
    If Pind.5 = 0 Then Portb.2 = 1
    If Pind.5 = 0 Then Portb.3 = 1
    If Pind.5 = 0 Then Portb.4 = 1
    Loop
    End


    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • REKLAMA
  • #10 6427675
    Konto nie istnieje
    Poziom 1  
  • #11 6428999
    syla_85
    Poziom 11  
    Przesyłam film tego wynalazku:
    http://www.youtube.com/watch?v=FLe9px8yiyE
    Mój kod działa poprawnie gry jest w swojej pętli.
    Ale w pętli jakiegoś programu ten kod szaleje i przełącznik nie działa.
    i czy można to jakoś inaczej zapisać niż moim sposobem:?::?:
REKLAMA