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



Teraz jest 13 gru 2024, o 14:34


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 12 gru 2018, o 20:58 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 10 gru 2018
Posty: 4
Pomógł: 0

Cześć :)
To moje pierwsze pytanie na forum więc proszę o cierpliwość. Nie czuje się w dziedzinie programowania zbyt pewnie, przygodę zaczęłam dopiero 2 miesiące temu na studiach. Mam problem z przerwaniem USART w mikrokontrolerze ATMEGA2560. Podejrzewam, że problem tkwi w kodzie ponieważ wysyłanie danych działa idealnie. Odbieranie pojedynczych znaków tez ... ale tylko gdy umieszczam instrukcje odbierania w pętli while. Niestety nie dziala przerwanie. Czy mógłby mnie ktoś wspomóc dobrą radą ?
Dodam że ATMEGA posiada zewnętrzny oscylator kwarcowy 16MHz, fusebit'y ustawione są na pewno poprawnie. Odblokowałam też główne zezwolenia na przerwania globalne w rejestrze SREG


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


Korzystam z programu Tera Term. Mimo wysyłania znaku "a" brak reakcji :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2018, o 21:19 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

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

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

Dalej popatrzę albo i koledzy coś wynajdą.

P/S
Po co volatile to pewnie wiesz a jak nie to wyjaśnię.

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2018, o 21:35 
Offline
Moderator
Avatar użytkownika

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

JarekB napisał(a):
volatile unsigned char wynik;

a ja uzupełnię poza pozostałymi POPRAWNYMI uwagami, że powinno być:

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


bez żadnego kociego "unsigned" w AVR GCC

_________________
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: 12 gru 2018, o 21:45 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 10 gru 2018
Posty: 4
Pomógł: 0

Zgodnie z zaleceniem zmiany zostały wprowadzone. Co prawda to nie pomogło, ale ciągle polegam na dokumantacji PDF i dopatrzyłam się że rejestr UCSR0B odpowada za odblokowanie przerwań ( jeśli dobrze to rozumiem ). Po drobnej zmianie :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Program faktycznie działa i wykonuje przerwanie. Jest to jednak tylko połowiczna radość z mojej strony ponieważ po wpisaniu w terminal litery "a" w odpowiedzi dostaje miliony znaków "t". W jaki sposób mogę uzyskać w odpowiedzi tylko pojedynczy znak ? :/
Odpowiadając na Twoje dodatkowe pytanie... "teoretycznie" rozumiem znacznie zmiennej volatile ( chociaż to bardzo intuicyjne :) ) niestety w tej sytuacji zupełnie o tym zapomniałam, mój błąd przyznaje. Skąd sugestia usunięcia pierwszej lini ? Taka definicja taktowania atmegi ma negatywny wpływ na kompilację kodu ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2018, o 21:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8587
Pomógł: 337

Widzi koleżanka , milion odpowiedzi wynika z faktu że spełniony jest warunek if (wynik = 'a')
i pętla sobie leci ....

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2018, o 22:04 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

Co do volatile.
Gdy "go" nie ma to do czynności wykonywanej przez jakąś część programu
przekazywana jest kopia tej zmiennej.
Volatile powoduje że operacje wykonywane są na "pierwowzorze"
Czyli w Twoim przypadku "bez" to co się dzieje w przerwaniu nie jest widoczne w pętli głównej.
Nie potrafię tego precyzyjniej napisać

Co do pierwszego.
Częstotliwość pracy procesora ustawiana jest gdzie indziej.
Tu jakbyś dublowała to ustawienie.
Korzystam z Mirkowego MkCLIPSA i tam jest wybór procka w projekcie.
W Eclipsie (którego nie widziałem na oczy ) też tak jest.

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2018, o 22:10 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 10 gru 2018
Posty: 4
Pomógł: 0

Hah no właśnie wiem co jest powodem tej sytuacji ale nie wiem jak temu zaradzić niestety :D Bez względu na rodzaj zastosowanej petli program nadal bedzie odpowiadał nieskończoną ilością" t " ponieważ główny kod programu zawarty jest w pętli while. Wychodzi na to że trzeba wyczyścić UDR0 ?! Tak aby ponownie nie wykonało się przerwanie ? Nie wiem, zgaduje :/ brak pomysłów.

Panie Jarku dziękuje za wyjaśnienie. Wygląda na to, że rozumiem. Pytanie tylko czy zawsze kiedy będę stosować przerwania zmienna nie będzie się prawidłowo pobierała i dla pewności umieszczać volatile. Istnieją jakieś metody na zidentyfikowanie, która z naszych zmiennych wymaga takiego podejścia ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2018, o 06:53 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

Po przeczytaniu rejestru UDR jest on automatycznie czyszczony

Nieelegancki sposób na rozwiązanie Twojego problemu to zmiana zmiennej "wynik"
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Do testów wystarczy.


"Pytanie tylko czy zawsze kiedy będę stosować przerwania zmienna nie będzie się prawidłowo pobierała i dla pewności umieszczać volatile"
Jeśli zmienna ma być "dostępna" i w przerwaniu i w kodzie to podczas jej deklaracji musi być poprzedzona volatile
Trudno mówić o prawidłowym czy nieprawidłowym pobieraniu. To jest raczej właściwość.
I skoro jest to właściwość to tylko od Ciebie zależy w jaki sposób zmienna ma być widoczna.

Jest kilka sposobów powiedzenia kompilatorowi jak się ma zmienna zachowywać: const static volatile.....
Każdy z nich powoduje że zmienna "nabywa" innych cech. I w inny sposób kompilator ją traktuje.
Odpowiadając na Twoje pytanie:
"Istnieją jakieś metody na zidentyfikowanie, która z naszych zmiennych wymaga takiego podejścia ?"
Jeśli opanujesz jakie cechy będzie miała zmienna poprzedzona tym czy innym specyfikarorem, to nadasz jej właściwości takie jakie będziesz potrzebowała. Czyli metodą jest zrozumienie mechanizmu.

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2018, o 07:04 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2587
Pomógł: 128

Ja bym proponował zacząć od przeczytania Bluebooka, jeśli chcesz zacząć przygodę z mikrokontrolerami.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2018, o 08:04 
Offline
Użytkownik
Avatar użytkownika

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

Można tak jak JarekB podpowiada, z tym że wynik = 0; ...NULL;...'\0';



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2018, o 09:08 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 10 gru 2018
Posty: 4
Pomógł: 0

Super. Jak wroce po zajeciach do domu to na pewno dokonam kilku zmian w kodzie. Podejme sie tez proby odbierania danych string. Jesli pojawia sie problemy to bede musiala Was jeszcze dzis poprosic o wsparcie. Na chwile obecna dziekuje za wyjasnienia.
W odpowiedzi na sugestie uzytkownika '' micky'' ... list do mikolaja juz napisany, pod choinka znajdzie sie ksiazka Pana Mirka :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2018, o 14:29 
Offline
Użytkownik
Avatar użytkownika

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

Póki co, na próbę przesyłane są pojedyncze znaki.
Dobrze że są plany przesyłania ciągu znaków, dlatego mam nadzieję że dobrniemy do bufora cyklicznego i całej reszty.
:)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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