logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Bascom ,Atmega32 , Rs232- czyta tylko dwa lub trzy znaki

adambehnke 07 Cze 2009 09:53 3292 10
REKLAMA
  • #1 6625814
    adambehnke
    Poziom 24  
    Posty: 882
    Pomógł: 23
    Ocena: 40
    Witam

    Zmontowałem (prawie) sterownik do C.O. i wystąpił problem.
    Otóż urządzenie nadaje do komputera poprzez RS232 swoje aktualne parametry w postaci:

     Print c(1),c(2),c(5) ..................... 

    I tu wszystko jest OK.
    Ale problem jest w drugą stronę. Przy instrukcji:
     input Rsin 

    odczytuje tylko dwa pierwsze znaki (czasem 3 lub 4) np.
    Wysyłam z terminala np: 12345678 a atmega odbiera tylko : 12 lub 123 itd
    Jak testowałem samą procedurę odczytów i zapisów to nie było problemów ale jak wmontowałem to już w działający program sterownika to zaczęły się problemy.

    Dodam że ustawienia mam takie:

    $regfile = "m32def.dat"
    $crystal = 16000000
    $baud = 9600                                                ' use baud rate
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 8                                                ' default use 10 for the SW stack
    $framesize = 24   



    a odczytuje tak:

    $timeout = 1
                                                    
    Input Rsin
    If Rsin = "set" Then Rsdata(1) = "Ustawienia RS"


    Może coś mam źle ustawione lub odczytuje się to jakoś inaczej?
    Sprawa jest taka że program musi lecieć w pętli cały czas i nie mogę uzyć np samego polecenia :

    muszę używać jeszcze


    aby program nie stawał i nie czekał ma wprowadzenie czegoś z terminala.
    Najlepiej aby umieścić cała procedurę wysyłania i odbierania danych w jakimś np. timerze. Piszę programiki w Visual Basic i tam takich odzielnych timerów-podprogramów wykonywanych w między czasie mogę wstawiać dużo. Ale w Bascomie nie mam pojęcia jak to ugryźć.
    Poprostu wszystko działa ok poza tym że zjada mi znaki w wysyłanych danych z terminala lub mojej aplikacji w VB.Próbowałem używać różnych prędkości portu com i w sumie działa mi tylko na 4800 i 9600.Dziwne.

    Procek taktuję tak:
    $crystal = 16000000  


    Proszę o jakąś poradę lub naprowadzenie mnie "łopatologicznie" na trop.
    Dla zgryźliwych dodam że:
    1.Przeglądałem bardzo intensywnie sample w Bascomie
    2.przeszukiwałem Google i uruchamiałem 1000000 różnych kodów
    3.Skończyły mi się pomysły.
  • REKLAMA
  • Pomocny post
    #2 6625874
    pixel7
    Poziom 24  
    Posty: 656
    Pomógł: 53
    Ocena: 160
    Zastosuj bufor:

    Config Serialin = Buffered , Size = 100 
    enable interrupts


    A oczekiwanie na znak zrób:

    Bufor_flaga = Ischarwaiting() : If Bufor_flaga = 1 Then Gosub Odbierz_uart 


    Następnie procedura odbioru danych:

    Odbierz_uart:
    
          Bufor = ""
    
          Do
             Bufor_znak = Inkey()
             Bufor = Bufor + Chr(bufor_znak)
             Bufor_flaga = Ischarwaiting()
    
          Loop Until Bufor_znak = Chr(13) Or Bufor_flaga = 0
    
    Return


    Powinno pomóc.
  • REKLAMA
  • #3 6627813
    adambehnke
    Poziom 24  
    Posty: 882
    Pomógł: 23
    Ocena: 40
    Ok wszystko fajnie ale jeszcze jak zadeklarować te zmienne, jako co?


    
    dim   Bufor   as ???
    dim   Bufor_znak   as ???
    dim   Bufor_flaga  as ???


    Niby pewnie proste ale dla mnie stanowi to jeszcze problem :|
  • REKLAMA
  • Pomocny post
    #4 6629433
    hose2
    Poziom 17  
    Posty: 106
    Pomógł: 23
    Ocena: 4
    adambehnke napisał:
    jak zadeklarować te zmienne?

    A np. tak
    
    dim   Bufor   as string * 16  ' 16 - maksymalna długość odebranych danych
    dim   Bufor_znak   as byte
    dim   Bufor_flaga  as byte
  • #5 6629521
    adambehnke
    Poziom 24  
    Posty: 882
    Pomógł: 23
    Ocena: 40
    Dziękuję za pomoc. Wszystko śmiga jak powinno :)

    Dodano po 2 [minuty]:

    Mam jeszcze pytanko. Na jaką odległośc i jakim kablem mogę pociągnąć połączenie między komputerem a moim sterownikiem podlączonym przez RS232 (używam Rxd,Txd i Gnd).
    Interesuje mnie odległość 100-200m. W jaki sposób mogę to zrobić.Czy zwykła skrętka się do tego nadaje?
  • #6 6631549
    adambehnke
    Poziom 24  
    Posty: 882
    Pomógł: 23
    Ocena: 40
    Niestety nadal występują problemy z przesyłaniem danych z PC do atmegi poprzez rs232. Z atmegi mogę wysyłac max 14 znaków w jednym poleceniu (nie wiem dlaczego) a z PC do atmegi idą max 3-4. O co chodzi?? Nie mam już pojęcia. Czasem lubi nawet zgubić część przesłanych danych np. wysyłam cd1234 a do atmegi dochodzi 234.

    Dodano po 5 [minuty]:

    Może ma ktoś jakąś gotową procedurę odczytu i zapisu Portu rs232 w Bascomie tak abym mógł ją zmodyfikować do swoich celów i umieścić w swoim kodzie. I czy możliwe jest zrobienie czegoś takiego aby cały kod umieścić w jakimś timerze aby był wykonywany niezależnie od programu głównego.Coś jak osobny podprogram pracujący w ciągłej pętli który tylko by zwracał dane i wpisywał do portu jakieś dane podane z programu głównego. Nie wiem czy wyraziłem się jasno ale mniej więcej o coś takiego mi chodzi.
    I proszę mi nie pisać "A może by tak kolega zajrzał do katalogu samples" bo chyba zwariuję.
  • REKLAMA
  • Pomocny post
    #7 6631809
    PiotrPitucha
    Poziom 34  
    Posty: 2658
    Pomógł: 201
    Ocena: 424
    Witam
    Piszesz o baaaardzo dużych odległościach jak na możliwości RSa, jaki długi masz kabel?, transmisja ma prawo zdechnąć po kilkunastu metrach, na duże odległości tylko RS485.
    Mam sugestię w celach testowych, zmniejsz baud na 1200 lub jeszcze niżej i potestuj czy problem jest identyczny.
    Piotr
  • #8 6633026
    adambehnke
    Poziom 24  
    Posty: 882
    Pomógł: 23
    Ocena: 40
    Duże odległości mam dopiero w planie ale nie wiem jak uniknąć osłabienia sygnału i zakłóceń.

    W tej chwili kabel pomiędzy kompem a modułem ma niespełna 1m. Więc nie ma tu mowy o osłabieniu czy czymś podobnym.

    A co polecacie i jak rozwiązać transmisję przy odległościach 50 - 150m?
  • Pomocny post
    #9 6633165
    PiotrPitucha
    Poziom 34  
    Posty: 2658
    Pomógł: 201
    Ocena: 424
    Witam
    Co do transmisji na setki metrów to RS485, właściwie w protokole nie ma różnicy, zamiast MAX232 dajesz coś do tego typu transmisji, chyba nawet scalak na którym kiedyś robiłem 500m nazywał się MAX485, pamiętaj o prawidłowym zaterminowaniu linii by nie było odbić, wartości oporników znajdziesz w PDFach.
    Drugi pomysł to światłowód, może dokładniej pseudo światłowód stosowany do transmisji audio i para nadajnik odbiornik dostosowany do tego typu grubych światłowodów z tworzyw sztucznych ( TME a może Elfa ? ).
    Trzeci pomysł to nadajniki, na takiej parze osiągniesz bez kłopotu 100m chyba że pomieszczenia bardzo ekranowane, to rozwiązanie nie jest drogie a uniezależnia Cię od przywiązania do jednego miejsca i umożliwia odpytywanie kilku nadajników z jednej centralki.
    Piotr
  • #10 6633688
    qmaps
    Poziom 2  
    Posty: 4
    Pomógł: 1
    Ocena: 1
    Cytat:
    Z atmegi mogę wysyłac max 14 znaków w jednym poleceniu (nie wiem dlaczego) a z PC do atmegi idą max 3-4. O co chodzi??


    Chodzi o rozmiar buforów - w ATMedze więcej znaków niż 3 się w buforze nie mieści - jeśli nie zdążą być odczytane, powinny zostać nadpisane przez kolejne, ale tak się nie dzieje - zarówno po stronie ATMegi, jak i komputera.
    Generalnie - trzeba dopasować prędkość transmisji do możliwości obu odbiorników.

Podsumowanie tematu

✨ Użytkownik pyta o możliwość płynnej gry w InZoi po modernizacji komputera (obecnie i5-7500, RX 470, 16GB DDR4) poprzez wymianę płyty głównej, procesora i pamięci RAM w budżecie 1500 zł. Rozważa zestaw Intel i5-14400F + B760 GAMING X AX + 16GB 6000 DDR5. Pomimo, że ten zestaw CPU/MB/RAM poradziłby sobie, głównym ograniczeniem jest obecna karta graficzna RX 470, która jest znacznie poniżej minimalnych wymagań gry (RTX 2060). Zestaw oparty o platformę Intel LGA1700 jest określany jako "martwy" ze względu na brak przyszłych możliwości rozbudowy procesora, w przeciwieństwie do platformy AMD AM5, która ma wspierać kolejne generacje procesorów Ryzen. Rekomendowany jest zestaw oparty o AMD Ryzen 5 7500F, płytę B650 (np. ASUS TUF B650-E GAMING), oraz 16GB lub 32GB pamięci DDR5 6000MHz CL30. Dyskusja skupia się następnie na konieczności wymiany karty graficznej. Opcje takie jak RX 580 są uznawane za zbyt mało wydajne. Rozważane są używane karty w przedziale cenowym, w tym RX 6600 i RTX 2060 Super, z debatą nad różnicami w wydajności, poborze mocy i wsparciu dla technologii takich jak DLSS. Karta RTX 4060 8GB jest odrzucana ze względu na małą ilość VRAM. Ostatecznie, użytkownik skłania się ku karcie RX 6700 XT, która jest uznawana za wydajniejszą od RTX 4060 i posiada wystarczającą ilość VRAM (12GB). Potwierdzono, że istniejący zasilacz SilentiumPC Vero L1 600W powinien być wystarczający dla konfiguracji z RX 6700 XT.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA