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



Teraz jest 13 kwi 2026, o 04:42


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 
Autor Wiadomość
PostNapisane: 10 gru 2013, o 11:50 
Offline
Nowy

Dołączył(a): 04 gru 2013
Posty: 15
Pomógł: 0

Witam ponownie :)

Obecnie wszystko działa i procek programuje się bezproblemowo. Jednak powstały problemy programowe... ;)

W moim projekcie mam 2 joystick'i rezystancyjne, które mają sterować 4 silnikami. Bezproblemowo udało mi się zaprogramować sterowanie jednym silnikiem za pomocą ADC, jednak dochodzi tutaj kwestia wykrywania kanału z którego podawany jest sygnał. I to rodzi w mojej głowie duży problem. Oglądałem poradnik ADC, czytałem różne fora itd. i głównie rozważana jest kwestia woltomierzy i wyświetlania wyniku.

Jak zrealizować programową zmianę kanału oraz przenieść to na sterowanie silnikiem?

Ja korzystam z przerwania ADC, dla jednego silnika, gdzie porównuję wynik i odpowiednio steruje portami. Jak powinna wyglądać struktura programu oraz funkcja zmieniająca kanały? Chodzi tutaj praktycznie o zmianę MUX, tylko nie wiem jak ją przeprowadzić i obsłużyć funkcją przerwanie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2013, o 18:39 
Offline
Nowy

Dołączył(a): 04 gru 2013
Posty: 15
Pomógł: 0

Zagląda tutaj w ogóle ktoś?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2013, o 18:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

Myślę kolego że to nowy temat można by założyć no i trochę więcej informacji by się przydało.

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2013, o 19:04 
Offline
Nowy

Dołączył(a): 04 gru 2013
Posty: 15
Pomógł: 0

Ok. Już uzupełniam o wszystko co wiem i mam ;)

Schemat:
Obrazek

Myślę, że ADC jest zasilone i podłączone poprawnie.

Silniki sterowane są przez procesor za pomocą mostków H:
Obrazek

Sygnały sterujące pochodzą od 2 joystick'ów potencjometrycznych. Każdy z nich wysyła sygnał w 2 osiach. Jedna oś to sygnał GND a druga to Vcc.
Udało mi się stworzyć program, który dla moich potrzeb po prostu znakomicie pracuje dla jednej osi i wysterowuje silnik:

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


Program sterował praktycznie bez opóźnień jednym silnikiem w bardzo fajny sposób. Zacząłem kombinować coś z oczekiwaniem na zakończenie pomiarów itd. analizując te przykłady woltomierzy, jednak nie potrafię sobie tego przełożyć na wysterowanie silnikiem.

Tak dla jasności to chodzi o to:
1. 2 joystick'i - wysterowanie 4 silników - potrzeba 4 kanałów ADC - jak je zmieniać?

2. Biorąc pod uwagę, że mamy jedno przerwanie od ADC (zapewne mnie poprawicie jak się mylę) to czy jest możliwość rozwiązać to jakość w przerwaniach czy jakaś funkcja odczytująca wynik a ADC i sterująca mostkiem H?

3. Myślałem o tym, żeby potworzyć funkcje dla każdego silnika i tam jakoś zdefiniować poszczególny kanał tylko jak na razie żaden z moich pomysłów nie daje jakichkolwiek rezultatów.

Mam nadzieję, że napisałem o wszystkim ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2013, o 19:13 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27453
Lokalizacja: Szczecin
Pomógł: 1045

kuba122 napisał(a):
tylko jak na razie żaden z moich pomysłów nie daje jakichkolwiek rezultatów.


Myślę, że przede wszystkim warto zacząć od nauki podstaw - bo z tym troszkę kiepsko na razie ... Dlatego w tym miejscu mogę polecić tę książkę (tzw Bluebooka)

http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

ale i bez niej - polecam gorąco - koniecznie obejrzyj ten poradnik (tą serię)

https://www.youtube.com/playlist?list=P ... 5hRnig_f23

zobaczysz jak dużo ci się w głowie poukłada po analizie tego materiału.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2013, o 19:39 
Offline
Nowy

Dołączył(a): 04 gru 2013
Posty: 15
Pomógł: 0

Nie wiem czy ja tak nieskładnie pisze, że ciągle o tych podstawach.

Napisałem przecież, że obejrzałem ten kurs i rzeczywiście dużo mi poukładało jednak nie dało odpowiedzi na moje pytanie. Przeanalizowałem także rozdział o ADC w tej książce.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2013, o 19:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

Kolego, DataSheet, rozdział - Analog to Digital Converter , Changing channel or reference selection i tam zainteresuj się rejestrem ADMUX i bitami MUX4..0 .

Przykro mi że nie podam Ci gotowego rozwiązania bo takowego nie mam bo nic takiego jeszcze nie robiłem, ale z DS dosyć sporo wynika.

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2013, o 19:57 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27453
Lokalizacja: Szczecin
Pomógł: 1045

kuba122 napisał(a):
Nie wiem czy ja tak nieskładnie pisze, że ciągle o tych podstawach


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


to jest twoja pętla główna ? i jeszcze się denerwujesz dlaczego podpowiadam na temat podstaw ? Widząc takie coś spodziewam się raczej że jednak książki nie miałeś okazji np czytać a poradnika o ADC na pewno nie widziałeś - ponieważ nigdzie czegoś takiego bym nie pokazał i nie naprowadzał na takie rozwiązanie - które prowadzi tylko twój program hmm procka do zawieszenia działania i to wszystko ....

a tym bardziej że na końcu piszesz:

kuba122 napisał(a):
jak na razie żaden z moich pomysłów nie daje jakichkolwiek rezultatów


więc może jednak przemyśl jak zadajesz pytania - bo może i masz kod inny - ale pokazujesz co innego a potem się dziwisz że wychodzi z tego REBUS albo gra w kalambury.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2013, o 20:02 
Offline
Nowy

Dołączył(a): 04 gru 2013
Posty: 15
Pomógł: 0

no trochę nieszczęśliwie i niepotrzebnie umieściłem tą pętle while() więc rozumiem zdziwienie...

acid3 - nie szukam gotowego rozwiązania. Postaram się coś opracować i wrzucić tutaj ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2013, o 20:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

kuba122 napisał(a):
no trochę nieszczęśliwie i niepotrzebnie umieściłem tą pętle while() więc rozumiem zdziwienie...


Przepraszam kolego że wspomniałem o DS.
To będzie lepsze rozwiązanie, dużo lepsze...

http://www.sklep.atnel.pl/pl/p/KSIAZKA-I-wydanie-2/75

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2013, o 20:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 sie 2013
Posty: 199
Pomógł: 1

Cytuj:
unsigned volatile int wynikADC;


wynik to dwa rejestry ADCL and ADCH wiec (14.12.3 ADCL and ADCH – The ADC Data Register) 93 str
wystarczy 16bitów a z tym volatile to chyba nie przejdzie bo makro z gcc jest innaczej zdefinowane

mysle ze twój problem rozwiązał by tryb "ADC Auto Trigger Enable"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2013, o 21:06 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27453
Lokalizacja: Szczecin
Pomógł: 1045

DominikN napisał(a):
wynik to dwa rejestry ADCL and ADCH wiec (14.12.3 ADCL and ADCH – The ADC Data Register) 93 str
wystarczy 16bitów a z tym volatile to chyba nie przejdzie bo makro z gcc jest innaczej zdefinowane


wartość pomiaru, 10-bitowa, która jest w dwóch rejestrach ADCH i ADCL a w GCC można skorzystać równie dobrze z makra wbudowanego ADCW (para rejestrów) zmieści się równie dobrze w ramach typów GCC:

uint16_t
int
unsigned int

żadna różnica

natomiast kolejna informacja dlaczego mówiłem o podstawach to właśnie taki zapis:

unsigned volatile int wynikADC;

oczywiście specyfikator volatile MOŻE BYĆ? co to za różnica w tym przypadku czy jest czy nie. Nawet jeśli autor używałby tej zmiennej w przerwaniu i pętli głównej to wręcz MUSI BYĆ !!! a nie że może być

tylko co to za kolejność

unsigned volatile int ?????

więc znowu - odeślę do książki to rozdziału o typach i proszę mi panie autor nie mówić że podstawy masz opanowane. Tzn nie dąsać się, że zwracam grzecznie na to uwagę. Bo akurat zrozumienie typów danych w każdym języku to tak jak nauka alfabetu albo jak 2x2 w matematyce.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2013, o 22:47 
Offline
Nowy

Dołączył(a): 04 gru 2013
Posty: 15
Pomógł: 0

no cóż unsigned volatile int jest prosto z instrukcji do laboratorium z jakiej miałem okazję się uczyć także wybaczcie...

Daleko mi do dąsania. Pokornie powróciłem do powtarzania wiadomości o typach i funkcjach z czego narodził się nowy pomysł na program a w połączeniu z wbudowanym makrem ADCW i Pana poradnikiem ADC powoli zaczyna powstawać coś co działa.

Jeżeli dobrze pójdzie to jutro postaram się wrzucić mój program, chociaż dla jednego joy'a. Mam nadzieje, że także znajdziecie czas na owocną krytykę ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2013, o 23:13 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27453
Lokalizacja: Szczecin
Pomógł: 1045

kuba122 napisał(a):
Jeżeli dobrze pójdzie to jutro postaram się wrzucić mój program, chociaż dla jednego joy'a.


Dokładnie - lepiej wrzucać mniejsze kawałki, wtedy i tym którzy pomagają łatwiej ogarnąć i coś podpowiedzieć. Wtedy też można szybciej coś tam zrozumieć i zacząć budować coś większego

------------------------ [ Dodano po: 1 minucie ]

kuba122 napisał(a):
Mam nadzieje, że także znajdziecie czas na owocną krytykę


Krytykują na elektrodzie - tu raczej staramy się sobie pomagać nawzajem - a czasem pokazanie złej drogi to też przecież pomoc - a ja już tak mam, że wolę najczęściej zadawać pytania naprowadzające - bo gdy pytający sam zaskoczy to zapamięta to na zawsze. A gdy mu się podpowie rozwiązanie to zapamięta to tylko w krótkotrwałej pamięci i szybko wygeneruje sobie nowy problem ....

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2013, o 11:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

Przede wszystkim nie robił bym pętli głównej w... przerwaniu, bo tak to można ironicznie nazwać co pokazałeś w swoim programie. Dlaczego nie odczytujesz po prostu wszystkiego w prawdziwej pętli głównej i tam nie badasz flagi ukończenia konwersji?

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2013, o 14:05 
Offline
Nowy

Dołączył(a): 04 gru 2013
Posty: 15
Pomógł: 0

Ogólnie to tak mnie nauczyli na studiach (teraz wiem, że to głupota), że jak wykorzystuje ADC to działam w przerwaniu głównie i tam robię warunki, pętle itd.

Napisałem program dla wszystkich 4 silników, który.... DZIAŁA :) Oto on:

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


Jest to wersja oczywiście jeszcze do obróbki. Zamiast tych wszystkich instrukcji powrzucam sobie gotowe funkcje, które napisałem w oddzielnym pliku dla wszystkich silników, bo ogólnie mam 6 silników, więc do tych sterowanych joystick'ami dochodzą jeszcze 2 sterowane przyciskami.

Dodatkiem będziesz jeszcze obsługa 2 przerwań od 2 czujników, które także wykorzystuję. Program mam napisany ale powstał problem z działaniem czujnika, także na razie go nie wrzucam ;)

Ogólnie to miał być dodatek (w sensie sterownik i układ) do mojej pracy inżynierskiej a jak na razie poświęciłem temu bardzo dużo czasu... ;)

Czekam na opinie :roll:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2013, o 15:32 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27453
Lokalizacja: Szczecin
Pomógł: 1045

1. dla lepszej przejrzystości kodu, przenieś definicje funkcji jak np void adc_init(void) poniżej funkcji main(), bo masz wyżej ładnie ich deklaracje, tyle że w takiej postaci jest to nieco bez sensu

2. postaraj się to lekkie monstrum w pętli głównej zamienić też na mniejsze funkcje - żeby lepiej się czytało program

3. zamiast tego

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


użyj operacji maskowania bo to niezbyt ładnie wygląda, np:

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


to takie moje wstępne uwagi na szybko

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2013, o 16:03 
Offline
Nowy

Dołączył(a): 04 gru 2013
Posty: 15
Pomógł: 0

ad. 2 właśnie mam rozpisane funkcje dla każdego silnika, tylko jeszcze ich nie umieszczałem

ad. 3 próbowałem zrobić tą operację maskowania ale widzę mój błąd bo dawałem F8.

Dzięki za wstępne uwagi. Do wieczora postaram się skleić cały program i wrzucić



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2013, o 19:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

Kurcze, analizuje, patrzę, myślę, nota PDF przede mną... jakim prawem to działa prawidłowo ???
Dlaczego mam wątpliwości ? Ano dlatego:

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


Śmiem twierdzić, że jest błąd w nocie, a tutaj działa wszystko przez przypadek. Powinno być wg mnie:

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 jeszcze pytanie techniczne - czy jest potrzeba włączania przerwania ADIE jeśli nie korzystamy z wektora?

EDIT:

Aha, Mirku czy tu: ADMUX = (ADMUX & 0xF0) | kanal; nie powinno być 0XE0 ? Wszak bity od MUX zajmują 5 pozycji, co prawda nie wszystkie w tym procku wykorzystane...
Sorki, za tak czepne drobiazgi, ale w BASCOMIE nie musiałem być taki drobiazgowy więc zwłaszcza na początku nauki C chciałbym być nieco skrupulatny ;) Rozwiej proszę moje wątpliwości.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2013, o 20:03 
Offline
Nowy

Dołączył(a): 04 gru 2013
Posty: 15
Pomógł: 0

Zastanawiałem się nad tym dlaczego tak dziwnie jest ale wycinek z noty, której ja używam:

Obrazek

Ściągnąłem sobie przetłumaczoną notę, w której jest błąd... W angielskiej wersji jest ok.

Wiedziałem, że ktoś zapyta o ADIE ;) Nie chciałem już edytować i nie zmieniłem. Wg. mnie nie ma potrzeby a to pozostało jeszcze z prób z przerwaniami.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2013, o 21:28 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27453
Lokalizacja: Szczecin
Pomógł: 1045

kuba122 napisał(a):
Wg. mnie nie ma potrzeby


to nie chodzi o to, że nie ma potrzeby - jeśli zezwalasz na przerwanie, a nie napiszesz ciała makra

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


to program będzie ci się po prostu resetował wciąż gdy dochodzić będzie do jego wywołania a ty będziesz sobie włosy wyrywał - "że co się dzieje? "

więc kolega wyżej bardzo słusznie zwrócił ci uwagę na to ;) miał sokole oko

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

SylwekK napisał(a):
Aha, Mirku czy tu: ADMUX = (ADMUX & 0xF0) | kanal; nie powinno być 0XE0 ? Wszak bity od MUX zajmują 5 pozycji, co prawda nie wszystkie w tym procku wykorzystane...


Wprawdzie już miałem okazję inną drogą wyjaśnić to koledze - ale może innym się przyda ...

W tym wypadku gdy stosujemy tylko pomiary (single ended) a mamy max 8 kanałów to wręcz można by to zapisać nawe tak:

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


dlatego, że tylko 3 najmłodsze bity tego rejestru odpowiadają za przełączanie się pomiędzy tymi 8 kanałami. Reszta bitów używana jest do pomiarów różnicowych i innych ustawień. Jak zwykle warto zajrzeć do tabeli w nocie PDF.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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: 21 ] 

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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO