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



Teraz jest 24 maja 2026, o 23:25


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
PostNapisane: 17 lut 2015, o 22:04 
Offline
Użytkownik

Dołączył(a): 03 lis 2012
Posty: 43
Pomógł: 1

Klasyczny już problem, a mianowicie UART ładnie wysyła mi do komputera tekst, ale nie chce nic odebrać. Prawdopodobnie coś źle ustawiłem przy inicjacji, ale nie jestem pewny.
Main:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Część mkuart.c, zgodnie ze zwyczajem nie wrzucania całości z książki:
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: 17 lut 2015, o 22:11 
Offline
Moderator
Avatar użytkownika

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

c = uart_getc();

obejrzyj dokładnie jak działa ta funkcja i co ona zwraca

_________________
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: 17 lut 2015, o 22:33 
Offline
Użytkownik

Dołączył(a): 03 lis 2012
Posty: 43
Pomógł: 1

Zwraca 0 jeżeli ogon i głowa węża są jednakowe (ale ja nie przesyłam aż tyle danych żeby zapełnić węża), a jeżeli są różne to zwraca pojedynczy znak z bufora.



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

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

ale pętla główna wykonuje się setki tysięcy razy na sekundę, ty do tego wszystkiego wstrzymujesz ją jak pługiem - funkcją delay na wieczność czyli 1 sekundę (ale uwierz mi nawet 10ms to wciąż wieczność będzie) ...

kompletnie nie tak podchodzisz do odbioru stringów ... no ale też nie ma co się dziwić, gdy człowiek zaczyna przygodę z programowaniem to nie od razu przecież wszystko sam wymyśli ...

dlatego ja .... coś takiego co się nazywa "odbiór i parsowanie stringów" bo do tego dążysz tylko jeszcze nie nazwałeś sam tego .... opisałem w drugiej książce - ponieważ wg mnie do w pełni poprawnego sposobu realizacji tego mechanizmu warto przyswoić sobie callbacki, zdarzenia itp ...

ty zaś rozważ sobie na początek prostszy mechanizm, w oparciu o to co masz z Bluebooka, bo też da radę coś zrobić (zresztą jest już wiele przykładów na tym forum jak inni sobie poradzili gdy w końcu zrozumieli że nadszedł czas aby umieć odbierać i jeszcze analizować stringi.

dlatego na początek wywal w diabły delaja z pętli głównej,

sprawdzaj w warunku w tejże pętli głównej czy c w końcu jest różne od zera, no bo to będzie oznaczało że w końcu nadleciał twój upragniony znak z terminala (nie koniecznie ten co trzeba no ale jakiś znak w ogóle) ... a gdy będzie c równe zero to pętla może sobie zapierniczać

a w tym warunku jak już zobaczysz że nadleciał znak - to porównaj sobie c z takim znakiem jaki ci odpowiada i wtedy go wyświetl albo zrób co chcesz ....

zresztą nawet w Bluebooku masz przykład jak odbierać pojedyncze znaki taką metodą jak tu opisuję ... (rozdział z przykładem wielozadaniowym) - zajrzyj

_________________
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: 17 lut 2015, o 22:56 
Offline
Użytkownik

Dołączył(a): 03 lis 2012
Posty: 43
Pomógł: 1

mirekk36 napisał(a):
zresztą nawet w Bluebooku masz przykład jak odbierać pojedyncze znaki taką metodą jak tu opisuję ... (rozdział z przykładem wielozadaniowym) - zajrzyj

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

I niestety dalej nie działa. Na stringi przyjdzie pora, ale na razie nawet jeden znak nie chce mi działać :(.



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

Dołączył(a): 03 lis 2012
Posty: 43
Pomógł: 1

Tak, Atmega po restarcie wysyła tekst "Mikroprocesor zainicjowany poprawnie", bo przed pętlą nieskończoną jest
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jeżeli w pętli nieskończonej wpiszę uart_putc("test"); to również działa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lut 2015, o 23:15 
Offline
Moderator
Avatar użytkownika

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

sprawdzałeś metodą Debugera na jednej diodzie LED czy działa ci np przerwanie odbiorcze ?

------------------------ [ Dodano po: 5 minutach ]

pytam bo może masz po prostu np nie podłączony jakiś przewód od RX procka

_________________
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: 17 lut 2015, o 23:34 
Offline
Użytkownik

Dołączył(a): 03 lis 2012
Posty: 43
Pomógł: 1

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

Pin ustawiony wcześniej jako wyjściowy, stan pinu nie zmienia się na wysoki nawet kiedy coś piszę do Atmegi, w żadnym innym miejscu nie zmieniałem stanu tego pinu (a to na pewno działa, bo jeżeli w pętli głównej wsadzę PORTD |= (1<<PD2); to na pinie mam stan wysoki). Czyli to wina przerwania.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lut 2015, o 23:45 
Offline
Moderator
Avatar użytkownika

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

MrDarkenRahl napisał(a):
Czyli to wina przerwania.

No jak wina przerwania ?

a co może być winne przerwanie - masz prostą podpowiedź - nie działa przerwanie - to teraz trzeba znaleźć przyczynę dlaczego

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

co może być powodem że nie działa ?

wypunktuj możliwe przyczyny

_________________
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: 18 lut 2015, o 00:19 
Offline
Użytkownik

Dołączył(a): 03 lis 2012
Posty: 43
Pomógł: 1

1. zły wektor (ale USART_RX_vect jest poprawny dla Atmegi328p)
2. nieodblokowane zezwolenie przerwań sei() (ale ja odblokowałem)
3. oczekiwania w przerwaniu - nie zrobiłem żadnej funkcji delay w przerwaniu
4. zła funkcja inicjująca UART - i prawdopodobnie tutaj leży pies pogrzebany, ale nie mam pomysłu co mogłem zrobić źle.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2015, o 08:18 
Offline
Moderator
Avatar użytkownika

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

MrDarkenRahl napisał(a):
4. zła funkcja inicjująca UART - i prawdopodobnie tutaj leży pies pogrzebany,

Bingo!

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

Widzisz - praktycznie sam dochodzisz do rozwiązania problemu, to teraz pomyśl, co trzeba zrobić żeby jakieś przerwanie zaczęło działać ?

jakie (podpowiadam DWA kroki trzeba wykonać?)

1. xxxxx
2. sei();

;)

przy okazji sprawdź w Bluebooku jak inicjalizuje się UART do pracy ... ale na przerwaniach

_________________
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: 18 lut 2015, o 10:36 
Offline
Użytkownik

Dołączył(a): 03 lis 2012
Posty: 43
Pomógł: 1

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

Jest inicjacja UARTU bez kombinowania, gdzie __UBRR ((F_CPU+UART_BAUD*8UL) / (16UL*UART_BAUD)-1)
Nadawanie w przerwaniu działa, więc problemem jest tylko odbiór. Tylko nigdzie nie widzę błędu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2015, o 10:46 
Offline
Moderator
Avatar użytkownika

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

MrDarkenRahl napisał(a):
Jest inicjacja UARTU bez kombinowania

Właśnie, że zrobiłeś z kombinowaniem i to mocnym ;)

MrDarkenRahl napisał(a):
Nadawanie w przerwaniu działa

To przeanalizuj dlaczego działa ... co powoduje że działa .... (podpowiedź! - czy przypadkiem nie jest ustawiany jakiś bit w jakimś rejestrze odpowiedzialny "za coś" ;) ).... W książce też jest to opisane

MrDarkenRahl napisał(a):
więc problemem jest tylko odbiór.

Dokładnie bo przerwanie nie działa (podpowiedź: bo nie jest odblokowane?) ;)

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

zajrzyj że do książki, do DVD ... do inicjalizacji i zobacz swoje kombinacje ;)


Autor postu otrzymał pochwałę

_________________
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: 18 lut 2015, o 10:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 sty 2014
Posty: 448
Lokalizacja: DKL
Pomógł: 53

@MrDarkenRahl, jeśli ciało funkcji USART_Init(), jest takie jak podałeś w pierwszym poście to, jest ono niekompletne i brakuje w nim ustawienia bitu odpowiadającego za wywołanie przerwania po odebraniu danych.

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


Edit: spóźniłem się z odpowiedzą, Mirek już cię ładnie naprowadził, gdzie szukać problemu :)

Edit2: Poza tym wypatrzyłem, że ustawiając bity w rejestrach nie stosujesz sum logicznych, a to może powodować niekontrolowane problemy jeśli robi się to nieświadomie.


Autor postu otrzymał pochwałę

_________________
Migracja z punktu B do punktu C
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lut 2015, o 00:33 
Offline
Użytkownik

Dołączył(a): 03 lis 2012
Posty: 43
Pomógł: 1

Dziękuję panowie, wreszcie działa jak należy. Udało mi się napisać odbieranie stringów oraz jednoczesne echo w konsoli - działa bardzo fajnie. Tylko teraz męczę się z funkcją strcmp, bo nijak nie chce stwierdzić że wpisany ciąg znaków jest identyczny z zadeklarowanym.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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

W załączniku podgląd z konsoli.
Obrazek
Aha - jeżeli po warunku "if(uartFLAG)" chcę wypisać zawartość tablicy za pomocą
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

To wszystko zgadza się z wcześniej wpisanym ciągiem.


EDIT
Może komuś się przyda - napisałem własną funkcję porównującą tablice. Pierwsza tablica musi być krótsza lub równa drugiej. Ja potrzebowałem w takiej postaci, ale nic nie stoi na przeszkodzie by pierwsze sprawdzić czy ich długości są takie same.
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: 28 maja 2015, o 11:43 
Offline
Użytkownik

Dołączył(a): 21 sty 2014
Posty: 75
Pomógł: 0

Ja mam jeszcze jeden problem

Obrazek

i nie bardzo mogę znaleźć rozwiązanie.



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

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