Pilna sprawa - dekoder kwadraturowy na AVR - fragment softu

Witam!

Mam bardzo pilną sprawę i niestety chyba nie dam rady napisać od zera na szybko odpowiedniego algorytmu.

Jest enkoder obrotowy - generuje 2 przebiegi wypełnione 50% przesunięte o 90 st.

Muszę na szybko zrobić licznik zliczający góra/dół i wyrowadzający tą wartośc na 8 pinów na zewnątrz (może na więcej, musze to niestety prowizorycznie na szybko wpiąc w port drukarki).

Czy ktoś z szanownych grupowiczów poratował by mnie fragmentem pozwalającym zliczac i dekodować impulsy ? ASM albo BASCOM, nie ma dla mnie znaczenia. C odpada, nie mam niestety czasu instalować środowiska gcc, robota bardzo pilna, na wczoraj.

Wydaje mi sie, że całośc powinna chodzić na przerwaniach, dlatego od ręki cięzko mi to napisać.

uC to tylko AVR (zapewne 90s2313 - mam ograniczone pole manewru).

Jakiś kawałek kodu, jeśli można prosić.

Zakup scalaczków robiących to sprzętowo nie wchodzi w grę, musi być dzisiaj zrobione. Równolegle sam będę dłubał, może mi się uda.

Przy okazji: czy dekodowanie przez uC tego sygnału jest mi w stanie zapewnić powtarzalnośc - zakładając brak jakichkolwiek problemów z impulsami. Innymi słowy 1000 obrotów i powracam w dokładnie to samo miejsce ?

Pozdrawiam.

Reply to
Sebastian Bialy
Loading thread data ...
Reply to
Marek Dzwonnik

Jest, ale trzeba powalczyc troche z czystoscia sygnalow (jesli to jakas maszyneria - moze byc nielatwo). Bywa rowniez, ze sam inkremental generuje smiecie w sytuacjach ciezkich (powiedzmy rezonans mechaniki, udary... mialem tak z przetwornikami impol-u). Jesli przetwornik ma trzeci kanal, to mozna postarac sie go uzyc w celach powiedzmy diagnostycznych (wykrycie rozbierznosci to jedno, trzeba zdecydowac co z tym zrobic - to drugie). Da sie z jego pomoca okreslic polozenie z dokladnoscia do 1/4 okresu kanalu podstawowego. Na koniec jeszcze - dobra zasada jest stosowanie przetwornikow bardziej rozdzielczych niz wynika to z obliczen, a juz na pewno nie jest dobrym pomyslem praca w ukladzie x4 (jesli srodowisko ciezkie).

__ Pzd, Irek.N.

Reply to
Ireneusz Niemczyk

Dziękuje serdecznie za odpowiedzi, w szczególności Markowi, który mimo, jak sam przyznał, braku znajomości BASCOMA pomógł mi z jedną drobą sprawą - która uratowała mi pare godzin grzebania w helpie.

Problem rozwiązałem przed chwilą. Zaprogramowałem 2313 z algorytmem typu pooling w nieskończonej pętli. Badane były obydwa stany lini z enkodera i w razie wykrycia zmiany w tablicy odszukiwałem czy dodać czy odjąć sygnał (jakoś nic mi nie przyszło do głowy, co można by łatwo wyliczyć z obydwu stanów przed i po, więc zostało sięganie do tablicy).

Wewnętrzny licznik 16 bitowy nie starcza na długo niestety, bo sam enkoder ma katalogową dokładnośc 300 pkt, ale tak naprawdę wyszło 1200 pkt.

Przesyłanie musiałem zrobić na szybko przez port LPT. Dane sa wystawiane na port osobno bajt starszy i osobno młodszy. Oczywiście program dba o to, aby nie zaszła sytuacja wyścigu i wewnętrzny licznik do odczytu jest blokowany (rzeczywisty liczy cały czas).

Oprogramowanie na kompie używa 32 bitowego licznika, co wydaje mi się być wystarczające do mojego zastosowania ;)

Jak na parogodzinny kawałek elektroniki + soft (i płytka uniwersalna) to jestem zadowolony, że w ogóle zadziałało :)

To tyle chwalenia się. Pozdrawiam.

Reply to
Sebastian Bialy

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.