Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 29 mar 2024, o 08:38


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 42 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 22 lut 2015, o 13:30 
Offline
Nowy

Dołączył(a): 09 gru 2014
Posty: 17
Pomógł: 0

To mój pierwszy post na tym zacnym forum zatem Witam Wszystkich!
Przygodę z avr zacząłem trzy miesiące temu od kilku kursików internetowych, później BB, jeszcze nie do końca ogarnięty oraz to forum (na razie w trybie Read only). Na prośbę znajomego napisałem programik, który na podstawie zliczanych impulsów z enkodera przyrostowego ma określać, w której ćwiartce okręgu znajduje się aktualnie ramię czegoś tam. Program działa, generuje poprawnie dwu bitowe słowo w kodzie Gray'a ale dodatkowo, w sposób całkowicie przypadkowy generowane są impulsy ok 5us na obu wyjściach. O ile częstotliwość występowania jest przypadkowa, to miejsce występowania jest zawsze to samo. Występują trzy przypadki, zazwyczaj pojedynczo:
a) szpilka na G1 w odległości 36 impulsów enkodera od zbocza narastającego G1;
b) szpilka na G2 w odległości 72 impulsy enkodera od zbocza narastającego G2;
c) szpilka na G1 w odległości 108 impulsów enkodera od zbocza opadającego G1.
Dodam jeszcze, że 36 to reszta z dzielenia 804/256, 72 to reszta z dzielenia 1602/256 a 108 to reszta z dzielenia 2412/256.
Zostało to pokazane na obrazkach:

ObrazekObrazekObrazek

Podaję kod źródłowy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Liczę na Waszą pomoc, jakieś wskazówki, może inny pomysł na generację tych dwóch sygnałów. Układ zmontowany na płytce uruchomieniowej oraz na stykówce, procek zmieniany na Mega168 - efekt ten sam, niestety. Jeśli post umieściłem w niewłaściwym miejscu, to proszę o przeniesienie. Pozdrawiam, Arek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 14:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lis 2012
Posty: 283
Lokalizacja: Warszawa
Pomógł: 17

Witaj,
Cytuj:
Program działa, generuje poprawnie dwu bitowe słowo w kodzie Gray'a


Patrząc na te oscylogramy, to mam wrażenie, że przy tej podstawie czasu masz przekłamania wprowadzane przez oscyloskop wynikające ze zbyt małej częstotliwości samplowania. Musiałbyś zmniejszyć podstawę czasu do milisekund, aby zobaczyć czy nie są to czasem drgania styków enkodera.
Coś jak tu:

Obrazek


Jeśli program działa prawidłowo, to nie powinno spędzać snu z powiek ;)

_________________
Pozdrawiam
Grzegorz



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 14:17 

Pomógł: 0

Cześć!
Cytuj:
na razie w trybie Read only
No teraz to już raczej Append :)

Nie mam 100% pewności co jest nie tak, ale mam kilka pomysłów:
1. To jest enkoder mechaniczny? W programie nie ma żadnego zabezpieczenia przed drganiami styków (ach! przedmówca mnie ubiegł ;d).
2. Operacje na zmiennej licznik nie są atomowe. Spróbowałbym zrobić taki myk:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę


Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 14:34 
Offline
Nowy

Dołączył(a): 09 gru 2014
Posty: 17
Pomógł: 0

Dzięki @buz11 za odpowiedź. Niestety "dodatki" na wyjściach są jak najbardziej rzeczywiste i zgodne z tym co napisałem wcześniej. Tamte zrzuty zrobiłem tylko na potrzeby lepszego zobrazowania problemu. Oto lepszy (dokładniejszy) przykład, dotyczy przypadku a), czyli 36 impulsów zliczanych przed zboczem narastającym na G1. Szpila widoczna w punkcie wyzwalania ma 4.85 us.

Obrazek

Edit:
Dzięki @wwojtek za podpowiedź, spróbuję w ten sposób. Co do enkodera, to jest to enkoder optyczny o 3216 impulsach na obrót.

Edit2:
Niestety, atomic nic nie zmienił :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 17:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lis 2012
Posty: 283
Lokalizacja: Warszawa
Pomógł: 17

Cytuj:
Niestety "dodatki" na wyjściach są jak najbardziej rzeczywiste i zgodne z tym co napisałem wcześniej


Nie napisałem, że je sobie wymyśliłeś, ale przy podstawie czasu o trzy rzędy wielkości większej od czasu trwania impulsu mierzonego jest duże prawdopodobieństwo przekłamania pomiaru przez sam oscyloskop.

Cytuj:
Szpila widoczna w punkcie wyzwalania ma 4.85 us.

Długo szukałem szpili na oscylogramie :)

Czy możesz pokazać ten impuls przy podstawie czasu 1 us? Nie sądzę, aby enkoder optyczny wprowadzał to zakłócenie, w zasadzie to niemożliwe.

_________________
Pozdrawiam
Grzegorz



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 17:59 
Offline
Nowy

Dołączył(a): 09 gru 2014
Posty: 17
Pomógł: 0

Te zakłócenia nie pochodzą od enkodera, te zakłócenia są na wyjściach. Zanim dostałem enkoder, na wejście P1 podawałem sygnał prostokątny z generatora, wejście P2 zwarte do masy. Efekt był dokładnie taki sam.

Edit:
oto szpilka przy podstawie czasu 1us:
Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 18:14 

Pomógł: 0

Sygnał zerujący to trzeci kanał enkodera (1 impuls na obrót mechaniczny?) czy jakaś krańcówka/przycisk?



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 18:16 
Offline
Nowy

Dołączył(a): 09 gru 2014
Posty: 17
Pomógł: 0

Tak, to trzeci sygnał z enkodera, jeden na pełny obrót.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 18:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2013
Posty: 223
Zbananowany użytkownik

Pomógł: 21

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


na
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Albo inną formę zachowania integralności danych przy programowaniu pseudo-współbieżnym (a do takiej można zaliczyć obsługę przerwań).

_________________
Nie pisz komentarzy - dobry kod komentuje się sam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 18:27 

Pomógł: 0

@barney - było, nie pomogło :)



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 18:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2013
Posty: 223
Zbananowany użytkownik

Pomógł: 21

Ops, no fakt. Ale i tak to trzeba w ten sposób pisać, więc powinno zostać ;)
To w takim razie zacznijmy ograniczać kod, zacznijmy od wywalenia tej konwersji na kod greya.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Nie pisz komentarzy - dobry kod komentuje się sam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 18:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
Może to nie to ale w tym kodzie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

dla licznik= (np.) 1608 spełniony jest również licznik>= 804.
Może takie coś:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 18:48 

Pomógł: 0

barney napisał(a):
Ale i tak to trzeba w ten sposób pisać, więc powinno zostać ;)
Zdecydowanie ;)

@kicajek - tam są else if'y więc po "pierwszym spełnionym" reszta warunków nie będzie w ogóle sprawdzana.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 18:51 
Offline
Użytkownik

Dołączył(a): 16 sty 2015
Posty: 84
Pomógł: 6

Moja podpowiedź to coś w stylu "jak nie kijem to młotkiem". Można spróbować wykluczyć przerwania z tego zadania (i akurat w tym konkretnym przypadku powinno to działać wystarczająco dobrze... ) i kod będzie wyglądał mniej więcej tak (nie wprowadziłem przerwania resetującego ale można to zrobić prawie identycznie zdaje się).

W przypadku niezrozumienia tematu odsyłam do poradnika Mirka odnośnie DS3231 czas 1:10:40


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Daj znać czy to rozwiązało problem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 20:13 
Offline
Nowy

Dołączył(a): 09 gru 2014
Posty: 17
Pomógł: 0

@barney nic nie zmienia.
@rekon również bez zmian :(
@squeez sygnały podawane są do jakiegoś urządzenia cyfrowego razem z sygnałami z enkodera. Próbowałem z filtrem rc oraz z wolnymi transoptorami ale wtedy sygnały rozmywały się i coś kaszaniło się w urządzeniu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 20:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

:oops:
wwojtek napisał(a):
@kicajek - tam są else if'y więc po "pierwszym spełnionym" reszta warunków nie będzie w ogóle sprawdzana.

...racja - sorry
Przynajmniej ja lepiej zapamiętam . "Sami się uczymy usiłując pamagać " :)

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 20:31 
Offline
Nowy

Dołączył(a): 09 gru 2014
Posty: 17
Pomógł: 0

No jest to jakiś pomysł i jak najbardziej jutro go przetestuję. Dzięki. Cały czas mam jednak nadzieję, że uda się to poprawić bardziej elegancko, czyli programowo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 20:34 
Offline
Użytkownik

Dołączył(a): 01 paź 2013
Posty: 305
Lokalizacja: Olsztyn
Zbananowany użytkownik

Pomógł: 20

WItam
Jakiego procka używasz ?
Bo zgłupiałem w Atmedze 168 np. bity ISC01 i 00 ustawia się w zupełnie inny rejestrze niż w twoim programie nie w MCUCR tylko w EICRA.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 20:37 
Offline
Nowy

Dołączył(a): 09 gru 2014
Posty: 17
Pomógł: 0

Procek to Attiny85, Mega168 użyłem testowo, bo pomyślałem, że może maluch uszkodzony. Na dużym było to samo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 20:41 
Offline
Użytkownik

Dołączył(a): 01 paź 2013
Posty: 305
Lokalizacja: Olsztyn
Zbananowany użytkownik

Pomógł: 20

OK prog masz na attiny85 ...ok
Sorki

------------------------ [ Dodano po: kilkunastu sekundach ]

z zasilanie jakie masz ....tak przy okazji

------------------------ [ Dodano po: 2 minutach ]

mając oscyla podłącz się jednym kanałem pod zasilanie a drugim pod sygnał i zobaczy czy ma to jakiś związek ze sobą , jest to szybki sposób i wyeliminujesz już jedno....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 20:47 

Pomógł: 0

@kicajek - święte słowa :)

Osobiście zgłaszam protest jeśli chodzi o filtry, bufory i inne rozwiązania sprzętowe. To obejście problemu. Przecież to musi działać tylko gdzieś się jakiś haczyk przyhaczył :)

@avrek - a bez przerwania od zerowania też jest to samo? Rozdzielczość enkodera na pewno jest dobra?



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 20:56 
Offline
Nowy

Dołączył(a): 09 gru 2014
Posty: 17
Pomógł: 0

@giciors Na płytce uruchomieniowej jest stabilizator a na stykówce płytka ze stabilizatorem. Jeśli sugerujesz zakłócenia spowodowane śmieciami w zasilaniu, to niestety to nie to. Jak pisałem, szpilki pojawiają się losowo, ale zawsze w tym samym miejscu. Miejsca te powiązane są (chyba) w jakiś sposób z funkcją porównywania licznika z progami.

@wwojtek Ja również widzę to jako obejście problemu i raczej ostateczność. Nie mniej jutro wypróbuję ten pomysł, tak w celach poznawczych.
Rozdzielczość enkodera jest ok. Generalnie walkę ze szpilkami toczę w oparciu o generator, który generuje impulsy przyrostu P1, P2 zwarte do masy czyli symulacja obrotu enkodera w prawo. Zerowanie podpięte pod switch, w trakcie testów w zasadzie nie używane. Podpięcie enkodera nic nie zmienia, ale trzeba wtedy kręcić ośką. Jest to niewygodne dlatego generator.



Ostatnio edytowano 22 lut 2015, o 21:04 przez avrek, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 20:59 
Offline
Użytkownik

Dołączył(a): 01 paź 2013
Posty: 305
Lokalizacja: Olsztyn
Zbananowany użytkownik

Pomógł: 20

Co wyzwala INT0 ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 21:01 
Offline
Użytkownik

Dołączył(a): 16 sty 2015
Posty: 84
Pomógł: 6

zgaduje że zegar pracuje na 8MHz?
na oko 1 pętla programu głównego (tego z pierwszego posta) to 40-50 cykli procesora a to oznacza że impuls ok. 5us to jest jeden przebieg tej pętli.
Można sprawdzić w co się dzieje ze zmienną licznik w tym czasie kiedy robi te przeskoki. To może dać jakąś tam odpowiedź na pytanie co się dzieje złego.

sprawdzać na końcu pętli co jest podawane na wyjściach G1 oraz G2 i przechowywać 2 ostatnie wartości.
Jeśli pojawi się taka sytuacja że mamy na dowolnym z wyjść 1 -> 0 -> 1 albo odwrotnie, to zapisać w pamięci eeprom obecną wartość licznika (albo wysłać ją za pomocą rs232 do komputera albo jakoś inaczej udostępnić to dla świata zewnętrznego). Odpowie to na pytanie czy licznik nie "skacze" oraz czy faktycznie generowane jest to przez procek "świadomie" ;)

Lepszego pomysłu nie mam bo wydaje się że jest to prawie nie możliwe aby to nie działało...

@wwojtek jakby było wywołane przerwanie od zerowania to pewnie było by widoczne zerowanie sygnału na obu liniach - też tam upatrywałem swojego kandydata



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 21:12 

Pomógł: 0

Hehe widzę, że nie tylko ja już zacząłem liczyć ile rozkazów procesora się mieści w tej szpilce :lol: A może by tak dodać sprawdzenie MCUSR na początku programu - można by wykluczyć resety procka.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 21:14 
Offline
Nowy

Dołączył(a): 09 gru 2014
Posty: 17
Pomógł: 0

@giciors Na Int0 podawany jest sygnał przyrostu z enkodera / generatora.
@rekon Zegar to 8MHz. Częstotliwość przyrostów P1 na Int0 to max 400Hz.
Jeśli chdzi o "sprawdzanie", o którym piszesz, to przyznam się, że nie czuję się na siłach.
@wwojtek Wydaje mi się, że resety procka można wykluczyć ponieważ po resecie licznik zawsze jest zerowany, natomiast przebiegi oglądane na oscyloskopie wyglądają cały czas prawidłowo (nie licząc szpilek oczywiście).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 22:23 
Offline
Użytkownik

Dołączył(a): 16 sty 2015
Posty: 84
Pomógł: 6

Wstaw poniższą funkcję do pliku main.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


dodaj deklarację funkcji oraz zdefiniuj obszar pamięci
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

no i na końcu pętli głównej programu dodaj wywołanie funkcji
sprawdz()

możesz wstawić 2 ledy które pokazałem w komentarzach dzięki czemu dowiesz się czy cokolwiek już złapał oraz czy już wypełnił całą pamięć

mam nadzieję że nigdzie się nie walnąłem - pisane na szybko
po wykonaniu takiego obiegu bierzesz np. mkavrcalculator i robisz odczyt eeprom i wstawiasz na forum :) (wiedz że najpierw będzie młodszy bajt a później starszy czyli odwrotnie niż jesteśmy do tego przyzwyczajeni)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 22:28 
Offline
Nowy

Dołączył(a): 09 gru 2014
Posty: 17
Pomógł: 0

Dzięki rekon, zaraz dopiszę i skompiluję program, ale testy to dopiero jutro wieczorem niestety.
Edit:
Program skompilował się bez błędów i wciśnięty do procka. Testy jak pisałem dopiero jutro. Ledów nie mogę dać ponieważ brak mi już wyjść.
Pozdrawiam, Arek



Ostatnio edytowano 22 lut 2015, o 22:39 przez avrek, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 22:35 
Offline
Użytkownik

Dołączył(a): 16 sty 2015
Posty: 84
Pomógł: 6

ooo to może nawet ktoś zdąży sprawdzić moje wypociny bo to drugi mój program używający eeprom - pierwszy działał nie najlepiej że się tak wyrażę ;) ale zdaje się, że sam zapis miałem zrealizowany dobrze ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2015, o 14:59 
Offline
Użytkownik

Dołączył(a): 01 paź 2013
Posty: 305
Lokalizacja: Olsztyn
Zbananowany użytkownik

Pomógł: 20

Witam
Może to głupie ale już sam zgłupiałem, a może spróbuj nie podciągać pinów do zasilania a daj do masy w PORTB na początku i zobacz co się stanie.
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 42 ]  Przejdź na stronę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO