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



Teraz jest 6 kwi 2026, o 17:57


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 9 cze 2014, o 12:35 
Offline
Użytkownik

Dołączył(a): 02 maja 2014
Posty: 78
Pomógł: 1

Czołem,
od wczoraj męczę się z transmisją po rs232. Korzystam z kodu z niebieskiej płytki.
Otóż jest tam bufor, który jest uzupełniany za każdym razem kiedy coś pojawi się w UDR i tym samym wywoła przerwanie.
Problemem jest dla mnie ściąganie tych danych z bufora w mainie.
Mam taką pętlę:
Kod:
while(1)
   {

      do
      {i++;
      bajty[i-1]=uart_getc();
      }while(bajty[i-1]!=0);
      i=0;
      
      LCD_GoTo(0,1);
      LCD_WriteText(bajty);
      uart_puts(bajty);

   }

I niestety nie działa to poprawnie. Po analizie doszedłem nawet dlaczego(chyba:D). Otóż kolejne bajty wpadają do UDR dość powoli bo co około 1ms(wartość obliczona na jakiejś innej stronce, więc nie wiem czy to prawda...), a pętla zaiwania dużo szybciej. Przez to kiedy wpada pierwszy bajt, pętla do...while przelatuje i się kończy zanim wpadnie drugi. Potem ten jeden jest wyświetlany i znów wpada kolejny bajt(może nawet po kilku obiegach głównego while) i tak w kółko. Przez to tablica bajty jest cały czas nadpisywana i na wyświetlaczu mam tylko ostatni znak tego co wysyłam z terminala.

Rozwiązuje to dodatnie delaya do pętli np:
Kod:
while(1)
   {

      do
      {i++;
                _delay_ms(3);
      bajty[i-1]=uart_getc();
      }while(bajty[i-1]!=0);
      i=0;
      
      LCD_GoTo(0,1);
      LCD_WriteText(bajty);
      uart_puts(bajty);

   }


Ale wydaje mi się że nie tędy droga. Może ktoś mnie naprowadzić na właściwą trasę?

Może by jakąś flagę ustawiać kiedy cała wiadomość jest już w buforze i dopiero wtedy ją pobierać z bufora?
No kurcze nie mogę wpaść na pomysł jak to rozwiązać...



Ostatnio edytowano 9 cze 2014, o 20:03 przez skoomi, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2014, o 12:59 
Offline
Moderator
Avatar użytkownika

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

skoomi napisał(a):
Otóż kolejne bajty wpadają do UDR dość powoli bo co około 1ms(wartość obliczona na jakiejś innej stronce, więc nie wiem czy to prawda...),


o żesz matko erychejska ;) .... jaka kosmiczna teoria ;)

nie nie Panie kolego ... bufor jest po to żeby była najbardziej sprawna obsługa i od TEGO się zaczyna myślenie o komunikacji RS232

a to że masz kłopot z obsługą tego na nieco już wyższym poziomie bo obróbki nadsyłanych danych to już CAAAAAAŁKIEM inne zagadnienie

poszukaj ciut na forum ... jeśli nie masz Greenbooka w którym to dalej jest wyjaśniane w ostatnim rozdziale. Bo na forum co i rusz szczególnie pojawia się temat odbioru danych z bufora cyklicznego ... gorzej tylko jak w grę zaczynają wchodzić takie pomysły o powolnym odbieraniu 1ms ! ;) .... to byłaby dopiero masakra

Wskazówka? .... poczytaj sobie najpierw DOKŁADNIE jeszcze raz cały rozdział o buforowaniu cyklicznym i o tym jak po kolei budujemy tę obsługę, bo coś czuję że przeleciałeś jak burza ... a widać to po sposobie w jaki próbujesz posługiwać się funkcją uart_getc() .... A jak czegoś nie będziesz rozumiał to dopytaj ....

nie zastanowiło cię że ta funkcja zwraca zero gdy nic nie będzie odebrane ?

_________________
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: 9 cze 2014, o 13:11 
Offline
Użytkownik

Dołączył(a): 02 maja 2014
Posty: 78
Pomógł: 1

Cytuj:
nie zastanowiło cię że ta funkcja zwraca zero gdy nic nie będzie odebrane ?

Wydaje mi się, że to właśnie po to, aby wiedzieć kiedy przeszła już cała wiadomość.
Cytuj:
o żesz matko erychejska ;) .... jaka kosmiczna teoria

Już ją kasuję z głowy ;) Tylko dlaczego w takim razie ten delay pomógł?

Niestety Greenbooka jeszcze nie mam. Dzięki za wskazówkę czego szukać. Mam nadzieję, że coś z tego wyjdzie. Odezwę się później, bo pewnie coś mnie przerośnie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2014, o 13:19 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

Kolego skoomi. Nigdy ale przenigdy nie umieszczaj pisania po lcd'ku w pętli głównej, bo nic innego nie robisz jak tylko przenosisz kursor na pozycję (0,1) i coś tam od tej pozycji wpisujesz lub nie w zależności od bajty[]. A może by tak jakąś flagę sprawdzać i potem dopiero pisać na lcd'ku? Zastanów się w którym momencie potrzebne ci jest przeniesienie kursora na początek linii? Do tego może też jakaś flaga by się przydała albo jakiś specyficzny kod w buforze?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2014, o 13:23 
Offline
Użytkownik

Dołączył(a): 02 maja 2014
Posty: 78
Pomógł: 1

Przyjąłem! Dzięki za cenne wskazówki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2014, o 13:38 
Offline
Moderator
Avatar użytkownika

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

skoomi napisał(a):
Wydaje mi się, że to właśnie po to, aby wiedzieć kiedy przeszła już cała wiadomość.


Absolutnie nie ;)

zwraca zero gdy nie ma nic w buforze - więc jakoś totalnie odwrotnie coś zrozumiałeś

więc w twoich próbach powinien być jakiś if ... i gdy zwraca zero to ignorujesz

dla ciebie wyznacznikem że coś jest w buforze powinno być to gdy ta funkcja zwróci wartość większą niż 31 (dziesiętnie) ... czyli począwszy od spacji ;)

_________________
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: 9 cze 2014, o 20:12 
Offline
Użytkownik

Dołączył(a): 02 maja 2014
Posty: 78
Pomógł: 1

No to rzeczywiście całkiem coś sknociłem:D No nic, będę próbował to ogarnąć. Zaraz zresztą zamówię Greenbooka.

Przepraszam że zmienię teraz temat ale ponieważ goni mnie czas to wpadłem na pomysł zastosowania komunikacji w trybie "pollingu". Myślę że to wystarczy do mojego projektu aż nadto, ponieważ do pcta będę wysyłał dane tylko na zawołanie użytkownika, a slejwy będę odpytywał co 5 minut.


Mam teraz dziwny problem z menu. Na końcu pętli głównej jest instrukcja LCD_GoTo(0,1); Jest ona tam zupełnie niepotrzebna, jednak bez niej po naciśnięciu klawisza0 nie otwiera się menu. Niby dlaczego? Chodzi o opóźnienie jakie ona wprowadza?
Wiem że obsługa klawiszy w przerwaniach zewnętrznych to kpina, ale będą tylko te dwa klawisze i zrobiłem to na szybko!
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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