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

[Atmega16APU] [Atmega16APU][C] - Freemodbus nie odpowiada poprawnie, błąd Invalid function code

HowKnow 18 Paź 2016 20:12 1296 12
REKLAMA
  • #1 16003750
    HowKnow
    Poziom 9  
    Cześć, mam problem z wypróbowaniem pliku demo bibliotek freemodbusa, zdesperowany przychodzę po podpowiedzi.

    Całość montowana na płytce stykowej, sprawdzałem setki razy, raczej nie chodzi o pomyłkę A-B lub RX-TX. Używam do testów http://gridconnect.com/usb-to-rs485.html oraz mbpolla lub chipkina. Pytam o dobre rejestry.

    W oryginalnym kodzie zmieniłem prędkość na 9600 i brak parzystości, w pliku port dodalem definicje #define __AVR_ATmega16__ , #define RTS_ENABLE oraz zmieniłem PB0 na PINB0. Dodałem też definicję F_CPU w ustawieniach projektu.

    Używam MAX485. Wewn. zegar ustawiony na 8 Mhz.

    AVR nie odpowiada w ogóle, zauważyłem że gdy kliknę reset konwerter świeci diodą odbioru danych, po resecie urządzenie jednokrotnie niby coś odpowiada ale tester nie rozumie odpowiedzi i ja też
    [19:58:09] Recv error: Invalid function code
    [19:58:08] <= Response: 00 00 00 00 F0 80 00 3F 00 00 00 00 F0 00 FF 00 00 00 00 FF 00 00 00 F0 00 00 00 00 00 00 70 00 00 00 00 00 00 00 1C 00 00 00 80 00 00 C0 00 00 00 00 00 E0 00 00 00 00 00 00 00 00 80 00 00 00 E0 00 FC 00 00 C0 C0

    później już sam TIMEOUT. Prosiłbym o pomoc.
  • REKLAMA
  • #2 16004039
    kamyczek
    Poziom 38  
    Jak masz ustawione fuse bity ? Nie masz przypadkiem włączonego dzielnika zegara przez 8 ? Możliwe że używasz wewnętrznego oscylatora RC 8MHz podzielonego przez 8 czyli układ pracuje na 1MHz wyślij coś na próbę z AVR i sprzwdź czy prędkość jest 9600 a nie 1200
  • #3 16004869
    HowKnow
    Poziom 9  
    CKOPT mam nie zaprogramowane, zaznaczone mam tylko JTAGED i SPIEN, INTERCOSC_8MHZ_6CK_64MS.
  • #4 16004910
    kamyczek
    Poziom 38  
    Bardziej interesuje mnie CKDIV8 bo on odpowiada za podział przez 8 CKOPT odpowiada za amplitudę oscylatora jedynie i w środowisku zaszumionym może lepiej może stabilniej pracować i być odporny na zakłócenia gdy pracuje na pełnej amplitudzie .
  • REKLAMA
  • #5 16004936
    HowKnow
    Poziom 9  
    Internet mi podpowiada ze atmega16 w ogóle nie posiada tego bitu.

    Actually the mega16 doesn't have a CKDIV8 fuse. It's one of the old school with separate 1/2/4/8MHz internal RC oscillators with the 1MHz one selected by default.

    w dtr też nie mogę nic znaleźć poza domyślnym 1Mhz.

    Wiem, że to troche w przypadku mojego problemu strzelanie w ciemno, jeżeli mam coś wkleić, zrobić jakiś zrzut lub zdjęcie to proszę tylko napisać.
  • #6 16005041
    kamyczek
    Poziom 38  
    HowKnow napisał:
    #define RTS_ENABLE oraz zmieniłem PB0 na PINB0.


    Dlaczego ?
    Jeśli używasz tego pinu do sterowania kierunkiem transmisji to zrobiłeś błąd pinb0 służy tylko do odczytu stanu pinu jako wejścia pb0 służy do zapisy stanu wyjścia i zmienia jego fizyczny stan popraw i sprawdź albo powieś kawałek schematu
  • REKLAMA
  • #7 16005111
    HowKnow
    Poziom 9  
    Teraz widzę że atmel nie rozumie raczej mojego PB0, nie krzyczy błędami ale PB0 nie pojawia sie w podpowiedziach i jest na czarno, zapisalem i cleanowałem projekt ale nie pomogło.

    Czy tu może leżeć przyczyna problemu? Jak temu zaradzić?

    co do schematu sugerowałem się tym
    http://obrazkiforum.atnel.pl/287/155690d733526750e444fc8c73649247.PNG

    niby kupił symbol PB0, efekt niestety ten sam - timeout.
  • #8 16005534
    kamyczek
    Poziom 38  
    Spróbuj portb0 ale tak czy inaczej masz problem z konfiguracją portu jako wyjścia ,które steruje zmianą kierunku nadawanie odbiór dla rs485. A najlepiej dołącz pliki z których korzystasz to się podejrzy co tam trzeba dopisać .
  • #10 16006656
    HowKnow
    Poziom 9  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    PINB0 zamieniłem ostatecznie na PB0. Nie mam analizatora.

    To są dwa pliki w których cokolwiek zmieniałem.
  • REKLAMA
  • #11 16006827
    kamyczek
    Poziom 38  
    #ifdef RTS_ENABLE

    Masz odblokowaną obsługę wyjścia RTS ? Tu wygląda to na kompilację warunkową więc jeśli nie zdefiniujesz tego to wyjście nie będzie używane i odpowiedzi nie dostaniesz bo max485 jest cały czas w nasłuchu i nie przełączy się na nadawanie
  • #12 16006835
    HowKnow
    Poziom 9  
    #define RTS_ENABLE

    o to chodzi?

    jest maly przelom w temacie, gdy zapytam avr zaczyna nadawac i skonczyc nie moze... prosze o pomoc.
  • #13 16008434
    kamyczek
    Poziom 38  
    Tak o to chodziło ,teraz masz w kompilacji obsługę wyjścia rts ;) . Musisz więc wskazać co ma wysłać i kiedy przełączyć się na odbiór . zerknij w plik i zobacz na wszystkie kompilacje warunkowe if def ... Może brakuje wielkości bufora ilości danych do odbioru i wysyłania dlatego nadajnik wysyła w nieskończoność ...
REKLAMA