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



Teraz jest 19 kwi 2024, o 13:11


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 8 cze 2023, o 12:51 
Offline
Użytkownik

Dołączył(a): 19 lut 2020
Posty: 48
Pomógł: 0

Czołem!
Zatrzymałem się w pewnym miejscu mojego projektu i nie mam pojęcia jak to ugryźć, skończyły mi się pomysły.
W urządzeniu nadawczym przez użycie przycisków zmieniam stan 0/1 ośmiu zmiennych które sumują się w jedną wartość i po wysłaniu do urządzenia odbiorczego przez RS485 załączają poszczególne wyjścia z rejestru przesuwnego. Sprawa dość prosta, bo jeśli wyślę wartość zmiennej np 67 to odebrane 67 wysyła się od razu przez SPI do rejestrów. Z tym że z opóźnieniem jednego kroku którego nie potrafię się pozbyć.

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


Sprawa wygląda tak:
WYSYŁAM: 10
ODBIERAM: NIC

WYSYŁAM: 25
ODBIERAM: 10

WYSYŁAM: 12
ODBIERAM: 25

Wszystko co wyślę to odbieram, z tym że z przesunięciem jednego kroku. Problem leży zapewne w zmianie wartości "zmiennaX_status^=1", bo jak wysyłam w innym przypadku po prostu konkretną wartość to nie ma problemów.

Może mnie ktoś nakierować jak się tego pozbyć?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2023, o 10:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

magnetic napisał(a):
Sprawa dość prosta, bo jeśli wyślę wartość zmiennej np 67 to odebrane 67 wysyła się od razu przez SPI do rejestrów.

Pogubiłem się. USART a SPI, to różne transmisje danych. By wysłać daną musisz ją przygotować, by odbiornik mógł ją zdekodować(jak w enigmie - zamienić na informację użyteczną).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2023, o 11:32 
Offline
Użytkownik

Dołączył(a): 19 lut 2020
Posty: 48
Pomógł: 0

Może za bardzo skróciłem myśl. W urządzeniu nadawczym toggluję wartość "zmiennaX_status^=1;" i ich wynik wyświetlam na ledach w tym samym urządzeniu, i jednocześnie sumę 8 takich zmiennych (przypisanie bitowe) wysyłam przez UART do urządzenia odbiorczego. W tym urządzeniu odebraną wartość tych zmiennych wyświetlam na ledach przez rejestr przesuwny po SPI. O!
O ile w urządzeniu nadawczym wszystko działa zgodnie z założeniem, bo po wciśnięciu przycisku zmieniam stan na przeciwny i od razu tak się zapala led, to odbiór zachowuje się tak, jakby za mało czasu było między zmianą wartości a wysłaniem tej nowo ustalonej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2023, o 19:40 
Offline
Użytkownik

Dołączył(a): 19 lut 2020
Posty: 48
Pomógł: 0

To przy okazji, żeby nie zakładać kolejnego wątku podpytam o inne dolegliwości.

Mam kość 24C32 i zapisuję w niej i odczytuję strukturę:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jeśli mam włożoną kość 24c32 to odczytuje mi (i prawdopodobnie też zapisuje, nie mam jak sprawdzić) wartość tylko pierwszej zmiennej. Jeśli włożę 24c512, która ma być docelowo to zapisuje wszystkie 3 bez problemu. Czy kość 24c32 wymaga jakiejś zmiany w kodzie, biblioteki TWI czy coś?

Sprawa druga to stan zmiennych po włączeniu urządzenia. Mam kilka zmiennych, których wartości przed pętlą główną przypisuję jako 0, a po podłączeniu zasilania ustawiają się zupełnie dziwne wartości. Co ciekawe, kiedy wcisnę reset na programatorze, to urządzenie się wyłącza i włącza z poprawnymi wartościami. Ktoś się spotkał z czymś takim?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 cze 2023, o 22:00 
Offline
Użytkownik

Dołączył(a): 21 lip 2014
Posty: 28
Pomógł: 4

Możliwe, że w obsłudze rejestru szeregowego złym miejscu "klepiesz laczkiem" - najpierw powinieneś wpisać do rejestru żądane stany, a następne wysterować zatogglować wejście latch



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2023, o 20:43 
Offline
Użytkownik

Dołączył(a): 19 lut 2020
Posty: 48
Pomógł: 0

Jeśli dotyczyło to przesuniętego odbioru danych to moim zdaniem nie ma to nic wspólnego z latchowaniem. Bo jakbym wrzucił funkcję SPI w główną pętlę to by problem zniknął. Mam kilka przycisków, które po wciśnięciu mają przypisaną konkretną wartość i z nimi nie ma problemu, odbieram taką wartość jaka jest przypisana do przycisku. Problem z tym przesunięciem dotyczy tylko przycisków, które togglują wartość zmiennej 0/1 i tylko z odbiorem tych zmienionych wartości po RSie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 cze 2023, o 16:02 
Offline
Użytkownik

Dołączył(a): 21 lip 2014
Posty: 28
Pomógł: 4

magnetic napisał(a):
Czołem!
Zatrzymałem się w pewnym miejscu mojego projektu i nie mam pojęcia jak to ugryźć, skończyły mi się pomysły.
W urządzeniu nadawczym przez użycie przycisków zmieniam stan 0/1 ośmiu zmiennych które sumują się w jedną wartość i po wysłaniu do urządzenia odbiorczego przez RS485 załączają poszczególne wyjścia z rejestru przesuwnego. Sprawa dość prosta, bo jeśli wyślę wartość zmiennej np 67 to odebrane 67 wysyła się od razu przez SPI do rejestrów. Z tym że z opóźnieniem jednego kroku którego nie potrafię się pozbyć.

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


Sprawa wygląda tak:
WYSYŁAM: 10
ODBIERAM: NIC

WYSYŁAM: 25
ODBIERAM: 10

WYSYŁAM: 12
ODBIERAM: 25

Wszystko co wyślę to odbieram, z tym że z przesunięciem jednego kroku. Problem leży zapewne w zmianie wartości "zmiennaX_status^=1", bo jak wysyłam w innym przypadku po prostu konkretną wartość to nie ma problemów.

Może mnie ktoś nakierować jak się tego pozbyć?


Czyli jeśli wysyłasz wartość 10 to za pierwszym razem odbierasz wartość 10?
Może zmienną zmiennaX_status wpisujesz do bufora nadawczego po wywołaniu funkcji uart_putba, przez co ta wartość poleci w kolejnym obiegu pętli programu,
Jeżeli możesz, podrzuć obsługę rejestru szeregowego



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 cze 2023, o 11:55 
Offline
Użytkownik

Dołączył(a): 19 lut 2020
Posty: 48
Pomógł: 0

Nadawanie wygląda tak:

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


W pierwszym przypadku wysyłam command=10 i cnt_preset=1 i to samo odbieram. A w drugim przypadku wartość loop_status jest właśnie z opóźnieniem jednego odbioru.

Funkcja do wysyłania po SPI wygląda tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I działa w pętli bo prócz ledów mam też podłączony wyświetlacz. Wszystkie możliwe zmienne mam wyzerowane na starcie, a mimo to po podłączeniu zasilania wskakują, dziwne rzeczy (jakby były przypisane zupełnie inne wartości do kilku zmiennych). Co dziwne, tak jak wspomniałem wcześniej, dzieje się tak tylko kiedy podłączę układ do zasilania, jeśli wcisnę reset na programatorze to ustawiają się wszystkie wartości na zero tak jak w kodzie. Ale taka myśl mnie naszła, bo do przycisków mam równolegle wlutowane kondensatory 100nF (problem z debouncingiem, kod tego nie rozwiązuje za bardzo). I czy one po podłączeniu nie wysyłają sygnału do procka i nie ustalają jakichś wartości tych zmiennych. Byłoby to możliwe?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 cze 2023, o 22:33 
Offline
Użytkownik

Dołączył(a): 21 lip 2014
Posty: 28
Pomógł: 4

Nadawanie wygląda w miarę OK

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


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


i funkcją
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
wysyłasz do odbiornika (uważaj na sizeof w takim podejściu). Zakładam, że funkcja uart_putc() jest blokująca i zawartość uart_struct się nie zmienia, więc odbiornik powinien odebrać kolejno wartość command, cnt_preset oraz loop_status

Odbiór ramki
Zakładam, że masz rejestr szeregowy HC595 np. https://www.ti.com/lit/ds/symlink/sn74hc595.pdf
po wpisaniu do niego bajtu należy wygenerować zbocze narastające na PINIE 12 (RCLK) tzw. latch, przepisze on stany wyjść z bufora na wyjście, jeżeli zrobisz to przed wpisaniem bajtu, to na wyjściach pojawi się stan poprzedni, czyli pojawi się "opóźnienie"

Nazwa funkcja
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
wskazuje, że inicjalizuje SPI (wysyła 3 bajty, i wywołuje makro LATCH - co się pod nim kryje?, brakuje ustawienia nOE na stan niski)

Przez brak wysterowania nOE mogą pojawiać się artefakty po podłączeniu do zasilania, reset może powodować chwilowy stan niski na tym wejściu, co spowoduje załączenie wyjść ze stanami 0x00, 0x00, 0xFF

Dobrze jest wykonać nast. sekwencję:
1. wpisanie bajtu/bajtów,
2. wygenerowanie zbocza narastającego na latch, (0->1, 1->0),
3. załączenie wyjść (stan niski na nOE (pin 13)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 cze 2023, o 21:19 
Offline
Użytkownik

Dołączył(a): 19 lut 2020
Posty: 48
Pomógł: 0

Trochę się ten temat rozjechał chyba. Mam wrażenie, że o czym innym jest mowa. To może jeszcze raz na spokojnie.
W urządzeniu nadawczym wciskam odpowiednie przyciski zmieniające stan zmiennych i wartość tych zmiennych (stan ledów) wyświetla się przez SPI na ledach i jednocześnie wysyła wartości tych zmiennych przez RS485. W urządzeniu nadawczym, jedyny problem jaki jest to te przypadkowe wartości zmiennych (które są wszystkie przed pętla while ustawione na 0) po podłączeniu zasilania. Dotyczy to tego kodu:

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


Przez UART wysyłam strukturę po zmianie wartości. Przynajmniej w takiej kolejności jest napisany kod. Może faktycznie ta wartość wpisuje się najpierw do bufora a wysyła przy następnej okazji (?)

Odbiornik odbiera przez UART wartości ustalone w nadajniku i wyświetla ich stan na ledach przez SPI. Tutaj też wszystko działa dobrze, z wyjątkiem tego opóźnienia, o którym mowa od początku. I tylko w przypadku kiedy toggluję wartość, a nie wysyłam konkretną.

Biblioteka do UARTa, TWI i SPI jest z tego co pamiętam zaczerpnięta z filmików Mirka. Tak przedstawiał wysyłanie po SPI, więc tak zrobiłem i działa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 cze 2023, o 11:54 
Offline
Użytkownik

Dołączył(a): 21 lip 2014
Posty: 28
Pomógł: 4

W ramach tesu spróbuj przeznaczyć jeden przycisk na sterowanie programem. Tzn naciśnięcie przycisku (zbocze) wykona operację ustawienia ledów oraz wysłanie ramki. Ale tylko raz. W odbiorniku podobnie np. Odebranie ramki spowoduje ustawienie LED. Na czas testowania nadajnika, możesz podpiąć go pod port szeregowy komputera i tam czytać wysyłane wartości. W przypadku odbiornika możesz symulować nadawanie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 cze 2023, o 17:38 
Offline
Użytkownik

Dołączył(a): 19 lut 2020
Posty: 48
Pomógł: 0

Pisałem już wcześniej jak się zachowuje. Jeśli wyślę na sztywno wartość command=10, to odbieram command=10 od razu (zmiennej command używam do określenia czego ma dotyczyć zmiana w odbiorniku). Jeśli w innym trybie wyślę command=50 to odbieram command=50, ale wartość loop_status odbieram nie z tym samym wciśnięciem przycisku tylko z następnym. Jeśli zamiast loop_status^=1 wpiszę loop_status=1 to wyśle mi jedynkę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 cze 2023, o 20:09 
Offline
Użytkownik

Dołączył(a): 19 lut 2020
Posty: 48
Pomógł: 0

Problem ze stanem zmiennych przy podłączeniu zasilania rozwiązany - winne były kondensatory na przyciskach.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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