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

Atmel AT89C2051 port szeregowy - nadawanie

10 Sie 2005 01:51 1516 5
  • Poziom 11  
    Piszę program w C na Atmela AT89C2051.
    Chciałbym dwojako wykorzystywać nóżkę TXD mikroprocesora. Czasem jako nadajnik szeregowy innym razem, jako zwykły wyjściowy pin. Zauważyłem, że ustawienie wartości TXD zaraz po wysłaniu bajta funkcją putchar, przeszkadza w transmisji.
    Code:
    putchar(10);
    
    TXD = 0

    Powyższy kod miał działać w ten sposób, że po wysłaniu bajtu (tu:10) na lini TXD miało pojawić się zero (nie jako bajt, tylko stałe <do odwołania :)> napięcie na pinie). Niestety zanim bajt zostanie wysłany na linii pojawi się zero. Jak tego uniknąć? Zabezpieczyć się by program poczekał, aż bajt zostanie wysłany?
  • Poziom 15  
    Witam.

    Putchar czy inny printf nie wysyła sam z siebie bajtu przez RS-a, a tylko umieszcza go w buforze, skąd UART wysyła go w swoim własnym tempie, ale zawsze dużo wolniejszym niż praca samego uP (chyba, że używasz zegarkowego kwarcu:) ). Prawdopodobnie więc wysyłasz tylko znak do bufora, a zaraz potem wymuszasz niski stan na TX, co uniemożliwia poprawną pracę nadajnika. I jak już sam zgadłeś, trzeba się po prostu przed tym zabezpieczyć - po wysłaniu znaku do bufora po prostu poczekaj na flagę sygnalizującą jego opróżnienie. Wtedy możesz wykorzystać pin do innych celów - inna sprawa jak na to będzie reagował odbiornik.

    m8se
  • Poziom 13  
    Tak jak napisal M8se, moze jeszcze z podpowiedzia bys wykozystal do tego przerwanie Tx_complete, tak dla wygody (mam nadzieje ze dobrze pamietam i 51 maja to przerwanie :D ).
  • Poziom 11  
    AT89C2051 ma tylko pięć przerwań: dwa czasowe, dwa zewnętrzne i jedno od portu szeregowego. Niestety nie wiem jak wykorzystać to od RSa.

    Rozumiem, że putchar umieszcza bajt w buforze portu, ale kiedy zostanie on wyslany. W jaki sposob, to sprawdzic? Jesli zaraz znowu uzyje putchar, to czy istnieje ryzyko, ze nadpisze poprzedni bajt?

    Jest znacznik TI, ale nie wiem jak go uzyc. Podobno jest ustawiany przez UART w trakcie wysylania ostatniego bitu ramki. W przykladach, jakie przeglądalem, TI jest ustawiany programowo zaraz po ustawieniu portu. W objaśnieniu podają informacje, że ustawienie TI jest potrzebne by RS wyslal pierwszego bajta. Gdzies indziej przeczytalem, że powinno się go zerować, ale kiedy?

    Trochę namieszalem, ale chcialbym dokladnie wiedziec jak odbywa się transmisja szeregowa w Atmelu AT89C2051.
  • Poziom 23  
    Po wysłaniu czegoś na port szeregowy
    powinieneś odczekać, aż UART wystawi znacznik TI

    np.

    while (!TI) do
    {};

    lub Assembler.

    jnb TI, $

    Dopiero póżniej możesz korzystać z tej końcówki jako innego wykorzystania niż TX.

    Dodano po 5 [minuty]:

    Oczywiście najpierw radzę skasować TI

    np.

    TI = 0;

    lub

    clrb TI

    Problem z zatrzymaniem transmisji wynika z tego że UART do swojej pracy potrzebuje pewnej liczby cykli licznika T1, zależne jest od ustawinej prędkości portu.

    Wpisując do TX=0 powodujesz zablokowanie przerzutnika wyjścia portu P3 na stan zerowy.

    Wskazane jest żebyś przed kolejnym wysłaniem znaku na port ustalił stan TX na 1, np. TX=1 w rodzinie C51 oznacza to przygotownie portu do pracy jako wejście lub wyjście.

    I powinno być OK.