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

[Assembler] Obsługa RS232 za pomocą UART w 80c517A.

muminek 28 Sty 2005 13:59 1835 6
  • #1 1176147
    muminek
    Poziom 16  
    Posty: 243
    Pomógł: 9
    Ocena: 10
    Muszę uruchomić dodatkowy UART na tym procesorze kwarc to 18,432M potrzebuje informacji i programów w asemblerze. Jeszcze jedno jaką wartość wpisać do licznika jeżeli nie kożystam z wewnętrznych generatorów prędkości dla UARTA podstawowego.
  • #2 1177552
    Zbych_
    Poziom 25  
    Posty: 456
    Pomógł: 81
    Ocena: 6
    muminek napisał:
    Muszę uruchomić dodatkowy UART na tym procesorze kwarc to 18,432M potrzebuje informacji i programów w asemblerze. Jeszcze jedno jaką wartość wpisać do licznika jeżeli nie koRZystam z wewnętrznych generatorów prędkości dla UARTA podstawowego.


    Wszystkie niezbędne informacje są w pdfach do tego procesora. Zajrzałeś tam ? Znajdziesz tam też wzory na prędkości.

    Baud rate = Fosc/(32*(2^10-Reload_Value))

    
    Przykładowa konfiguracja prędkości wygląda tak:
    	S1RELH=(b1_62500>>8);
    	S1RELL=(b1_62500&255);	// predkosc 
    	S1CON=0x92;			// Mode B - 8-bitów, wlaczony odbior
    
    lub
    
             MOV     S1RELH,#03H
             MOV     S1RELL,#0FAH
             MOV     S1CON,#092H
    

    Żeby sprawdzić czy przyszła dana, lub czy bufor nadawczy jest wolny, trzeba zajrzeć do rejestru S1CON (bity 0 i 1). Ponieważ adres tego rejestru nie jest podzielny przez 8, to nie można odwoływac się do pojedynczych bitów w tym rejestrze.

    Sprawdzenie odbioru:
    
        if((S1CON&1)!=0){
             S1CON&=~1;
             ......
        }
    
    lub
    
        MOV     A,S1CON
        JNB     ACC.0,Brak_danych
        ANL    S1CON,#$0FEH
    .....
    .....
    .....
    Brak_danych:
    


    Sprawdzenie, czy nadajnik jest pusty:
    
       if ((S1CON&2)!=0){
          S1CON&=~2;
          ........
       }
    
    lub
    
        MOV     A,S1CON
        JNB     ACC.1,Bufor_Pelny
        ANL    S1CON,#0FDH
        ............
        ............
    Bufor_Pelny:
    


    Do odbioru i nadawania używasz oczywiście rejestru S1BUF.
  • #3 1177698
    muminek
    Poziom 16  
    Posty: 243
    Pomógł: 9
    Ocena: 10
    Pdfy czytałem ale jakoś nie docierają do mojej głowy. Bardzo duży problem sprawia mi kwarc 18,432M. Uczę się tego sam. Proszę wię o łopatologię im więcej przykładów tym szybciej pojmę. Może ktoś ma monitor pod keila, może być inny na 12M i ten procesor. Kiedy sam go chcę wygenerować w wersji 2k wywala mi błąd.
  • #4 1178078
    Zbych_
    Poziom 25  
    Posty: 456
    Pomógł: 81
    Ocena: 6
    muminek napisał:
    Bardzo duży problem sprawia mi kwarc 18,432M.

    W czym problem ? No chyba potrafisz przekształcić wzór ?
    Dla przykładu:
    prędkość 9600, do rejestru wpisujesz: 964 (03C4H)
    prędkość 115200, wpisujesz 10119 (03FB)

    muminek napisał:
    Proszę wię o łopatologię im więcej przykładów tym szybciej pojmę.

    Podałem ci gotowe przykłady jak sprawdzić czy jest dana do odbioru i czy można coś wysłać (bufor nadawczy pełny). To wszystko czego potrzebujesz !

    Najprostszy program (echo, odsyła to co odbierze, prędkość 9600):

    
        mov S1RELH, #03H
        mov S1RELL,#0C4H
        mov S1CON,#92H
    Petla:
        mov a, S1CON
        jnb acc.0,Petla
        anl S1CON,#0FEH
        mov a,S1BUF
        push acc           ; zapamietaj dana na stosie
    Petla2:
        mov a,S1CON
        jnb acc.1,Petla2
        anl S1CON,#0FDH
        pop acc             ; pobierz dana ze stosu
        mov S1BUF,a
        rjmp Petla
    
  • #5 1178336
    muminek
    Poziom 16  
    Posty: 243
    Pomógł: 9
    Ocena: 10
    Dzięki Zbych jeszcze jedno chodzi mi o wzór z książki Gałków dotyczący wartości wpisywanej do licznika przy transmisji. Według dokumentacji dla 18,432M błąd transmisji 0% tak samo jak dla 11...MHz. Dla kwarcu 11..M wszystko się zgadza, tymczasem dla 18..M nie wychodzi mi liczba całkowita czy gdzieś robię błąd? Na koniec, już przyswoiłem sobie jak się pisze korzystam.
    Pozdrawiam

    Dodano po 7 [godziny] 40 [minuty]:

    Zbych jeszcze raz dzieki w swoich postach w kilku zdaniach zawarłeś 3 strony pdefa SAB80C517A i kawałek książki. To było łopatologiczne.
  • #6 1180068
    Zbych_
    Poziom 25  
    Posty: 456
    Pomógł: 81
    Ocena: 6
    muminek napisał:
    Dzięki Zbych jeszcze jedno chodzi mi o wzór z książki Gałków dotyczący wartości wpisywanej do licznika przy transmisji.

    Korzystając z 517 nie musisz używac timerów do taktowania transmisji szeregowej. Możesz użyć specjalnie do tego celu stworzonego układu taktującego. Wzór, który podałem dotyczny właśnie tego układu.

    muminek napisał:
    tymczasem dla 18..M nie wychodzi mi liczba całkowita czy gdzieś robię błąd?

    Dziwne. Mi wyszła całkowita.

    muminek napisał:
    Na koniec, już przyswoiłem sobie jak się pisze korzystam.
    :-)
  • #7 1181888
    muminek
    Poziom 16  
    Posty: 243
    Pomógł: 9
    Ocena: 10
    Teraz mi też wyszła całkowita. Męcze tak bo muszę napisać programy na RS232 w różnych konfiguracjach dla rego mikrokontrolera.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy implementacji dodatkowego UART w mikrokontrolerze 80C517A z kwarcem 18,432 MHz oraz programowania transmisji RS232 w asemblerze. Podano wzór na obliczenie wartości do rejestru licznika prędkości transmisji: Baud rate = Fosc / (32 * (2^10 - Reload_Value)), wraz z przykładami ustawień rejestrów S1RELH, S1RELL i S1CON dla różnych prędkości (np. 9600 i 115200 baudów). Omówiono także sposób sprawdzania dostępności danych do odbioru i gotowości bufora nadawczego poprzez bity rejestru S1CON, z przykładami kodu asemblerowego. Poruszono problem obliczania wartości licznika dla kwarcu 18,432 MHz, który początkowo nie dawał liczby całkowitej, jednak po ponownych obliczeniach problem został rozwiązany. Zwrócono uwagę, że mikrokontroler 80C517A posiada dedykowany układ taktujący do transmisji szeregowej, co eliminuje konieczność używania timerów do generowania prędkości UART. Przykładowy program echo w asemblerze pokazuje pełną implementację odbioru i nadawania danych przez UART.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA