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: Generowanie impulsu 50ms na ATtiny2313 przy wciśnięciu i zwolnieniu przycisku

siewnik 28 Lut 2008 10:57 2867 13
REKLAMA
  • #1 4854339
    siewnik
    Poziom 15  
    Posty: 206
    Ocena: 122
    Witam

    Mam taki problem. Chce napisac w bascomie program dla atiny2313, ktory ma dzialac nastepujaco: jezeli wcisne np PinD.0 to na PortD.1 ma sie wygenerowac impuls o czasie trwania 50ms a nastepnie jak zwolnie przycisk (PinD.0) to znowu ma sie wygenerowac impuls na PortD.1 o czasie trwania 50ms. Czyli tak, po wcisnieciu i trzymaniu przycisku ma sie jeden raz wygenerowac sygnal a nastepnie program ma czekac na zwolnienie przycisku. Jak nastapi zwolnienie to znowu na wyjsciu ma sie wygenerowac sygnal. Probowalem juz na rozne sposoby ale nie wychodzi. Jezeli ktos z was ma jakies sugestie to bede wdzieczny za wszelka pomoc

    pozdrawiam DAWID
  • REKLAMA
  • #2 4854373
    Pituś Bajtuś
    Poziom 28  
    Posty: 934
    Pomógł: 137
    Ocena: 10
    Pokazałbyś te swoje "różne sposoby" to jakaś pomoc zapewne by się znalazła. A tak to nie wiemy od czego zacząć...
  • REKLAMA
  • #3 4854426
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Bardzo jestes przywiązany do portu D,0???????
  • #4 4855175
    siewnik
    Poziom 15  
    Posty: 206
    Ocena: 122
    $regfile = "m128def.dat"
    $crystal = 16000000
    
    Config Porte = Input
            Porte = &B11111110
    Config Portb = Input
            Portb = &B11111111
    Config Portd = Input
            Portd = &B11111111
    
    Config Portc = Output
            Portc = &B00000000
    Config Porta = Output
            Porta = &B00000000
    Config Portf = Output
            Portf = &B00000000
    
    
    Dim K1 As Byte
    K1 = 0
    
    Do
    
    If Pine.0 = 0 Then
       Incr K1
    
          If K1 = 1 Then
             Set Portc.0
             Waitms 50
             Reset Portc.0
    
                If Pine.0 = 1 Then
                   Incr K1
    
                      If K1 = 2 Then
                         Set Portc.0
                         Waitms 50
                         Reset Portc.0
    
                         K1 = 0
    
    End If
    End If
    End If
    End If
    
    Loop
    End
    
    
    
    asembler: nie przywiazalem sie, tylko podalem dla przykladu... ;-)
  • #5 4855198
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    No to jak sie nie przywiązałes to mozna to zrobic za pomocą przerwania zewnetrznego portd,2 lub port d,3 ustawiony tak aby reagowal na oba zbocza.
    Zapytałem o przywiązanie bo nie napisałes ze dla przykladu port d,0
  • REKLAMA
  • #6 4855221
    Pijopic
    Poziom 17  
    Posty: 235
    Pomógł: 10
    Ocena: 2
    Zrob to na przerwaniach, tylko musisz za kazdym razem zmieniac tryb wyzwalania lub lepiej ustawic na oba jesli sie da (nie pamietam jakie sa opcje w t2313).
  • #7 4855335
    siewnik
    Poziom 15  
    Posty: 206
    Ocena: 122
    tak, tylko ze ja nigdy sie nie bawilem przerwaniami i przydalby mi sie jakis przykaldowy kod programu lub cos podobnego...
  • Pomocny post
    #8 4857242
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Witam.
    Nie sprawdzałem tego, ale proponowałbym coś takiego:

    W pętli głównej programu
    
    Main:
    Do
    
    If K1 = 0 Then
    Call Generacja
    End If
    .......
    Loop
    End
    


    W podprogramie

    
    Sub Generacja
    If K1 = 0 Then
    Set ...jakis port
    Waitms 50
    Reset ... jakis port
    End If
    
    Do
    If K1 = 0 Then
    Loop
    End If
    
    If K1 = 1 Then
    Set ... jakis port
    Waitms 50
    Reset ... jakis port
    Exit Sub
    End If
    
    End Sub
    

    Co Ty na to...?.

    Daje to taką możliwość, że program w pętli głównej nie będzie sprawdzał warunku nie wciśnietego przycisku. Dopiero jego wciśnięcie będzie sprawdzało jego stan po wciśnięciu tzn czy jeszcze jest wciśnięty, a po puszczeniu wygeneruje impuls i wróci do pętli głównej. Tak jest chyba najprościej, a skutecznie.

    Pozdrawiam
  • #9 4860404
    siewnik
    Poziom 15  
    Posty: 206
    Ocena: 122
    Madergames9
    dzieki za pomoc, ale to nie bedzie tak dzialalo ze jak bedzie spelniony warunek np K=1 to on caly czas bedzie generowal ten impuls? teraz nie mam mozliwosci tego sprawdzenia w rzeczywistosci, ale ja chce aby po wcisnieciu przycisku wygeberowal impuls i koniec i jak bede go nadal trzymal nawet godzine to ma juz nic wiecej nie robic i tak samo jak klawisz puszcze
  • REKLAMA
  • Pomocny post
    #10 4860477
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Witam.
    Program według mnie jest przejrzysty. Po wejściu do podprogramu pierwsze If... sprawdzi jeszcze raz czy jest wciśnięty przycisk K1 wygeneruje impuls i wejdzie w pętlę Do... Loop o ile w dalszym ciągu jest wciśnięty przycisk. Jeżeli nie to wygeneruje jescze raz impuls jeszcze raz i wyjdzie z podprogramu. Ja również tego nie sprawdzałem, ale powinno to zadziałać. Zauważ, że pętla Do... jest już po wygenerowaniu pierwszego impulsu, więc program powinien zapętlić się już po nim więc nie powinien wygenerować kolejnych impulsów pomimo trzymania przycisku K1. To tak z założenia powinno działać.
    Pozdrawiam

    Jeszcze jedno Wejście do podprogramu z programu głównego następuje jak jest wciśnięty przycisk K1 a wyjście z podprogramu jak jest puszczony więc powinno być oki impuls po puszczeniu K1 również zostanie wygenerowany tylko raz.
  • #11 4862039
    siewnik
    Poziom 15  
    Posty: 206
    Ocena: 122
    Madergames9 dzieki wielkie za pomoc, teraz wszystko jasne, pozdrawiam :-)

    Dodano po 1 [godziny] 11 [minuty]:

    fajnie dziala, ale mam jeszcze jedno pytanko jak zamienic zmienna K1 na przycisk, tzn. jak zmienaic przyciskiem Stan K1 (wcisniecie pind.0 k1=0 a zwolnienie przycisku pind.0 k1=1)?
  • Pomocny post
    #12 4863251
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Witam.
    Załóżmy, że podłączysz przycisk do (załóżmy) Pinc.0 trzeba wstępnie skonfigurować go jako wejście, oraz podciągnąć go do plusa zasilania pullup-em. Więc stan spoczynkowy wejścia będzie miał logiczną jedynke. Przycisk podłączony jedną stroną do portu a drugą stroną do masy więc :
    Stan spoczynkowy na tym porcie to "1" a gdy wciśnięty to "0" i takie wartości trzeba uwzględnić. W programie, który wcześniej napisałem K1 trzeba zamienić na Pinc.0 = 1 lub Pinc.0 = 0. Mógłbyś również wprowadzić Alias więc byłoby tak "K1 Alias Pinc.0" wtedy w programie nie musiałbyś już nic zmieniać
    Pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy problemu generowania impulsu o czasie trwania 50 ms na wyjściu PortD.1 mikrokontrolera ATtiny2313 w języku Bascom po wciśnięciu i zwolnieniu przycisku podłączonego do PortD.0. Autor chce, aby impuls był generowany jednokrotnie przy naciśnięciu i jednokrotnie przy zwolnieniu przycisku, bez powtarzania impulsów podczas długiego przytrzymania. Wskazano, że można rozwiązać problem za pomocą przerwań zewnętrznych na pinach PortD.2 lub PortD.3, które reagują na oba zbocza sygnału, jednak autor nie miał doświadczenia z przerwaniami i prosił o przykładowy kod. Zaproponowano implementację w pętli głównej z podprogramem generującym impuls, który po wykryciu wciśnięcia przycisku generuje impuls i czeka na jego zwolnienie, po czym generuje drugi impuls i wraca do oczekiwania. Omówiono również konfigurację wejścia przycisku z podciąganiem (pull-up), gdzie stan spoczynkowy to logiczna jedynka, a wciśnięcie przycisku powoduje stan niski. Sugerowano użycie aliasu dla uproszczenia obsługi stanu przycisku w kodzie. Dyskusja zawierała przykładowy kod Bascom oraz wyjaśnienia dotyczące logiki działania programu, zapewniające jednokrotne generowanie impulsów przy zmianie stanu przycisku.
Wygenerowane przez model językowy.
REKLAMA