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



Teraz jest 28 mar 2024, o 19:31


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 
Autor Wiadomość
PostNapisane: 22 sie 2017, o 19:50 
Offline
Użytkownik

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

Witam,
Pisałem już na forum odnośnie zmiany kanałów ADC przy wysyłce danych z jednego uC do PC. Problem rozwiązałem, jakoś to działa.
Cel kolejnego zadania to odebranie danych z kanałów adc innego procka i ich wysłanie do PC.
Założenia są takie: wysyłka znaku na magistrale, rozpoznanie znaku przez drugi uC, odesłanie danych z kanałów tego drugiego uC.
Chciałem to zrobić tak, że w nadrzędnym uC odbieram dane w przerwaniu RX, gdzieś je zapamiętuję i wysyłam po jakimś czasie przez drugi moduł usarta do PC. Próbowałem zastosować bufor cykl. , ale nie wiem, czy coś sknociłem, ale raczej nie rozumiem kilku rzeczy.
Zamieszczę może fragmenty kodów i co jest za co odpowiedzialne.
Zmiana kanałów adc:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zmiana kanałów i wysyłka danych z drugiego uC jest wykonana w ten sam sposób, z tym że wysyłka startuje po rozpoznaniu znaku (start timera);

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


Z góry dzięki za wszelkie wskazówki i pomoc. Nie mam w posiadaniu zielonej książki, a tam jest opis parsowania tylko nie wiem, czy w ogóle dobrze ugryzłem problem ; posiłkowałem się na wypożyczonej zielonej książce z uczelnianej biblioteki, którą miałem jedynie przez tydzień i udało mi się tylko co nieco skserować ;) Niebieską mam i sobie chwalę, bo nie raz mi już pomogła przy programowaniu.



Ostatnio edytowano 9 wrz 2017, o 20:53 przez staszjar9, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2017, o 21:30 
Offline
Użytkownik

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

Tzn. tak, jeden uart atmegi głównej jest do komunikacji z PC, a drugi do wysyłania znaku na magistralę i odbioru danych.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2017, o 21:46 
Offline
Użytkownik

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

Czekaj, bo nie wiem, czy Cię zrozumiałem, chodzi o przerwanie od timera czy przerwanie od odbioru z drugiej atmegi?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2017, o 22:08 
Offline
Użytkownik

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

przerwanie od timera - co do tego to jak dotąd mam to tak ustalone, że jeden timer załącza się po 7 sek. od załączenia vcc, dalej jest wysyłka danych z kolejnych kanałów adc, potem stop timera (zerowanie rejestrow CS..); jednoczesnie od razu po starcie działa drugi timer, który zajmuje się wysyłką znaku i odbiorem danych z adc drugiego uC.
Pierwszy timer ok, wysyłka jest.
Co nie działa? Może moja koncepcja jest błędna, ale chciałem odbierać zewn. dane, wysyłane też z użyciem timera, który załącza się po rozpoznaniu znaku przez uC i zatrzymuje się po dajmy na to np. wysyłce danych z 3 kanałów (czyli po rozpozn. znaku po 3 sek stop timera). Jednocześnie przerwanie w głownej atmedze odbiera już przygotowane dane, zapisuje w buforze i za jakiś czas przesyła do PC. Druga część kodu, który zamiescilem, to kod dla "uart.c", tylko że gromadzenie danych w buforze jest z tego co rozumiem znak po znaku, a ja wysyłam z drugiego uC od razu już przygotowane pomiary (co sek.) do wyświetlenia i chcę go przekazać dalej do PC>



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2017, o 22:54 
Offline
Użytkownik

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

Może się w końcu dogadamy, staram się jak najdokładniej opisać problem, napisałem przecież na samym początku, że próbowałem bufora cyklicznego i opisałem co chcę zrobić, a nie potrafię. A kolega uszczypliwie i po co, ale nie ma co roztrząsać. Btw,
Dobrze, konkretnie nie działa odbiór danych i wysłanie ich do PC, bo nie wiem jak obsłużyć/zapamiętać/odczytać dane w buforze - dane, które przychodzą. Problem się objawia tym, że dostaję dane z atmegi 1 po uarcie, pozniej wysyłam znak i czekam aż mi coś przyjdzie z drugiej atmegi, ale nie przychodzi, bo nie wiem, jak zbudować funkcję do odbioru danych z wykorzystaniem bufora.
Druga część kodu to wnętrze pliku "uart.c", dotyczy to bufora i zaczerpnięto kod z BB Pana Mirka. Jak mam odczytać te dane, to jest problem. One nadlatują już jako gotowe i przeliczone wyniki pomiarów, jak to zachować i później przesłać dalej - tego nie potrafię,



Ostatnio edytowano 22 sie 2017, o 23:05 przez staszjar9, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2017, o 23:10 
Offline
Użytkownik

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

Czyli zamiast ascii_line flaga i sprawdzanie linii?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2017, o 23:29 
Offline
Użytkownik

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

Zagwozdka, bo nie ma tej flagi w przerwaniu. Powinna być w przerwaniu od RX?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2017, o 23:34 
Offline
Użytkownik

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

No tak, dzięki, spróbuję jutro popołudniu, w zasadzie to juz dzisiaj.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2017, o 21:38 
Offline
Użytkownik

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

Cześć,
Dodałem zmienną flagi i inkrementuje się ona w przerwaniu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Nie wiem, czy kolega to miał na myśli pisząc o fladze w odpowiedzi na moje pytanie.
Co do funkcji pobierającej dane z bufora - posiłkuję się funkcją z książki Pana Mirka, teraz wygląda ona tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Funkcja jest w pliku uart.c.
Gdybym chciał ją wywołać w main.c , samo wywołanie powinno wyglądać w ten sposób?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Ostatnio edytowano 27 sie 2017, o 21:45 przez staszjar9, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sie 2017, o 19:14 
Offline
Użytkownik
Avatar użytkownika

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

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

pobiera adres do buf ( bufor linii )tablica[], - musisz utworzyć odpowiedni bufor większy od oczekiwanej linii,
zwraca jednocześnie adres tego bufora - po odebraniu linii do tego bufora pod adresem "tablica" .
można by to wykorzystać np.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Tak mi się to widzi. :?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2017, o 22:18 
Offline
Użytkownik

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

Chyba tutaj kilku rzeczy nie rozumiem, nie wiem, czy dobrze zrozumiałem kolegę Daro. I jak ma wyglądać w kodzie rozwiązanie opisane wyżej,
Tzn. teraz w pliku main zadeklarowałem tablicę dla danych przych. z uarta :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Natomiast w przerwaniu od timera3 (też w pliku main) chciałem to wywołać w ten sposób:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

To jedyne linijki, które dodałem.
Co jest nie tak...? Męczę się z tym bo nie wiem, jak ma działać wywołanie; program jest wgrany do uC, ale nie otrzymuję po zadanym czasie danych z drugiego uC...
Proszę o pomoc i dzięki z góry za dotychczasową, czas mnie nagli :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sie 2017, o 12:30 
Offline
Użytkownik
Avatar użytkownika

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

Witam,
Widzę że w wątku zrobiło się cicho.
Nie dam rady ot tak z palucha klepnąć kodu który u Ciebie zadziała. Za cienki jestem. :)
Zaczął bym od sprawdzenia czy z tego cichego uc wysłany stringi dociera do pc.
Jeżeli tak, to znaczy że nie ma chochlików w ustawieniach.
Następnie
po otrzymaniu znaku z tamtego uc wysyłał bym ustalony na sztywno stringi.
Jeżeli docierał by do pc w rytm otrzymanego znaku,
to znaczyło by że obie komunikację są ok i trzeba szukać dalej.
Krok po kroku eliminując podejrzenia.
Pozdrawiam.

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



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

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

Fusebity sprawdzone, ustawienie wydaje się ok,
nie działa nawet odczytanie znaku z bufora przez funkcję pobZn(); ..
-> na razie chcialem sprawdzić, czy po wysłaniu znaku do drugiego procka odpowie wysłaniem znaku,
więc chciałem wywołać pobranie znaku z bufora funkcją pobZn(), już nie wiem, czy tak to mam przesłać do PC..

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


A przerwanie od uarta1; może źle przekazuję dane z UDR1 do UDR0?> :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Powinno chyba działać, nie wiem już co jest grane... czy może ktoś zweryfikować te dwa powyższe kawałki kodu bo wydaje mi się, że jest ok. W takim razie nie nadlatują znaki?...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2017, o 07:48 
Offline
Użytkownik

Dołączył(a): 19 sty 2014
Posty: 83
Pomógł: 2

Według mnie złym pomysłem jest wysyłanie w przerwaniu czegokolwiek po Uarcie .
Taki cytat:
"W tak zwanym prologu funkcji (generowanym automatycznie przez kompilator)
zapisywane są wszystkie rejestry procesora, które funkcja zmienia. Przed jej zakończeniem
ich stan jest odtwarzany w czasie wykonywania tzw. epilogu funkcji (on również
jest generowany automatycznie przez kompilator). Dzięki temu przerwany wątek
jest wznawiany w dokładnie takim samym stanie, w jakim został przerwany — z jego
punktu widzenia procesor zachowuje się więc tak, jakby przerwania w ogóle nie było."

Użyj flag.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sie 2017, o 10:51 
Offline
Użytkownik

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

jaca_76 napisał(a):
Według mnie złym pomysłem jest wysyłanie w przerwaniu czegokolwiek po Uarcie .
Taki cytat:
"W tak zwanym prologu funkcji (generowanym automatycznie przez kompilator)
zapisywane są wszystkie rejestry procesora, które funkcja zmienia. Przed jej zakończeniem
ich stan jest odtwarzany w czasie wykonywania tzw. epilogu funkcji (on również
jest generowany automatycznie przez kompilator). Dzięki temu przerwany wątek
jest wznawiany w dokładnie takim samym stanie, w jakim został przerwany — z jego
punktu widzenia procesor zachowuje się więc tak, jakby przerwania w ogóle nie było."

Użyj flag.
Słuchajcie a może problem tkwi w złym przepisaniu danych nadlatujacych do uarta1 a później przekazaniu przez uart0 do PC. W ogóle jak to najprościej zrobić? Po sprawdzeniu oscyloskopem linii uarta1 wiem ze przebieg się zmieniał, wiec dane nadchodzą tylko co dalej, bo coś jest nie tak. Dzięki za wszelkie podpowiedzi

Wysłane z mojego GT-I9505 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 wrz 2017, o 18:58 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam,

kol. staszjar9, nie wiem, czy Cię dobrze zrozumiałem, jeśli nie, to mnie popraw:
- Masz 2 uC, jedrn coś tam mierzy przez ADC i cyklicznie wysyła do drugiego uC,
- Ten drugi uC ma te dane odebrać, jakoś tam sparsować i wysłać do PC przez swój drugi UART ?

Pozdrawiam, QuadMan.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2017, o 21:20 
Offline
Użytkownik

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

Tak, wszystko się zgadza. Wracając do tematu,

Mam pytanie do Was, chciałbym wysłać odebrane dane w przerwaniu od USARTA1 (RX_vect) dalej przez usarta0 do PC. Czy ma się to odbywać w taki sposób?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Powinno chyba zadziałać, ale nie działa, co jest nie tak? Proszę o podpowiedź.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 wrz 2017, o 14:16 
Offline
Użytkownik

Dołączył(a): 19 sty 2014
Posty: 83
Pomógł: 2

A flaga jest VOLATILE ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 wrz 2017, o 16:22 
Offline
Użytkownik

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

jaca_76 napisał(a):
A flaga jest VOLATILE ?


Tak, volatile int flaga;



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 wrz 2017, o 18:11 
Offline
Użytkownik

Dołączył(a): 19 sty 2014
Posty: 83
Pomógł: 2

Jeśli to jest cały kod ,to jest zły.

UDR0 = data;

A gdzie jest ustawiana wartość data?
I wciąż w przerwaniu chcesz coś (w sumie nie wiadomo co) wysłać do drugiego uarta.
Moim zdaniem powinno być tak:

W przerwaniu RX1
data = UDR1
i ustawienie flagi.

W głównej pętli sprawdzanie flagi i jeśli jest ustawiona wysyłanie .
Pamiętaj że jeżeli nadleci więcej danych to ci nadpiszą .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 wrz 2017, o 19:43 
Offline
Użytkownik

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

jaca_76 napisał(a):
Jeśli to jest cały kod ,to jest zły.

UDR0 = data;

A gdzie jest ustawiana wartość data?
I wciąż w przerwaniu chcesz coś (w sumie nie wiadomo co) wysłać do drugiego uarta.
Moim zdaniem powinno być tak:

W przerwaniu RX1
data = UDR1
i ustawienie flagi.

W głównej pętli sprawdzanie flagi i jeśli jest ustawiona wysyłanie .
Pamiętaj że jeżeli nadleci więcej danych to ci nadpiszą .
Masz rację, czeski błąd wkradł się do kodu. Dzięki, jeszcze nie skończyłem projektu ale na razie odbiór znaku z drugiego uC wkoncu działa. W razie czego będę jeszcze tutaj prosił o pomoc [emoji6]

Wysłane z mojego GT-I9505 przy użyciu Tapatalka



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 7 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