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

[bascom] SWITCH 3 sekundy wcisniety

Lukaszinfer 11 Sie 2009 13:37 1407 17
REKLAMA
  • #1 6880544
    Lukaszinfer
    Poziom 12  
    Witam mam problemik z moim kodem do projektu ktory automatycznie wyłacza żelazka jest narazie jeszcze w okresie testow ale z czasme moze wrzuce moj projekt na elektrode. Program juz sie napisany w 95% brakuje mi tylko nastepujacj funkcji:
    Jeżeli S1 nacisniety przez np.3 sekundy to wszystkie porty sa resetowane i nastepuja funkcje jak by S1 nie byl nigdy wciwskany czyli poprostu reset procka.
    Poniżej zamieszczam kod:

    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Portc = &B1111111
            Portc = &B1111111
    Config Portd = &B11111111
          Portd = &B11111111
    S1 Alias Pinb.1
    Set Portb.1
         Declare Sub Buz
          Declare Sub Buze
    
          Do
    If S1 = 0 Then
    Portc.0 = 0
    Portd.0 = 1
    Portd.1 = 0
    Buz
    Buz
    Buz
    Buz
    Buze
    
    Portc.0 = 1
    Portd.0 = 0
    Portd.1 = 1
    
    End If
    
    If S1 = 1 Then
    Portc.0 = 1
    Portd.0 = 0
    Portd.1 = 1
    Portc.5 = 0
    End If
    
    Loop
    
    Sub Buz :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Wait 60
    
    End Sub
    
    Sub Buze :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Waitms 50
    Portc.5 = 1
    Waitms 150
    
    End Sub
    
    '***** c.0 przekaznik  0 OFF 1 ON             *****
    '***** c.5 buzzer   1 ON 0 OFF                *****
    '***** d.0 dioda                              *****
    '***** d.1 dioda                              *****
    '***** b.1 switch      0 press 1 not press    *****


    Prosze was abyscie nie krytykowali mojego kodu moze jest i poplatany ale dziala i wszystko z niego rozumiem. ZA POMOC bede gotow odwdzieczyc sie 10 pkt.
  • REKLAMA
  • Pomocny post
    #2 6880577
    wader_669
    Poziom 28  
    1. Nie wykluczyles drgan na przycisku s1
    2. Zebys wykonac to co chcesz zrobic bedzie ci potrzebne przerwanie.
    3. Dziwie sie, ze sprawnie dziala ci ten kod (chyba, ze specjalnie robisz sprawdzanie przycisku w petli, zeby nie bylo przerwania i wykonal kod do konca, a pozniej sprawdzil czy przycisk jest wcisniety. W tym przypadku przepraszam)
  • #3 6880635
    Lukaszinfer
    Poziom 12  
    Własnie sam nie wiem jestem jeszcze poczatkujacym w programowaniu. Czy moglbys dokonac swoich modyfikacji w moim kodzie i tu wrzucic? Nie wiem jak sie wyklucza drgania na S1 i nie wiem jak bedzie wygladal kod z przerwa.
  • REKLAMA
  • Pomocny post
    #4 6880656
    wader_669
    Poziom 28  
    wykluczyc drgania mozesz za pomoca funkcji debounce, albo tak:

    
    if s1=0 then 'przycisk jest wcisniety
    waitms 45 ' czekaj az mina drgania
    if s1=0 then ' gdy przycisk jest nadal wcisniety to zrob:
    
    end if
    end if
    


    Pokaz (najlepiej na schemacie) lub wyltumacz jak masz podlaczony przycisk do procesora.
    Poza tym wytlumacz mi, co dokladnie ma robic twoj kod wszystkie zalozenia i krop po kroku co ma robic procesor. Wtedy poprawie ci kod albo dam ci wskazowki
  • #5 6884119
    Lukaszinfer
    Poziom 12  
    przyciskiem jest normlny switch ktory jest podlaczony do procka przez portb.1 oczywiscie do switch jest poprowadzony - od zasilania.

    Program ma robic:
    gdy S1 jest wcisniety:
    zapala sie dioda np. D1 ale D2 sie nie pali
    zalacza sie przekaznik
    i jest wykonywana procedura ktora zalacza i rozlacza buzzerek - pikianie

    po uplywie 5 minut
    przekaznik jest wylaczany
    zapala sie dioda D2 ale D1 sie nie pall
    tak samo jak buzzer je wykonuje juz zadnej pracy.

    gdy S1 nie jest wcisniety:
    przekaznik nie zalaczony
    buzzer nic nie robi
    dioda D1 wylaczona ale D2 wlaczona

    i teraz chce gdy jest ta funkcja gdy S1 wcisniety wykonywana to np jesli przytrzymam S1 przez ok 3 sekundy to nastepuje reset calego programu, czyli tak jak by S1 nie byl wcisniety
  • REKLAMA
  • Pomocny post
    #6 6884310
    wader_669
    Poziom 28  
    dlaczego piszesz, ze masz przycisk podlaczony do zasilania (ja pod slowem zasilania do plusa) ?
    Juz sie zmartwilem.

    Tu masz poprawiony kod:

    
    
    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Portc = &B1111111
            Portc = &B1111111
    Config Portd = &B11111111
          Portd = &B11111111
    config pinb.1= input ' tego nie miales a bardzo wazne
    S1 Alias Pinb.1
    Set Portb.1
         Declare Sub Buz
          Declare Sub Buze
    
    Declare Sub X
    Dim Flaga As Bit
    Dim I As Byte
    Flaga = 0
    
    Call X
    Do
    
    If S1 = 0 Then
    Waitms 45
    If S1 = 0 Then
    
       For I = 0 To 2
          Wait 1
          If S1 = 1 Then Exit For
       Next
          If S1 = 0 Then Flaga = 1
    
    End If
    End If
    
    If Flaga = 0 Then
       Portc.0 = 0
       Portd.0 = 1
       Portd.1 = 0
    
       For I = 0 To 3
          Buz
       Next
          Buze
    
       call x
    
    Else                                                        ' gdy przycisk byl wcisniety 3 sekundy i flaga jest ustawiona na 1
     ' tu wpisz swoje instrukcje
       Flaga = 0
    
    End If
    
    Loop
    
    Sub Buz :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Wait 60
    
    End Sub
    
    Sub Buze :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Waitms 50
    Portc.5 = 1
    Waitms 150
    
    End Sub
    
    Sub X                                                       ' po co to mialo byc w petli gdy to jest tylko wykonywane na poczatku i po kazym wcisnieciu przycisku poprawilem
    Portc.0 = 1
    Portd.0 = 0
    Portd.1 = 1
    Portc.5 = 0
    End Sub
    
    '***** c.0 przekaznik  0 OFF 1 ON             *****
    '***** c.5 buzzer   1 ON 0 OFF                *****
    '***** d.0 dioda                              *****
    '***** d.1 dioda                              *****
    '***** b.1 switch      0 press 1 not press    *****
    


    jak sie nie myle to powinien teraz dobrze dzialac. Sam jestem ciekaw czy wszystko dobrze zrozumialem i czy nie ma zadnego bledu

    Dodano po 3 [minuty]:

    wiec nie trzeba bylo uzywac przerwania.

    Dodano po 3 [minuty]:

    Moze wyglada na troche wiecej i jest bardziej skomplikowany kod, ale prockowi naprawde bedzie latwiej.
  • #7 6884356
    Lukaszinfer
    Poziom 12  
    powiem tak wielkie dzieki za pomoc ale teraz to juz nic nie rozumiem i w dodatku program nie dziala
  • REKLAMA
  • Pomocny post
    #8 6884372
    wader_669
    Poziom 28  
    serjo ? hahaha to bajer. Cos sie wymysli. Jak to sie objawia?
    
    
    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Portc = &B1111111
            Portc = &B1111111
    Config Portd = &B11111111
          Portd = &B11111111
    config pinb.1= input ' tego nie miales a bardzo wazne
    S1 Alias Pinb.1
    Set Portb.1
         Declare Sub Buz
          Declare Sub Buze
    
    Declare Sub X
    Dim I As Byte
    
    Call X
    Do
    
    If S1 = 0 Then
    Waitms 45
    If S1 = 0 Then
    
    
    Portc.0 = 0
    Portd.0 = 1
    Portd.1 = 0
    
    For I = 0 To 3
       Buz
    Next
       Buze
    
    Call X
    End If
    End If
    Loop
    
    Sub Buz :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Wait 60
    
    End Sub
    
    Sub Buze :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Waitms 50
    Portc.5 = 1
    Waitms 150
    
    End Sub
    
    Sub X                                                       ' po co to mialo byc w petli gdy to jest tylko wykonywane na poczatku i po kazym wcisnieciu przycisku poprawilem
    Portc.0 = 1
    Portd.0 = 0
    Portd.1 = 1
    Portc.5 = 0
    End Sub
    
    '***** c.0 przekaznik  0 OFF 1 ON             *****
    '***** c.5 buzzer   1 ON 0 OFF                *****
    '***** d.0 dioda                              *****
    '***** d.1 dioda                              *****
    '***** b.1 switch      0 press 1 not press    *****
    


    wytestuj ten (jest bez tej opcji restartu)
  • #9 6884382
    Lukaszinfer
    Poziom 12  
    OK ten jest w pozatku ale kurcze moze wymyslisz jeszcze cos aby byl ten reset
  • Pomocny post
    #10 6884388
    wader_669
    Poziom 28  
    prosta sprawa zpomnialem powstawiac end if i tyle. Sam mogles na to wpasc gdzie je powstawiac. Pisalem z glowy dlatego i nie sprawdzalem go.

    Poprawilem 1 kod sprawdz czy dziala
  • #11 6884423
    Lukaszinfer
    Poziom 12  
    Sluchaj jesli chodzi o ten twoj pierwszy kod to nie dzialal ale zmienilem 0 na 1 przy fladze i chodzi ale tak ze procedura jest wlaczana po 3 sekundach a nie resetowana

    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Portc = &B1111111
            Portc = &B1111111
    Config Portd = &B11111111
          Portd = &B11111111
    config pinb.1= input ' tego nie miales a bardzo wazne
    S1 Alias Pinb.1
    Set Portb.1
         Declare Sub Buz
          Declare Sub Buze
    
    Declare Sub X
    Dim Flaga As Bit
    Dim I As Byte
    Flaga = 0
    
    Call X
    Do
    
    If S1 = 0 Then
    Waitms 45
    If S1 = 0 Then
    
       For I = 0 To 2
          Wait 1
          If S1 = 1 Then Exit For
       Next
          If S1 = 0 Then Flaga = 1
    
    End If
    End If
    
    If Flaga = 1 Then               ' tu zmienilem
       Portc.0 = 0
       Portd.0 = 1
       Portd.1 = 0
    
       For I = 0 To 3
          Buz
       Next
          Buze
    
       call x
    
    Else                                                        ' gdy przycisk byl wcisniety 3 sekundy i flaga jest ustawiona na 1
    Call X
       Flaga = 0
    
    End If
    
    Loop
    
    Sub Buz :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Wait 60
    
    End Sub
    
    Sub Buze :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Waitms 50
    Portc.5 = 1
    Waitms 150
    
    End Sub
    
    Sub X                                                       ' po co to mialo byc w petli gdy to jest tylko wykonywane na poczatku i po kazym wcisnieciu przycisku poprawilem
    Portc.0 = 1
    Portd.0 = 0
    Portd.1 = 1
    Portc.5 = 0
    End Sub
    
    '***** c.0 przekaznik  0 OFF 1 ON             *****
    '***** c.5 buzzer   1 ON 0 OFF                *****
    '***** d.0 dioda                              *****
    '***** d.1 dioda                              *****
    '***** b.1 switch      0 press 1 not press    *****
  • Pomocny post
    #12 6884426
    wader_669
    Poziom 28  
    
    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Portc = &B1111111
            Portc = &B1111111
    Config Portd = &B11111111
          Portd = &B11111111
    config pinb.1= input ' tego nie miales a bardzo wazne
    S1 Alias Pinb.1
    Set Portb.1
         Declare Sub Buz
          Declare Sub Buze
    
    Declare Sub X
    Dim Flaga As Bit
    Dim I As Byte
    Flaga = 0
    
    Call X
    Do
    
    If S1 = 0 Then
    Waitms 45
    If S1 = 0 Then
    
       For I = 0 To 2
          Wait 1
          If S1 = 1 Then
              flaga=0
              Exit For
          end if
       Next
          
         If S1 = 0 Then 
            Flaga = 1
          end if
    
    End If
    End If
    
    If Flaga = 0 Then
       Portc.0 = 0
       Portd.0 = 1
       Portd.1 = 0
    
       For I = 0 To 3
          Buz
       Next
          Buze
    
       call x
    
    Else                                                        ' gdy przycisk byl wcisniety 3 sekundy i flaga jest ustawiona na 1
     ' tu wpisz swoje instrukcje
       Flaga = 0
    
    End If
    
    Loop
    
    Sub Buz :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Wait 60
    
    End Sub
    
    Sub Buze :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Waitms 50
    Portc.5 = 1
    Waitms 150
    
    End Sub
    
    Sub X                                                       ' po co to mialo byc w petli gdy to jest tylko wykonywane na poczatku i po kazym wcisnieciu przycisku poprawilem
    Portc.0 = 1
    Portd.0 = 0
    Portd.1 = 1
    Portc.5 = 0
    End Sub
    
    '***** c.0 przekaznik  0 OFF 1 ON             *****
    '***** c.5 buzzer   1 ON 0 OFF                *****
    '***** d.0 dioda                              *****
    '***** d.1 dioda                              *****
    '***** b.1 switch      0 press 1 not press    ***** 
    


    Dodano po 10 [minuty]:

    zeby byc na 100 % pewnym poprawilem kod. Tam gdzie ci wpisalem moj komentarz "tu wpisz swoje intruckcje" masz tam wpisac jak ma wygladac ten restart.

    Zebysmy sie dobrze rozumieli co ten kod narazie robi:
    poczatek programu:
    wchodzi w podprogram x
    nastepnie wchodzi w petle
    tam sprawda non stop czy przycisk jest wcisniety
    jak jest to czeka sekunde sprawda czy jest pusczony jak jest to ustawia flage na 0 i wychodzi z for
    jak nie jest puszczony to czekaj znowu sekunde i sprawda
    znowu czeka sekunde i sprawda
    pozniej jak jest nadal wcisniety to stawia flage 1
    pozniej program sprawda ktora jak flaga jest ustawiona. Jak 0 to wykonuje twoj program
    jak jest 1 to narazie nic bo musisz tam wpisac swoje instrukcje

    Gdy wykonuje twoj program to nie mozesz go przerwac wykonuje go do konca pozniej dopiero znowu wraca do petli glownej i sprawdza przycisk
  • #13 6884460
    Lukaszinfer
    Poziom 12  
    teraz gdy tylko wrzuce procka do plytki to odrazu bez naciskania S1 tak jak by S1 byl wcisniety
    i wpisalem tam swoje instrukcje i nic
  • Pomocny post
    #14 6884480
    wader_669
    Poziom 28  
    ej racja, kurde. Sorry przeoczylem to oczywiscie :D

    Dodano po 4 [minuty]:

    
    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Portc = &B1111111
            Portc = &B1111111
    Config Portd = &B11111111
          Portd = &B11111111
    config pinb.1= input ' tego nie miales a bardzo wazne
    S1 Alias Pinb.1
    Set Portb.1
         Declare Sub Buz
          Declare Sub Buze
    
    Declare Sub X
    Dim I As Byte
    Dim J As Byte
    
    Call X
    Do
    
    If S1 = 0 Then
    Waitms 45
    If S1 = 0 Then
    
       For I = 0 To 2
          Wait 1
          If S1 = 1 Then
             Portc.0 = 0
             Portd.0 = 1
             Portd.1 = 0
    
             For J = 0 To 3
                Buz
             Next
                Buze
    
                Call X
    
              Exit For
          end if
       Next
    
         If S1 = 0 Then
            ' gdy przycisk byl wcisniety 3 sekundy/ wpisz tu instrukcje
          end if
    
    End If
    End If
    
    
    Loop
    
    Sub Buz :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Wait 60
    
    End Sub
    
    Sub Buze :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Waitms 50
    Portc.5 = 1
    Waitms 150
    
    End Sub
    
    Sub X                                                       ' po co to mialo byc w petli gdy to jest tylko wykonywane na poczatku i po kazym wcisnieciu przycisku poprawilem
    Portc.0 = 1
    Portd.0 = 0
    Portd.1 = 1
    Portc.5 = 0
    End Sub
    
    '***** c.0 przekaznik  0 OFF 1 ON             *****
    '***** c.5 buzzer   1 ON 0 OFF                *****
    '***** d.0 dioda                              *****
    '***** d.1 dioda                              *****
    '***** b.1 switch      0 press 1 not press    *****
    


    teraz jak nie bedzie dzialac to ci nie pomoge :P
  • #15 6884515
    Lukaszinfer
    Poziom 12  
    i znowu nic ale i tak wielkie dzieki pokombinuje jeszcze z tym twoim programym i najwyzej podcoagne tranzystor do reset ATMEGI wiem ze to ja moze zorwalic no ale trudno albo poprostu zrezygnuje z tej funkci reset przelewam ci 10 pkt i wszystkie twoje posty ocaniam na POMOGL
  • #16 6884544
    wader_669
    Poziom 28  
    10 pkt nie jest mi potrzbene jak widzisz ale dzieki za pomogl
    _________________________________________________

    
    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Portc = &B1111111
            Portc = &B1111111
    Config Portd = &B11111111
          Portd = &B11111111
    Config Pinb.1 = Input                                       ' tego nie miales a bardzo wazne
    S1 Alias Pinb.1
    Set Portb.1
         Declare Sub Buz
          Declare Sub Buze
    
    Declare Sub X
    Dim I As Byte
    Dim Flaga As Byte
    Flaga = 0
    Call X
    Do
    If Flaga = 0 Then
    
       If S1 = 0 Then
       Waitms 45
       If S1 = 0 Then
    
          For I = 0 To 2
             Wait 1
             If S1 = 1 Then
             Flaga = 1
             Exit For
             End If
          Next
    
       If Flaga = 0 And S1 = 0 Then
       Flaga = 2 
       End If
    
    End If
    End If
    
    Else If Flaga = 1 Then
       Portc.0 = 0
       Portd.0 = 1
       Portd.1 = 0
    
          For I = 0 To 3
             Buz
          Next
             Buze
    
       Call X
       Flaga = 0
    
    Elseif Flaga = 2 Then
       'restart
       Flaga = 0
    End If
    Loop
    
    Sub Buz :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Wait 60
    
    End Sub
    
    Sub Buze :
    Portc.5 = 1
    Waitms 100
    Portc.5 = 0
    Waitms 50
    Portc.5 = 1
    Waitms 150
    
    End Sub
    
    Sub X                                                       ' po co to mialo byc w petli gdy to jest tylko wykonywane na poczatku i po kazym wcisnieciu przycisku poprawilem
    Portc.0 = 1
    Portd.0 = 0
    Portd.1 = 1
    Portc.5 = 0
    End Sub
    
    '***** c.0 przekaznik  0 OFF 1 ON             *****
    '***** c.5 buzzer   1 ON 0 OFF                *****
    '***** d.0 dioda                              *****
    '***** d.1 dioda                              *****
    '***** b.1 switch      0 press 1 not press    *****
    


    Dawaj ten kod. Wczoraj jak lekko napity wracalem do domu wpadlem na pomysl, jestem ciekaw czy teraz bedzie dzialac. Lekka siara, ze z takim latwym programem nie moge sobie dac rady :P
  • #17 6892786
    Lukaszinfer
    Poziom 12  
    i znowu nic ale i tak wilekie dzieki. Ale poczekaj chwilke mam nadzieje ze wiesz ze chodzilo mi aby ten reset mogl byc w kazdej chwili?
  • Pomocny post
    #18 6894732
    wader_669
    Poziom 28  
    Tlumaczylem, ze restart bedzie tylko raz mozliwy, w petli programu.
    Nie napisales jasno, ze ma byc w kazdej chwili. Moze jutro ci wlepie kawalek kodu.
    ______________________________________________________
    
    CONFIG INTx = LOW LEVEL
    On Intx Przerwanie
    Enable Interrupts
    
    do
    
    loop:end
    
    Przerwanie:
    disable intx
    
    '.... tu reset
    '....
    
    enable intx
    Return
    

    _____________________________________________________
    Czas zebys sam troche pomyslal. Dalem ci jak wyglada to przerwanie. Przycisk musisz przenies na jakiegos int'a.
    Najlepiej by bylo ustawic jakas flage w przerwaniu, nie wiem czy u ciebie bedzie to mozliwe.
    Wiec bedziesz musial w przerwania zrobic ta petle "for" z "waitem". Co nie jest poprawne ale innaczej sie nie da (moim zdaniem).
    Z gory mowie, ze: jak wdusisz przycisk w trakcie trwania programu to zostanie on przerwany na czas az nie puscisz przycisku.
    Dalo by rade zrobic to na przerwaniu i timerze, wtedy glowny program prawie bez zauwazalnej zmiany mogl by chodzic dalej. Tego jednak ci nie pokaze bo mi sie nie chce. Jest to duzo wiecej roboty.
REKLAMA