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

Jak ograniczyć zliczanie impulsów enkodera w Bascom na Atmega?

henryxxl 02 Mar 2014 14:44 2175 11
REKLAMA
  • #1 13361908
    henryxxl
    Poziom 26  
    Witam.
    Chcę napisać program do obsługi enkodera, problem polega na tym że podczas widzenia się diody nadawczej z odbiorczą program zlicza spora ilość impulsów a chcę aby do zmiennej dodawało tylko +1. Proszę o pomoc. Enkoder podłączony jest bezpośrednio do atmegi i działa, błąd jest w programie.
    Pozdrawiam
    Jak ograniczyć zliczanie impulsów enkodera w Bascom na Atmega?
    Jak ograniczyć zliczanie impulsów enkodera w Bascom na Atmega?

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 13362025
    Mateusz@
    Poziom 18  
    Według mnie tranzystor nie wymusza odpowiednio stanu niskiego na pinie.
    Podaj jakie napięcia masz na pinie gdy nie ma przesłony.
    Brakuje rezystor przy diodzie, mam nadzieje że to tylko na schemacie brakuje.
  • #3 13362215
    henryxxl
    Poziom 26  
    Tranzystor wymusza stan niski na pinie, prosty program zapalający diodę jak jest przesłona, działa. Oczywiście że jest dany rezystor. Problem polega na tym że jak zewrę do masy pin portd.2 to licznik cały czas liczy a chcę aby tylko raz dodał do zmiennej +1.
  • REKLAMA
  • #4 13362591
    Konto nie istnieje
    Poziom 1  
  • #5 13362678
    Mateusz@
    Poziom 18  
    henryxxl Ale w programie ma napisane
    Config Int0 = Falling

    spróbuj ustawić ręcznie bity ISC01 ISC00, może bascom coś miesza.

    Dodano po 5 [minuty]:

    Zamiast Config Int0 = Falling
    wpisz
    MCUCR.1 = 1
    MCUCR.0=0 (tej lini nie musisz bo domyślnie jest 0)
  • REKLAMA
  • #7 13363555
    Mateusz@
    Poziom 18  
    henryxxl napisał:
    Nie wiem jak napisać przerwanie aby w kółko się nie wykonywało jak jest stan niski.

    Po prostu konfiguruje się przerwanie inne niż LOW LEVEL. Domyślnie jest low lewel dlatego mam podejrzenie że bascom coś namieszał i nie zmienił.
    Spróbuj też dodać jakiś mały kondensator, może jakieś szpilko się pojawiają i zlicza Ci dodatkowe impulsy.
  • #8 13380776
    Tomaszek_
    Poziom 11  
    nie no to jasne ... jak coś komuś nie wychodzi to na bank wina Bascoma ...
    tylko ze jak ma liczyć impulsy to ma być skonfigurowany jako licznik COUNTER a nie jako czasomierz TIMER
    czyli nie
    CONFIG TIMER0 = TIMER , PRESCALE= 1 | 8 | 64 | 256 | 1024
    tylko
    CONFIG TIMER0 = COUNTER , EDGE= RISING | FALLING
  • #9 13381098
    Mateusz@
    Poziom 18  
    Tomaszek_ A co ma timer do tego? Zmienna A zwiększa się o 1 podczas przerwania od pinu INT0.


    Też nie jestem za zwalaniem winy na Bascom. Nigdy mi się nie zdarzyło żeby Bascom namieszał coś.
  • #10 13381933
    henryxxl
    Poziom 26  
    Nie składam winy na bascom tylko proszę o pomoc kolegów. Problemu z zliczaniem impulsów już nie mam.
    Napisałem program lecz jest on napisany fatalnie dlatego że nie mam pomysłu w jaki inny sposób go napisać. Może koledzy wskażą mi jak to napisać lepiej dlatego że stos mi się przepełnia i program "wariuje".
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #11 13383400
    Mateusz@
    Poziom 18  
    Kolego niewłaściwi używasz instrukcji gosub. Procesor wchodząc w podprogram odkłada na stosie adres powrotny a odczytuje je ze stosu (i usuwa) jak powraca z podprogramu (instrukcja return). A u Ciebie brakuje tej instrukcji. Wchodzisz ciągle w nowy podprogram nie wychodząc z poprzedniego. Jeśli tak chcesz pisać podprogram (z myślą że nie będziesz z niego) to używaj instrukcji goto. Ale nie zaleca się stosować goto ( nie do końca wiem dlaczego).
REKLAMA