Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 - Zmiana parzystości w zależności od pinu

FastProject 08 Lis 2014 22:55 522 0
  • #1 08 Lis 2014 22:55
    FastProject
    Poziom 28  

    Witam,
    chcialbym w Bascomie wykonac konfiguracje USART w zaleznosci od pinow procesora. O ile z zmiana baud nie ma problemu:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
    to bez powodzenia idzie(w zasadzie to nie idzie) z zmiana parzystości. Aktualnie mam to zrobione w ten sposób i nie działa to:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
    Sprawdzałem inne piny procesora. W warunku parity 0/1 wstawiałem zmiany innej zmiennej dla pewności i była reakcja na zmianę pinu, a wiec to kwestia programu i konfiguracji rejestrów. O konfiguracji w dokumentacji atmegi8 nic ciekawego nie mogę doczytać (możne pomijam coś istotnego, albo robię coś w nie takiej kolejności).

    Generalnie w pozycji Parity=0 nie działa w ogóle.

    Gdy Parity=1 (else) to działa gdy master (PC i terminal w postaci programu Docklight) wysyła Dane z Parity=None i Parity-Even (bez względu na położenie pinu parity)

    Dane jakie wysyłam to 2 ramki MODBUS RTU:
    Atmega8 - Zmiana parzystości w zależności od pinu
    Gdy wszystko dziala to dostaje takie odpowiedzi (na czerwono)...:
    Atmega8 - Zmiana parzystości w zależności od pinu

    Proszę o pomoc. Czy w ogóle jest możliwa taka zmiana parzystości w locie, czy w trakcie trwania programu? Wydaje mi się ze powinno być to możliwe, ale albo o czymś zapominam albo coś pominąłem.

    EDIT...jest postęp...zapomniałem ustawiać bitu USRRC.7. Zgodnie z pdf:
    Cytat:
     Bit 7 – URSEL: Register Select
    This bit selects between accessing the UCSRC or the UBRRH Register. It is read
    one when reading UCSRC. The URSEL must be one when writing the UCSRC.

    Teraz procesor odbiera dane w obu przypadkach, czyli obojętnie czy wyślę mu dane z "none, 2x stop" czy "even, 1x stop" to odbiera dane dla obu pozycji pinu, a więc jeszcze coś jest nie tak.
    Przecież gdy odbiera dane "even, 1x stop", a ma ustawione na "none, 2x stop" to powinien odrzucać te dane? I odwrotnie: jak ma ustawione "none, 2x stop" , a odbiera even, 1x stop" to także jest konflikt i procesor nie powinien rozpoznawać ramek, a rozpoznaje i odsyła poprawne odpowiedzi.

    Tak teraz wygląda konfiguracja:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Co tu nie gra?

    EDIT.....Chyba już wiem...jeśli ktoś może potwierdzić to poproszę.

    A wiec drugi bit stopu jest pomijany przed odbiornik (pdf strona 143:
    Cytat:
    A second stop bit will be
    ignored by the Receiver. When the first stop bit is received (i.e., a complete serial frame
    is present in the Receive Shift Register), the contents of the Shift Register will be moved
    into the receive buffer
    ), a w przypadku konieczności sprawdzania parzystości trzeba osobno sprawdzać bit PE i w zależności od jego wartości odrzucać lub przyjmować przychodzące do odbiornika bajty (pdf strona 147:
    Cytat:
    When
    enabled, the Parity Checker calculates the parity of the data bits in incoming frames and
    compares the result with the parity bit from the serial frame. The result of the check is
    stored in the receive buffer together with the received data and stop bits. The Parity
    Error (PE) Flag can then be read by software to check if the frame had a parity error.
    The PE bit is set if the next character that can be read from the receive buffer had a par-
    ity error when received and the parity checking was enabled at that point (UPM1 = 1).
    This bit is valid until the receive buffer (UDR) is read.)
    .

    A pytanie inne...jak realizujecie to sprawdzanie parzystości w przypadku MODBUS RTU?

    0 0