RP2040 PIO

Potrzebuję zrobić enkoder kwadraturowy na Raspberry Pi Pico. Spróbowałem tego:

formatting link
to działa, ale ma jedną wadę: zmienia stan tylko na podstawie opadającego zbocza jednej linii - to bez sensu, bo traci się czterokrotnie rozdzielczość. Próbowałem to:
formatting link
ć na Pythona, ale nie działa - coś tam pojawiają się jakieś bzdury a później zamiera. Czy problem może być w tej dyrektywie .origin 0? Bo w Micropythonie nie ma możliwości takiej deklaracji albo o tym nie wiem.

Oczywiście chcąc nie chcąc zacząłem rozgryzać jak to PIO działa - dlaczego w ogóle nazywają to maszyną stanów?

Maszyna stanów to ja bym rozumiał jakiś rejestr do zapamiętania stanu i jeżeli maszyna jest w danym stanie to wykonuje jakiś tam kod, następnie sprawdza w kółko jakieś warunki, które powodują przejścia do innych stanów - przynajmniej ja to tak rozumiem i tak zawsze programowałem. Oczywiście taka sprzętowa maszyna powinna sprzętowo sprawdzać np. piny i zmieniać stan jaki się tam ustawi. Niestety w tym PIO czegoś takiego nie ma - sprawdza jedynie jeden pin blokujący warunek wait i instrukcja jmp, która jest jeszcze bardziej ograniczona, bo można jej przyporządkować tylko raz konkretny pin.

Reply to
Mirek
Loading thread data ...

Ogolnie: taki enkoder najlepiej sie obsluguje automatem/maszyną stanów. Tylko musi miec osobny zegar i odpowiednią szybkosc. Wydaje sie, ze w procku z takim wspomagaczem PIO powinno sie dać to zrobic, ale moze sa tam za duze ograniczenia/chcą zrobic oszczedniej.

Jesli jedno z wejsc musi byc "zegarem" do tego automatu, to sprawa sie komplikuje.

Ten drugi program chyba realizuje pierwszą koncepcje, i jest tym, czego szukasz, tylko faktycznie wymaga tego .origin Nie wiem, czy w pythonie jest nad tym jakas kontrola.

A moze połączyc jakos pythona z C?

J.

Reply to
J.F

No tak - on ma działać trochę jak ten "komputer diy" z niedawnego wątku: stan pinów obecny i poprzedni jest przesyłany jako 4 bity do licznika programu i wykonuje się wskazany przez ten licznik skok do odpowiedniej procedury.

No ale z drugiej strony czemu program nie miał by się zaczynać od adresu 0? Chyba że tam już jest jakiś program przeznaczony dla innej maszyny obsługującej coś w Pythonie - bo pamięć jest chyba wspólna dla 4-ech maszyn?

Już prędzej przerobię swoją część na C - ale to już w finalnej wersji, bo póki co tak wygodniej mi się pisze i testuje,

Reply to
Mirek

Na ile wyczytałem - jest tam jakis system ładowania tych programów do pamieci, i python ładuje tam, gdzie mu sie wydaje najlepiej. I kontroli na tym nie masz, trzeba by grzebac w źródlach i poprawiac. Albo hasło rzucic - może ktos poprawi.

Ale tu masz jeden obiekt z C do uzycia w Pythonie ...

J.

Reply to
J.F

Coś w tym rodzaju?

formatting link
Na chwilę obecną jednak dam sobie spokój - chyba wystarczy mi taka rozdzielczość jak mam teraz. Jest mniejsza tylko dwukrotnie a nie czterokrotnie jak wcześniej pisałem. Do tego zwiększyłem liczbę przesłon: transoptory mam w rozstawie 6mm, więc pierwotnie zrobiłem 12mm przesłonę i 12mm otwór, Okazuje się, że równie dobrze mogę zrobić 4mm przesłony i 4mm otwory (ale nie potrafię tego matematycznie uzasadnić ;)), powiększyłem trochę tarczę enkodera i jest prawie 4 razy gęściej.

Jeszcze pozostaje precyzja wykonania tej tarczy. Sprawdzałem oscyloskopem i ciężko jest uzyskać idealnie symetryczny przebieg, tzn żeby wypełnienie było 50/50 i zbocza jednego czujnika wypadały dokładnie w połowie drugiego.

Reply to
Mirek

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.