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



Teraz jest 28 mar 2024, o 12:38


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 
Autor Wiadomość
PostNapisane: 26 cze 2017, o 00:34 
Offline
Użytkownik

Dołączył(a): 25 cze 2017
Posty: 32
Pomógł: 0

Witam,

Na wstępnie zaznaczam, że jestem tutaj nowicjuszem, a założyłem wątek z tego względu, że wiele się dowiedziałem za sprawą forum atnela oraz niebieskiej książki i materiałów z sieci, utworzonych przez Pana Mirosława :)

Jednak przechodząc do meritum:
Mam projekt do zrealizowania, aktualnie testuję działanie kodu na module atmegi8a.

Chciałbym, aby program działał w ten sposób, by po wysłaniu znaku z terminala (używam realterm) zostały odesłane do PC dane najpierw z jednego kanału ADC, pozniej z kolejnego, a następnie przesył danych będzie zatrzymany. Przesyłanie rozpocznie się znowu, gdy prześle się ponownie znak z terminala.
Program, który utworzyłem wysyła dane, ale ciągle z jednego kanału ADC. Przełączenie kanałów zrobiłem z wykorzystaniem "switch-case".
Przed dodaniem w pętli głównej "while(1)" warunku uruchomienia timera po wciśnięciu przycisku, dane z dwóch kanałów były przesyłane poprawnie (po podaniu zasilania odbierano w terminalu 2 razy dane z kanałów, najpierw jednego, po 2 sek. z drugiego). Jednak po dodaniu warunku uruchomienia timera - po wysłaniu znaku z PC do procka -> W terminalu zwrotnie odbieram tylko 2 razy dane z pierwszego kanału.

Proszę w miarę możliwości o jakieś propozycje i czy opisana przeze mnie koncepcja jest w porządku (np. czy dodać jakieś przerwanie oprócz ISR timera albo rozwiązać to w inny sposób).
Pozdrawiam i dzięki z góry za pomoc ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 cze 2017, o 06:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

cześć
wstaw swój kod to będzie łatwiej

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 cze 2017, o 06:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Bez choćby skrawka kodu odpowiedzialnego za wybór kanału i wysłanie zmierzonej wartości,
będzie ciężko się domyślić gdzie schował się chochlik :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 cze 2017, o 08:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Jeżeli z klawisza wysyłało dobrze a z przerwania ciągle ten sam kanał,
to może w przerwaniu jest iteracja(idpowiedzialna za zmianę kanału) wstawiona/powołana bez przydomka 'static'. ?
może?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 cze 2017, o 13:28 
Offline
Użytkownik

Dołączył(a): 25 cze 2017
Posty: 32
Pomógł: 0

1) W pętli while(1) pobieram znak ; jeśli znak jest równy podanemu z klawiatury przez terminal, wówczas uruchamiam timer 1 (w trybie porównania CTC na OCR1A).
2) w przerwaniu od timera mam wpisany kod:

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


3) Próbowałem - jak kolega Daro69 radził - wprowadzic zmienną static w przerwaniu, lecz w tym przypadku najpierw nic się nie wyświetla, a pozniej wyswietla się wartość z pierwszego kanału. Ponowne podanie znaku -> wtedy dwukrotnie wyświetla się wartość z drugiego kanału.

4) Zauważyłem jeszcze jedną rzecz - gdy po wyświetleniu pierwszej a przed wyswietleniem drugiej wartości wyślę znak z terminala -> następuje wyświetlenie wartości z innego kanału. Jeżeli nie wyślę znaku pomiędzy - wtedy wyświetla się dwa razy wartość z tego samego kanału.



Ostatnio edytowano 9 lip 2017, o 00:18 przez staszjar9, łącznie edytowano 3 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 cze 2017, o 20:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Ok. :) nie siedzę teraz przed kompem ale
wyglada na to że,
adc1 i adc2 aktualizujesz. :)
A gdzie aktualizujesz wysyłane : cz_dz i cz_ulmk. ?
Nie dostrzegam. :(


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 cze 2017, o 20:57 
Offline
Użytkownik

Dołączył(a): 25 cze 2017
Posty: 32
Pomógł: 0

Zmienne, o których mówisz znajdują się teraz w pętli głównej while(1) i służą mi wynikowo do wyświetlania liczb z jednym miejscem po przecinku (z resztą procedura opisana w blueBooku, przy temacie ADC, chyba str. 258). Nie wiem, sądzisz że w tym tkwi problem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 cze 2017, o 23:48 
Offline
Użytkownik

Dołączył(a): 25 cze 2017
Posty: 32
Pomógł: 0

Próbuję coś zdziałać cały dzień, ale nadal nie działa to wg założeń. Ciągle pomiar z jednego kanału.. Gdy wyślę znak pomiędzy wyświetleniem pierwszej a drugiej wartości - to wtedy jakby przełączanie działa, ale nie o to chodzi.. Ma być tak, że wciskam przycisk i najpierw w przerwaniu od timera1 otrzymuję wartość z kanału 1 , a po czasie z kanału 2.
Aha, nie wiem, czy to może mieć znaczenie, ale moduł ADC pracuje aktualnie w trybie "free run".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 cze 2017, o 04:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Spróbuj może oddzielić zmienne cz_dz_adc1 cz_dz_adc2,
Być może wyliczenie naprzemienne napięcia na wspólnej zmiennej nie wstrzeliwuje się w wysyłane w przerwaniu konkretne adcx.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 cze 2017, o 06:31 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

A ile czasu wg noty ADC potrzebuje na przełączanie kanałów?

Sent from my Mi-4c using Tapatalk



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 cze 2017, o 08:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Z tego opisu zrozumiałem że kolega w przerwaniu wysyła wczesniej zmierzone adc, zmienia kanał,
Po 2 sękundach powtarza czynność w przerwaniu powracając do pomiaru kanału 1 oczekując na znak.

------------------------ [ Dodano po: 34 minutach ]

Hmm, czy przed uruchomieniem przerwania zdąży zaktualizować adc1/przeliczyć . ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 cze 2017, o 10:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Zaraz, momento...

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

A skąd w pętli głównej wiadomo który kanal jest ustawiony. ? Wejście nie jest globalne.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 cze 2017, o 12:16 
Offline
Użytkownik

Dołączył(a): 25 cze 2017
Posty: 32
Pomógł: 0

Daro69 napisał(a):
Z tego opisu zrozumiałem że kolega w przerwaniu wysyła wczesniej zmierzone adc, zmienia kanał,
Po 2 sękundach powtarza czynność w przerwaniu powracając do pomiaru kanału 1 oczekując na znak.

------------------------ [ Dodano po: 34 minutach ]

Hmm, czy przed uruchomieniem przerwania zdąży zaktualizować adc1/przeliczyć . ?


Sprawa wygląda dokładnie prawie tak, jak napisałeś. Program ma działać mniej więcej w taki sposób:
Adc wczesniej zmierzone -> wysyłka przez uart -> zmiana kanału po 2s. -> wysyłka wartości z drugiego kanału -> po 2 sek. powrót do 1 kanału i oczekiwanie na znak.

Zmienne dot. przetwornika ADC i wszystkie pozostałe są ustawione na początku programu jako volatile.



Ostatnio edytowano 9 lip 2017, o 00:20 przez staszjar9, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 cze 2017, o 12:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Tak na pierwsi rzut oka, jeżeli jest powołana zmienna wejsc vilatile ti w przerwaniu już jej nie powołuj bo zasłania tę pierwsza.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 cze 2017, o 13:10 
Offline
Użytkownik

Dołączył(a): 25 cze 2017
Posty: 32
Pomógł: 0

W przerwaniu nie deklaruję żadnej zmiennej, wcześniej dla próby dodałem zmienną 'static', ale to przecież nic nie dało. Nie mam na razie żadnego pomysłu, jak rozwiązać to wyświetlanie po sobie dwóch wartości z kanałów. Nie znam sposobu, może zbyt mało wiedzy ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 cze 2017, o 19:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Witam, nie widzę podpowiedzi, :?
to może tak jakoś z pojedynczym pomiarem.


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

to tak nie fachowo - nie gotowy kod,(pisany w edytorze odpowiedzi :roll: ) - chodzi o sposób jaki mi strzelił do głowy.
pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 cze 2017, o 19:51 
Offline
Użytkownik

Dołączył(a): 25 cze 2017
Posty: 32
Pomógł: 0

Dzięki za pomoc, tylko z tego co widzę to musiałbym zmienić troszkę w kodzie. W tym kodzie wyżej jest wykorzystywany tryb pojedynczego pomiaru, a u mnie free run ;)



Dzięki za pomoc kolego Daro69, gorąco proszę, może jest tutaj jakiś chochlik.



Ostatnio edytowano 22 sie 2017, o 20:21 przez staszjar9, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 cze 2017, o 22:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Hejka,
Przyglądam się i ... rodzi mi się pytanie. czy na pewno adc mierzysz na PC1 i PC2 ?
przekleiłem Twój kod z poprawką na atmegę_32 i zamiast uarta wysypałem wyniki na lcd'ka .
I wszystko działa.
Ciągle mierzy ADC1, po nacisnieciu klawisza q='1', (u Ciebie znak '1' z kompa) -
po chwili pojawia się pierwsza wartość ADC1 a po następnej chwili ADC2.
Czyli tak jak zakładałeś. :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lip 2017, o 13:44 
Offline
Użytkownik

Dołączył(a): 25 cze 2017
Posty: 32
Pomógł: 0

Daro69 napisał(a):
Hejka,
Przyglądam się i ... rodzi mi się pytanie. czy na pewno adc mierzysz na PC1 i PC2 ?
przekleiłem Twój kod z poprawką na atmegę_32 i zamiast uarta wysypałem wyniki na lcd'ka .
I wszystko działa.


hm... na pewno mierzę na nóżkach PC1 i PC2. Najprawdopodobniej problem leży w odświeżaniu zmiennych odpowiadających za wyświetlanie wyników pomiarów.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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