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

Transmisja RS232 w asemblerze - problem z odbiorem danych w terminalu

trepek 10 Lip 2006 05:55 1287 7
  • #1 2806307
    trepek
    Poziom 11  
    Posty: 6
    Z powodu objętości programu musze napisać w asemblerze troche rzeczy, i mam tu problem z transmisją na rs232.

    Niby cos wysyłą, ale terminal źle odbiera.
    Potrzebowałbym wyświetlić jakąkolwiek daną, 1 bajtową, w pętli co 1-2 sekundy, i to mi nie dziaą.

    w bascomie program testowy działą więc to nie wina rsa i max 232.

    Potrzeba mi w asemblerze odpowiedznika

    Dim x as byte
    Do
    print X
    waits
    loop


    No dobra już działa:P
    Na dole mam przykładowy plik, nie działa niestety.

    
    .include  "tn2313def.inc" 
    
    .def   Temp   =r16 
    .def   Delay   =r17 
    .def   Delay2   =r18 
    .def	acc  	=  r19	; r16 teraz ma nazwę acc
    .def	acc2  	=  r20
    
    
    .org   $000 
    .EQU aa=0x44
    
    ldi r18,aa
    rjmp   RESET 
    
    RESET:    
          ldi   r16,low(RAMEND) 
          out   SPL,r16 
    
    START: 
    rcall RS232INIT 
    LOOP: 
    
    
    
    rcall RS232OUT 
    rcall dela 
    rcall dela 
    rcall dela
    rjmp LOOP 
    
    
    RS232INIT: 
    
    ldi   r17,0 
    ldi   r16,206 
    out   UBRRH,r17 
    out UBRRL,r16 
    ldi   r16, (1<<RXEN)| (1<<TXEN) 
    out   UCSRB,r16 
    ldi   r16, (1<<UCSZ1) | (1<<UCSZ0) 
    out   UCSRC,r16 
    ret 
    
    //Usart_receive:
    //sbis UCSRA,RXC
    //RJMP Usart_receive
    //in r18,udr
    //ret
    
    RS232OUT: 
    
    sbis   UCSRA,UDRE 
    rjmp    RS232OUT 
    out      UDR,r18 
    //rjmp usart_receive
    //inc r18 to tak dla testu czy dobrze znaki zmienia:P
    ret 
    
    
    
    DLY: 
    
    dec      Delay 
    brne   DLY 
    dec      Delay2 
    brne   DLY 
    
    ret
    
    Dela	:	 	; realizacji opóźnienia
     	ldi	acc2,0	; zawartość acc2 = 0
     	ldi	acc,0	; zawartość acc = 0
    Del_0	:	 	; 
     	inc	acc	; zwiększ zawartość acc
     	brne	Del_0	; skocz gdy acc różne od 0
     	inc	acc2	; zwiększ zawartość acc2
     	brne	Del_0	; skocz gdy acc2 różne od 0
     	ret	 	; powrót z podprogramu
    


    No i to powinno powodować wyświetlanie tego co jest w r18 na okrągło, a wyśweitla jakies krzaczki

    Tak jak uwtawione to kwarc 8mhz/8 = 1mhz, baud rate 2400 czyli zgodnie z pdf atmela, bit stopu 1
  • #2 2806416
    mieczotronix
    Poziom 16  
    Posty: 163
    Pomógł: 12
    Ocena: 4
    RS232OUT:
    
    sbis UCSRA,UDRE
    rjmp RS232OUT 


    tu się zapętla na śmierć
    wejdź tu:
    http://www.btc.pl/?id_prod=6651
    pobierz sobie kody źródłowe do tej książki (albo i kup ją sobie)
    ściągnij plik zip z kodami, potem go rozpakuj
    w katalogu P6 - Terminal masz plik uart_buf.inc i tam jest wszystko napisane i masz sprawdzoną i działającą wersję zrobioną na przerwaniach (czyli jak należy).

    przykładowy fragment:
    Ini_RS:
    	push	R16
    
    	ldi	R16, high(OSC_FREQ/(16*RS_BAUD)-1)
    	out	UBRRH, R16
    	ldi	R16, low(OSC_FREQ/(16*RS_BAUD)-1)
    	out	UBRRL, R16		; ustalanie prędkości transmisji
    
    	ldi	R16, (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<UDRIE)
    	out	UCSRB, R16		; nadajnik i odbiornik uaktywnione, włączenie
    					;   generacji przerwań przy zakończeniu odbioru
    					;   i przy zakończeniu nadawania
    	ldi	R16, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    	out	UCSRC, R16		; interfejs asynchroniczny, 8-bitowa długość słowa
    					;   1 bit stopu, brak bitu parzystości
    
    	clr	R16
    	sts	RS_WSK_WBO, R16
    	sts	RS_WSK_RBO, R16
    	sts	RS_WSK_WBN, R16
    	sts	RS_WSK_RBN, R16	; inicjalizacja wskaźników bufora odb. i nad.
    
    	pop	R16
    	ret
  • #3 2806431
    trepek
    Poziom 11  
    Posty: 6
    hmm raczej nie niby to jest dobrze
  • #5 2807027
    trepek
    Poziom 11  
    Posty: 6
    zumek, ty to jednak genialny jesteś, wszysko chodzi cacy i nadawanie i odbiór, a mnie jedynie może częściowo usprawiedliwia że nie mogłem znaleść błędu o 6 rano po nieprzespanej nocy

    aha t4 16h to po prostu wysyłałem cokolwiek^^.

    A nie jednak nie jestem taki głupi, na 1 znak stopu zmieniłem sam, ale jak wół w pdfie attiny2313 stoi że 1<<USBS to 8 bitów qrde mógłym kogoś rozszarpać za tą nieprzespaną noc
  • #6 2807054
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 51
    trepek napisał:
    ...
    A nie jednak nie jestem taki głupi, na 1 znak stopu zmieniłem sam, ale jak wół w pdfie attiny2313 stoi że 1<<USBS to 8 bitów qrde mógłym kogoś rozszarpać za tą nieprzespaną noc

    Miałbym pewne wątpliwości he he he ;)
    1<<USBS - 2 bity stopu , a (3<<UCSZ0) , to char=8bit.
    Jedynka a trójka robi wielką różnicę ;)

    Piotrek
  • #7 2807392
    bartek_zet
    Poziom 17  
    Posty: 311
    Pomógł: 15
    Ocena: 8
    trepek napisał:
    wszysko chodzi cacy i nadawanie i odbiór


    A mógłbyś napisać jaki masz kwarc i z jaką to prędkością chodzi? Bo ja mam taki problem że mi w ogóle nie działa a program mam praktycznie taki sam. Opisz również jak łączysz sie z Hiperterminalem;)

    Mógłbyś dorzucić schemat układu i kabla jakiego używasz??
  • #8 2808348
    trepek
    Poziom 11  
    Posty: 6
    najpierw odpal bascoma i napisz

    $regfile = "attiny2313.dat"
    $crystal = 8000000
    $baud = 2400

    Do
    Print "Dlaczego nie chcesz dzialac "
    Waitms 500
    Loop


    i jak to pójdzie to się baw w asemblerze.

    a mam jakiś schemat z tuta z ektrody, w dp9 pin 5 na mase i 2 i 3 nadawanie/odbiór, poszukaj jak to bedzie na forum, reszta pinó sobie wisi.

    proponuje fuzy bitw wyłączyć dzielenie czestotliwości przez 8 i wtedy dla 2400 prędkości transmisji attiny chodzi spoko.

    jak by coś nie daiałało to jutro dziś naprawde strasznie zajęty.

Podsumowanie tematu

✨ Problem dotyczył transmisji danych przez interfejs RS232 realizowanej w asemblerze na mikrokontrolerze ATTiny2313, gdzie terminal odbierał dane niepoprawnie mimo poprawnego działania programu w Bascomie. Główną przyczyną błędu była nieprawidłowa konfiguracja rejestru UCSRC, gdzie ustawiono 6-bitowe znaki i 2 bity stopu zamiast standardowych 8 bitów i 1 bitu stopu. Poprawna konfiguracja polegała na ustawieniu bitów UCSZ1 i UCSZ0 na 1 oraz wyzerowaniu bitu USBS, co zapewniło 8-bitowe znaki i 1 bit stopu. Dodatkowo wskazano, że implementacja transmisji powinna wykorzystywać przerwania, a nie pętle blokujące, co można znaleźć w przykładowych kodach źródłowych dostępnych w internecie (np. uart_buf.inc z książki dostępnej na btc.pl). Zalecano także sprawdzenie ustawień kwarcu i prędkości transmisji (baud rate), a także poprawne podłączenie linii RS232 (np. wtyk DB9 pin 5 do masy, piny 2 i 3 do nadawania i odbioru). Wskazano, że w Bascomie warto najpierw przetestować prosty program wysyłający tekst co 500 ms, aby potwierdzić poprawność sprzętu i konfiguracji przed przejściem do asemblera.
Wygenerowane przez model językowy.
REKLAMA