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

AT89C2051 do PC UART - Nieprawidłowe dane na LCD, jak ustawić rejestry?

UkaszV6 30 Gru 2005 15:29 1891 8
REKLAMA
  • #1 2130599
    UkaszV6
    Poziom 13  
    Posty: 54
    Pomógł: 8
    Szukałem w archiwum, ale nie znalazłem odpowiedzi.
    Wstępnie chce przesyłać dane między AT89C2051 i PC(Układ jest oparty o uP,max232,LCD). Sprzętowo wydaje mi sie że wszystko jest ok ponieważ jakaś tam transmisja w obie strony jest. Napisałem krótki programik który raczej bezproblemowo powinien to robić, ale jednak problem jest w tym że to co otrzymuje na LCD nie jest tym co wysyłam z komputera.

    $crystal = 18432000
    
    'Konfiguracja portu
    $baud = 2400
    'Open "com3.1:2400" For Output As #1
    Open "com3.0:2400" For Input As #2
    
    Do
      Get #2 , A
      Lcd A ; " "
      'Put #1 , A
    Loop
    
    'Close #1
    Close #2
    End

    Zadałem mu też zeby uP od razu wysyłał to co odbiera, ale dane wysłane z kompa i następnie wysłane przez procesor sie nie zgadzają. W czym tkwi problem?
    1. Czy powinienem ustawić jeszcze jakieś dodatkowe rejestry?
    2. Jak działa ten dzielnik czestotliwosci kwarca aby otrzymac predkosc UARTa?(jeśli ktoś ma link do pdfa to chętnie skorzystam)

    Dodano po 43 [minuty]:

    Gdzie moge znaleść opis Special Function Registers tego układu bo szukałem na www.atmel.com , ale coś nie moge znaleść.
  • REKLAMA
  • #3 2131858
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    Witam.
    Nie znam bascoma (mogę pomóc w asm) ale z tego co już śledziłem tematy transmisji to bascom lubi "domyślnie" przekonwertować dane pomiędzy zmiennymi typu BAJT i ASCII i np wysyłając liczbę 23 w żeczywistości bascom wyśle kod ascii liczby 2 i liczby 3 czyli dwa bajty.... sprawdź czy w jakiś sposób nie są te dane powiązane (konwertowane).
  • REKLAMA
  • #4 2132078
    UkaszV6
    Poziom 13  
    Posty: 54
    Pomógł: 8
    Zaquadnik napisał:
    Mapę SFR znajdziesz w notce katalogowej do AT89C2051.
    Tak, mam to, ale nie ma tam opisu konkretnych bitów w poszczególnych rejestrach, a z tego co sie dowiedziałem to trzeba coś zrobić w rejestrze Th1 bo o ile mi wiadomo timer1 odpowiada za prękość UARTu. Ze strony atmela sciągnąłem programik ktory liczy co tam trzeba wpisać, ale po wpisaniu i tak jest ten sam problem.
    prokopcio napisał:
    Witam.
    Nie znam bascoma (mogę pomóc w asm) ale z tego co już śledziłem tematy transmisji to bascom lubi "domyślnie" przekonwertować dane pomiędzy zmiennymi typu BAJT i ASCII i np wysyłając liczbę 23 w rzeczywistości bascom wyśle kod ascii liczby 2 i liczby 3 czyli dwa bajty.... sprawdź czy w jakiś sposób nie są te dane powiązane (konwertowane).
    Hmmm, coś w tym może być. Ale jendak nie trzyma sie to kupy:
    Np.
    wysyłam -> dostaję
    0 -> 0 0 248
    0 0 -> 0 0 248 0 248
    255 -> 252
    255 0 -> 252 0 0 248
    0 255 -> 0 0 248 ;czyli tak samo jak gdybym wysyłał 0
    0 255 255 0 -> 0 0 248 252 0 0 248

    Poszukam jeszcze w opcjach kompilatora, ale wątpie.
  • #5 2138193
    UkaszV6
    Poziom 13  
    Posty: 54
    Pomógł: 8
    Niestety,ale dalej nie potrafie rozwiazac tego problemu,użyłem w programie instrukcji input. Wszystko fajnie bo ona odbiera i wysyła prawidłowo, ale jak gdyby program utyka w tej instrukcji i z niej nie wychodzi, przez co nie moge wyświetlić danych na lcd.

    Jeśli ktoś ma jeszcze jakieś pomysły jak rozwiążać problem poprawności danych to będe wdzięczny.
  • REKLAMA
  • #6 2141885
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Ja przesylam dane na M32 i nie mam problemów.
    Robie to tak:
    Znak = Waitkey()
    Pzd
  • REKLAMA
  • #7 2141950
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    No to prawda: w datasheet do c2051 jest tylko mapa sfr i nie są opisane standardowe sfr z '51. W załaczniku masz to z czego ja korzystam ale szczerze mówiac to postać ksiażkowa jest sporo lepsza niż elektroniczna.
    Co do samej obsługi to pozostaje zrobić to na przerwaniu. W c2051 przerwanie jest jedno dla rx i tx razem. Dlatego w samym przerwaniu pierwszą rzeczą powinno być sprawdzenie czy to był odbiór czy nadawanie. Dopiero potem można sobie sprawdzić sbuff i albo przepisać go do innej zmiennej (np na lcd) albo zignorować.
    Załączniki:
    • 80C51_FAM_HARDWARE_1.pdf (152.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 2141960
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    O wreszcie znalazłem. Kiedyś próbowałem odpalić przerwanie serial od rs i wtedy zadziałało. Coś takiego:
    $regfile = "89c2051.dat"
    $crystal = 14745600
    '$crystal = 11059200
    $noramclear
    $noinit
    '-------------------------------------------------------------------------------
    Th1 = &HE0                                                    '1200 dla kwarcu 14MHZ
    'Th1 = &HFC                                                    '9600 dla kwarcu 14MHz
    Tmod = &B00100000                                             'tajmer 1 jako baud generator mode 1
    Scon = &B01000000                                             'zalaczenie odbioru i mode 1
    Tcon.6 = 1                                                    'wlaczenie tajmera 1
    On Serial Rs_przerwanie
    'Ie = &B10010000                                               'wlacz przerwania i rs
    '-------------------------------------------------------------------------------
    'Config Lcd = 16 * 1 : Cursor Off
    'Config Lcdpin = Pin , Db4 = P1.4 , Db5 = P1.5 , Db6 = P1.6 , Db7 = P1.7 , E = P1.3 , Rs = P1.2
    '-------------------------------------------------------------------------------
    Dim Licznik As Byte
    Dim Lcd_pierwsza_linia As String * 24
    Dim Lcd_druga_linia As String * 24
    '-------------------------------------------------------------------------------
    Licznik = 1
    Ie = &B10010000                                               'wlacz przerwania i rs
    Do
    Loop
    End
    '-------------------------------------------------------------------------------
    Rs_przerwanie:
       If Scon.0 = 1 Then                                         'przerwanie od odbioru
          If Licznik < 24 Then
    
             Incr Licznik
          Else
          End If
       Scon.0 = 0
       End If
    
       If Scon.1 = 1 Then                                         'przerwanie od nadawania
          Scon.1 = 0
       End If
    Return
    '-------------------------------------------------------------------------------
  • #9 2265412
    UkaszV6
    Poziom 13  
    Posty: 54
    Pomógł: 8
    Ok, problem rozwiązałem. Niestety okazało sie ze nie można odczytać dokładnie tych bitów które zostały wysłane przy pomocy instrukcji bascoma typu PUT, GET, INPUT, PRINT, INPUTBIN itp. - instrukcje te zajmują sie przesyłaniem znaków w kodzie ASCI bodajże. Trzeba odwołać sie bezpośrednio do rejsetru SBUF(bufor UARTu). Są tam dane które przychodzą na port i dane które chcemy wysłać. Tak więc nadawanie i odbiór zrealizowałem tak:

    Open "com3.1:2400" For Output                                 ' As #1
    Open "com3.0:2400" For Input                                  ' As #2
    
    Enable Interrupts                                             
    On Serial Byte_received                                   
    Enable Serial                                                 
    
    ' DEFINICJA ZMIENNYCH
    Dim Buf As Byte                                               ' Buf - Aktualna Wartosc Z Bufora
    
    Do
    
    Loop
    
    End
    
    
    Byte_received:                                                
    Disable Serial                                                ' zablokowanie przerwania Scon.0 = 0                                                    ' wyzerowanie flagi RI w rej. SCON (znacznik odebrania bajtu przez SBUF)
    
    Buf = Sbuf
    
            Gosub Create_primary_buffer                'skok do jakiejs metody gdy chcemy cos z tym zrobic
    
    'NADAWANIE:
            Sbuf = Buf
            $asm 
            Wait_:
            Jnb scon.1 , Wait_                                    ' oczekiwanie na koniec transmisji
            clr scon.1                                            ' kasowanie wskaźnika końca transmisji
            $end Asm
    
    Enable Serial                                                 ' odblokowanie przerwan dla UART
    
    Return                 

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z transmisją UART między mikrokontrolerem AT89C2051 a komputerem PC, gdzie dane wyświetlane na LCD nie odpowiadają wysyłanym z komputera. Użytkownik stosuje układ z mikrokontrolerem AT89C2051, MAX232 oraz wyświetlaczem LCD, a transmisja odbywa się przy prędkości 2400 baudów. Problemem jest nieprawidłowa interpretacja danych, co wynika z domyślnego konwertowania znaków przez Bascom, który przesyła dane w formacie ASCII, a nie surowych bajtów. Konieczne jest bezpośrednie odwołanie się do rejestru SBUF mikrokontrolera, który zawiera faktyczne dane odbierane i nadawane przez UART. W celu poprawnej obsługi transmisji zaleca się konfigurację rejestrów Timer1 (Th1) jako generatora prędkości UART, ustawienie trybu pracy UART w rejestrze SCON oraz obsługę transmisji za pomocą przerwań serialowych, które pozwalają rozróżnić odbiór i nadawanie danych. W dokumentacji AT89C2051 dostępna jest mapa SFR, jednak szczegółowy opis bitów rejestrów UART wymaga sięgnięcia do standardowej dokumentacji 8051. Rozwiązaniem jest implementacja obsługi UART poprzez przerwania i bezpośredni dostęp do rejestru SBUF, co pozwala na prawidłowe odbieranie i wysyłanie danych bez konwersji ASCII, eliminując błędy wyświetlane na LCD.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA