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

Atmega 8 enkoder (C) - gdzie jest błąd?

matigi12 25 Paź 2011 20:25 2393 15
REKLAMA
  • #1 10065612
    matigi12
    Poziom 12  
    Mam mały problem z enkoderem ponieważ zawsze wynik mi idzie w górę zamiast raz w górę a raz w dół, pozwoliłem sobie skorzystać z kodu z tej stronki.

    U mnie to wygląda tak :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Proszę o jakieś naprowadzenie na błąd. Z góry dzięki
  • REKLAMA
  • REKLAMA
  • #3 10065649
    matigi12
    Poziom 12  
    Stykowy na 5 nogach użytkowych z czego 2 to "stycznik".
  • #4 10065660
    michalko12
    Specjalista - Mikrokontrolery
    A o break na końcu każdego case nie zapomniałeś?
  • #6 10065683
    matigi12
    Poziom 12  
    Nie, bo z break'ami to działa tak jak na górze, jak usunę je to czasem działa tak jak powinno tyle że zamiast np o 1 to leci o 300.

    Może kondensatory 100n dać?

    Nie działa coś XD
  • #7 10065828
    tos18
    Poziom 42  
    Ja to załatwiłem tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Miałem łatwiej bo enkoder optyczny.Procesorek at89c2051
    działa znakomicie.
  • REKLAMA
  • #8 10065839
    snnaap
    Poziom 25  
    Moim skromnym zdaniem
    1. kondensatory nie zaszkodzą
    2. rezystory podciągające włączone/zewnętrzne rezystory podłączone?
    3. czemu masz takie dziwne rozpoznawanie kierunku, moim zdaniem powinno być tak że cały czas czekasz na stan niski na jednej z końcówek, po jego wykryciu sprawdzasz stan drugiej końcówki impulsatora jeżeli niski to ++ jeżeli wysoki to --, a jeszcze przed sprawdzeniem drugiej końcówki trzeba wyeliminować drgania.
    4. A co do kolegi "dondu" i

    dondu napisał:
    ... i dodatkowo opóźnienie 100us to raczej za mało jak na eliminację drgań styków: http://mikrokontrolery.blogspot.com/2011/04/impulsator-stykowy.html


    to raczej te 100us w tym przypadku nie służy eliminacji styków. Kolega z chyba posiadanego doświadczenia jeżeli uważa że te 100us służy eliminacji drgań powinien zwrócić koledze uwagę że to nie wystarczy.
    A co będzie jak na wejściu pojawi się przypadkowy impuls?

    5. Nie widząc większego fragmentu kodu mogę się spodziewać że ten case leży w jakiejś pętli nieskończonej która się wykonuje o określony czas czyli o te 100us.
  • #9 10065847
    matigi12
    Poziom 12  
    Dobra jednak jestem pusty, jak pisałem break to pisałem go źle bo było tak :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    a powinno być :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Niby mały błąd ale teraz działa XD



    Cały kod wygląda tak :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 10065877
    dondu
    Moderator na urlopie...
    snnaap napisał:
    to raczej te 100us w tym przypadku nie służy eliminacji styków.

    tym gorzej jeżeli w ogóle nie bierze pod uwagę drgań styków.


    snnaap napisał:
    Kolega z chyba posiadanego doświadczenia jeżeli uważa że te 100us służy eliminacji drgań powinien zwrócić koledze uwagę że to nie wystarczy.

    czyżbym nie napisał że to za mało?:
    dondu napisał:
    ... i dodatkowo opóźnienie 100us to raczej za mało jak na eliminację drgań styków:



    snnaap napisał:
    1. kondensatory nie zaszkodzą

    Tylko po co skoro można zrobić programowo?
    Ale jeżeli już, to napisz koledze jak ma je podłączyć.
  • #11 10065898
    matigi12
    Poziom 12  
    Tak napisałeś ale wtedy mi za wolno o dziwo działał program i np. raz na 3 pstryknięcia działało z przyczyn mi do końca nie znanych.
  • REKLAMA
  • #12 10065922
    dondu
    Moderator na urlopie...
    matigi12 napisał:
    Tak napisałeś ale wtedy mi za wolno o dziwo działał program i np. raz na 3 pstryknięcia działało z przyczyn mi do końca nie znanych.

    OK, to niestety częsty problem przy pisaniu równoległym :)
  • #13 10065963
    snnaap
    Poziom 25  
    Kolego Dondu pisząc to:
    dondu napisał:
    ... i dodatkowo opóźnienie 100us to raczej za mało jak na eliminację drgań styków:

    napisał byś coś więcej i pokierowałbyś chociaż kolegę w którym kierunku ma iść. pojedyncze słowa "że to za mało" można zinterpretować błędnie tak jak ja to zrobiłem. Po Twoich słowach zrozumiałem, że opóźnienie 100us jest za krótkie i trzeba je wydłużyć np do 200us tak samo mógł pomyśleć autor - nieprawdaż . No chyba że jestem za głupi na czytanie tego forum i interpretowanie co użytkownicy mają na myśli.


    dondu napisał:
    Ale jeżeli już, to napisz koledze jak ma je podłączyć.


    Idąc kolegi torem myślenia nie muszę pisać jak to się robi ponieważ kolega opisał to już na swojej stronie Link którą poleca.
  • #14 10065964
    matigi12
    Poziom 12  
    Jutro już timera się uruchomi i będzie tam jeszcze dorzucony PWC dla silnika bezszczotkowego a dokładnie jego sterownika.
    Tak ogólnie dzięki za pomoc ;]
  • #15 10065990
    snnaap
    Poziom 25  
    matigi12 napisał:
    Tak napisałeś ale wtedy mi za wolno o dziwo działał program i np. raz na 3 pstryknięcia działało z przyczyn mi do końca nie znanych.


    Wykrywanie stanu enkodera powinno się odbywać na przerwaniu np INT0. Zwróć uwagę, że przy tak napisanym programie przy wykonywaniu fragmentu kodu

    Kod: text
    Zaloguj się, aby zobaczyć kod


    może Ci umknąć kilka "pstryknięć" o czym piszesz wyżej.
  • #16 10066017
    dondu
    Moderator na urlopie...
    snnaap napisał:
    Kolego Dondu pisząc to:
    dondu napisał:
    ... i dodatkowo opóźnienie 100us to raczej za mało jak na eliminację drgań styków:

    napisał byś coś więcej i pokierowałbyś chociaż kolegę w którym kierunku ma iść. pojedyncze słowa "że to za mało" można zinterpretować błędnie tak jak ja to zrobiłem. Po Twoich słowach zrozumiałem, że opóźnienie 100us jest za krótkie i trzeba je wydłużyć np do 200us tak samo mógł pomyśleć autor - nieprawdaż . No chyba że jestem za głupi na czytanie tego forum i interpretowanie co użytkownicy mają na myśli.

    Moja wypowiedź była nieco dłuższa i wyjaśniająca wszystko co autor spotka przy enkoderze łącznie z czasem trwania drgań:
    dondu napisał:
    ... i dodatkowo opóźnienie 100us to raczej za mało jak na eliminację drgań styków: http://mikrokontrolery.blogspot.com/2011/04/impulsator-stykowy.html



    snnaap napisał:
    Idąc kolegi torem myślenia nie muszę pisać jak to się robi ponieważ kolega opisał to już na swojej stronie Link którą poleca.

    i tam u góry właśnie pisze ile czasu trwa drganie, czyli podałem wszystkie informacje co powinien otrzymać :)
    Ale słusznie nie musiałeś już pisać, bo info o kondensatorach także, jest.
    Choć osobiście odradzam ich stosowanie - program załatwi wszystko.


    Co do przerwań , oczywiście jak najbardziej, jednak na początek sugeruję autorowi stosować zwykłe opóźnienia, by temat drgań opanować. A następną wersję już na przerwaniach pyknąć. :)
REKLAMA