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 Atmega16 - dioda nie gaśnie po wciśnięciu klawisza, co poprawić?

pawelj 12 Lip 2007 22:10 1359 6
REKLAMA
  • #1 4076487
    pawelj
    Poziom 15  
    Posty: 228
    Ocena: 34
    Witam.
    Stworzyłem w bascomie program. Ma działać tak, że po wciśnięciu klawisza zgaśnie dioda. Ale nie działa. Czy ktoś by mógł podpowiedzieć dlaczego?

    
    $regfile = "m16def.dat"
    $crystal = 16000000
    Config Pina.7 = Output
    Config Pina.2 = Input
     Porta.7 = 0
     Set Porta.2
    Do
    If Porta.2 = 0 Then
    Porta.7 = 1
    Wait 1
    End If
    Loop
    End
    


    Dioda podpięta do pinu 7 świeci cały czas. Pin 2 jest podpięty do +5v przez rezystor 1k. Wciśnięcie wyłącznika powoduje zwarcie tego pinu do masy.
    Pewnie gdzieś robię błąd tylko nie mam pojęcia gdzie. Czy może ktoś mnie naprowadzić?

    PawełJ
  • REKLAMA
  • REKLAMA
  • #3 4076733
    gufiak
    Poziom 21  
    Posty: 444
    Pomógł: 15
    Ocena: 2
    Nie znam się na bascomie, ale nie widzę żebyś gdzieś użył metodę "debounce". A, i jeśli się nie mylę, to odczytywać powinieneś z "Pina", a nie z "Porta". A w linii z If wykonujesz odczyt z portu, a nie zapis do niego.
  • REKLAMA
  • #4 4076776
    ducker1
    Poziom 26  
    Posty: 855
    Pomógł: 69
    Ocena: 83
    Takie proste odczytywanie klawisza można zrobić na pętli if, Jest to wprawdzie zawodne i nie dokładne ale jak sie nie klika szybko klawiszem to działa. Fakt ze debounce jest komendą stworzoną właśnie do obsługi klawiatury ale wydaje mi sie ze pawelj dopiero się uczy bascoma bo raczej nie kupował by Atmegi16 po to żeby sobie diodę zaświecić :P

    Pozdrawiam Damian
  • #5 4076800
    gufiak
    Poziom 21  
    Posty: 444
    Pomógł: 15
    Ocena: 2
    Nieraz przekonałem się, że bez debounca na zwykłym dip-switchu efekt może być taki, że wygląda jakby nic się nie działo. Oczywiście za którymś przyciśnięciem musi zgasnąć czy zaświecić się dioda, ale żeby działało to jak należy trzeba użyć tej metody. A to że uczy się to oczywiste. I myślę, że to jest najlepsza okazja, żeby powiedzieć o tej metodzie.
  • REKLAMA
  • #6 4078259
    pph
    Poziom 13  
    Posty: 28
    Ocena: 8
    Przy takim napisaniu programu funkcja debounce nie jest potrzebna bo jest wait 1 i to ona przytrzyma informacje o stanie przycisku.

    Wyrzuć " Set Porta.2" bo w tym przypadku nie jest potrzebne, jeśli definiujesz porty jako wejścia to będą podciągane do góry wewnątrz procka.

    Poza tym ducker1 dobrze napisał. W Bascomie aby zobaczyć stan rejestru odpowiadajacego za stany na danym porcie trzeba w Twoim przypadku napisać :

    if pina.2 = 0 then...

    a jeśli będziesz chciał sterować zapisem do rejestru portu to piszesz

    portb="liczba"
    lub
    portb.1=0/1

    A, i jeszcze jedno. Zastosuj sobie do nauki komendę Toggle - wtedy będziesz miał zmianę stanu na porcie z 1 na 0 i odwrotnie bez konieczności pisania ..=0 i później ..=1
    pzdr
  • #7 4079263
    pawelj
    Poziom 15  
    Posty: 228
    Ocena: 34
    No i oczywiście zadziałało z waszą pomocą.
    Faktycznie jestem dość początkujący w bascomie i wogóle w programowaniu więc stąd takie błędy :(
    Oczywiście mój układ będzie robił troszkę więcej niż gaszenie led, ale żeby sobie programu nie komplikować to na razie próbuje "z boku"
    wklejam działający kod
    
    $regfile = "m16def.dat"
    $crystal = 16000000
    Config Pina.7 = Output
    Config Pina.1 = Input
    Do
       Porta.7 = 0
          If Pina.1 = 0 Then
          Porta.7 = 1
          Wait 1
       End If
    
    Loop
    


    Co do komendy DEBOUNCE to mam pytanie. Czy użycie tej komendy powoduje to, że program w na niej staje i czeka na zmianę stanu? Czy sprawdzi co jest i leci dalej?

    Dodano po 1 [godziny] 13 [minuty]:

    OK. Już rozszyfrowałem debounce. Śmiga program cały czas a reaguje tylko na wciśnięcie klawisza. Czyli idealnie się nadaje do mojego zastosowania :)
    Toggle też wypróbowane.
    
    $regfile = "m16def.dat"
    $crystal = 16000000
    Config Pina.7 = Output
    Config Pina.6 = Output
    
    Config Pina.2 = Input
    Config Pina.3 = Input
    
    Porta.6 = 0
    Do
      Porta.7 = 0
     Debounce Pina.2 , 0 , Skok , Sub
    
       Toggle Porta.6
    
        Wait 1
    
    Loop
    
    Skok:
    Porta.7 = 1
      Wait 1
    Return
    
    End
    


    Powyższe stworzyłem w celu rozpoznania komend toggle i debounce

    Pozdrawiam i dzięki za pomoc

Podsumowanie tematu

LABEL_AI_GENERATED
Problem dotyczył programu w Bascom dla mikrokontrolera Atmega16, w którym dioda podłączona do pinu 7 nie gasła po wciśnięciu przycisku podłączonego do pinu 2. Błąd wynikał z nieprawidłowego użycia rejestrów: do odczytu stanu przycisku należy używać rejestru Pina (np. Pina.2), natomiast do sterowania wyjściem portu – Porta (np. Porta.7). W programie błędnie odczytywano stan z Porta.2 zamiast Pina.2. Ponadto niepotrzebne było użycie komendy Set Porta.2, gdyż wejścia są domyślnie podciągane wewnętrznie. Wskazano również, że funkcja debounce jest przydatna do eliminacji drgań styków przycisku, choć w prostych zastosowaniach można ją zastąpić krótkim opóźnieniem (Wait 1). Po poprawieniu kodu i zastosowaniu właściwych rejestrów program działał poprawnie. Dodatkowo zasugerowano użycie komendy Toggle do zmiany stanu pinu wyjściowego bez konieczności ręcznego przypisywania wartości 0 lub 1.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA