ATNEL tech-forum
https://forum.atnel.pl/

Prośba o pomoc, rs232 + adc
https://forum.atnel.pl/topic19039.html
Strona 1 z 1

Autor:  staszjar9 [ 22 sie 2017, o 19:50 ]
Tytuł:  Prośba o pomoc, rs232 + adc

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.

Autor:  staszjar9 [ 22 sie 2017, o 21:30 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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

Autor:  staszjar9 [ 22 sie 2017, o 21:46 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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

Autor:  staszjar9 [ 22 sie 2017, o 22:08 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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>

Autor:  staszjar9 [ 22 sie 2017, o 22:54 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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

Autor:  staszjar9 [ 22 sie 2017, o 23:10 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

Czyli zamiast ascii_line flaga i sprawdzanie linii?

Autor:  staszjar9 [ 22 sie 2017, o 23:29 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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

Autor:  staszjar9 [ 22 sie 2017, o 23:34 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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

Autor:  staszjar9 [ 23 sie 2017, o 21:38 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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.

Autor:  Daro69 [ 25 sie 2017, o 19:14 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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. :?

Autor:  staszjar9 [ 27 sie 2017, o 22:18 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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

Autor:  Daro69 [ 28 sie 2017, o 12:30 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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

Autor:  staszjar9 [ 28 sie 2017, o 19:38 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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

Autor:  jaca_76 [ 29 sie 2017, o 07:48 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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.

Autor:  staszjar9 [ 30 sie 2017, o 10:51 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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

Autor:  QuadMan [ 1 wrz 2017, o 18:58 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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.

Autor:  staszjar9 [ 7 wrz 2017, o 21:20 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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

Autor:  jaca_76 [ 8 wrz 2017, o 14:16 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

A flaga jest VOLATILE ?

Autor:  staszjar9 [ 8 wrz 2017, o 16:22 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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


Tak, volatile int flaga;

Autor:  jaca_76 [ 8 wrz 2017, o 18:11 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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

Autor:  staszjar9 [ 9 wrz 2017, o 19:43 ]
Tytuł:  Re: Prośba o pomoc, rs232 + adc

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

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/