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

[mega8][asm] uart - jedynka na najstarszym bicie danych ?

cpkpiotr 28 Sie 2008 15:21 1644 15
  • #1 5483559
    cpkpiotr
    Poziom 13  
    Załączam fragm. kodu kontrolera wysyłającego do kompa interfejsem RS232 na przemian dwie dane: 00 i FF

    Niestety na najstarszym bicie po stronie odbioru (komputer) tego pojedynczego wysyłanego bajtu jest zawsze jedynka, więc komputer widzi: 80 i FF (na przemian)

    Dlaczego???
    Nie jest tu ani ustawiona transmisja 9-bitowa, ani nic innego fikuśnego. Proszę o opinie.

    
    kod 3 posty niżej - uprościłem go i dałem cały programik
    
  • #2 5483636
    kulmar
    Poziom 31  
    Z parametrów transmisji Twojego programu trudno dociec, jakie parametry są właściwie ustawione, ale objaw jest taki, jakbyś transmitował 7bitów a po stronie PC jest odbiór 8. I ten ostatni, którego nie wysyłasz, PC odbiera jako 1 logiczną. A bity są wysyłane od LSB.

    Pozdrawiam
    Mariusz
  • Pomocny post
    #4 5483680
    szelus
    Poziom 34  
    Może też być, że prędkość się nie zgadza - mikrokontroler nadaje za szybko i bit stopu jest odbierany jako ostatni bit danych. Masz podłączony kwarc?

    EDIT: Jak zaczynałem pisać tego posta, to tego od Balu jeszcze nie było ;)
  • #5 5484586
    cpkpiotr
    Poziom 13  
    Taktuję z kwarca wewnętrznego - nie zmieniając wartości domyślnej, czyli z 1MHz - sprawdziłem oczywiście bity w ponyprogu i jest zgodnie z dokumentacją:
    [mega8][asm] uart - jedynka na najstarszym bicie danych ?
    Sądzicie, że on może być tak rozjechany, że się rozjeżdża na tym najstarszym bicie? Prędkość transmisji (RS_BAUD) wynosi tylko 9600 bps, 8n1. Ja obstawiam, że to nie to, bo mam przy dwóch egzemplarzach sprzętowych to samo. Ale oczywiście to nie znaczy, że nie mogą się rozjechać w ten sam sposób...
  • #7 5485810
    cpkpiotr
    Poziom 13  
    wyczyściłem trochę kod, żeby nikogo nie mylił i załączam zrzuty ekranu debuggera (w momencie wejścia w miejscu "usartt"). Wg mnie jest niby ok.

    
    
    .include "m8def.inc"
    
    .def		temp	= r16
    
    .EQU SYSCLK = 1000000	; częstotliwość pracy
    						; CKSEL(3..0) = 0001 (domyślnie dla wewn. oscyl.)
    						; uwaga: ptaszek w ponyprog oznacza 0
    						; 0010 - 2MHz, 0011 - 4MHz, 0100 - 8MHz,
    
    .EQU RS_BAUD		= 9600	; prędkość transmisji [bps]
    
    ;**************************************************************************
    .cseg
    .org     $0000
             rjmp RESET     ; Reset handle
    
    ;**************************************************************************
    RESET:
    	;-------------------- ustaw stos na koniec RAM-u (SPH, SPL)
        ldi 	r16,low(RAMEND)
        out 	SPL,r16
        ldi 	r16,high(RAMEND)
        out 	SPH,r16
    	;--------------------
    	sbi 	ACSR,ACD	; shut down comparator to save power
    
    	;*********************************************************************
    
    	ldi		temp, high(SYSCLK/(16*RS_BAUD)-1)
    	out		UBRRH, temp
    	ldi		temp, low(SYSCLK/(16*RS_BAUD)-1)
    	out		UBRRL, temp		; ustalanie prędkości transmisji
    
    	ldi		temp, (1<<TXEN)
    	out		UCSRB, temp	; nadajnik uaktywniony
    
    	;====== parametry UART
    
    	ldi		temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    					; interfejs asynchroniczny, 
    					; (UCSZ2:UCSZ1:UCSZ0=0:1:1 8-bitowe dane
    					; 1 bit stopu(USBS=0), brak bitu parzystości (UPM0=0)
    	out		UCSRC, temp
    	
    	;*********************************************************************
    usartt:
    	ldi		temp, $00
    	out		UDR, temp			; prześlij 00
    
    	rcall	wait_long 
    
    	ldi		temp, $ff
    	out		UDR, temp			; prześlij FF
    
    	rcall	wait_long 
    
    	rjmp	usartt
    
    ;*****************************************************
    .def	count1	= r26		
    .def	count2	= r27
    
    wait_long:
    	ldi		count1, 0xff
    	rjmp	delay
    wait_2ms:
    	ldi	count1, 0x15	
    delay:	
    	ldi	count2,0xff		
    w01:	
    	dec	count2			
    	brne	w01			
    	dec	count1			
    	brne	delay		
    	ret				
    
    

    [mega8][asm] uart - jedynka na najstarszym bicie danych ?
    [mega8][asm] uart - jedynka na najstarszym bicie danych ?
    dołączam też Security & conf. bits z Ponego:
    [mega8][asm] uart - jedynka na najstarszym bicie danych ?
    Co jest nie tak?
  • #8 5485829
    kulmar
    Poziom 31  
    Jeśli zegary się rozjeżdżają w ten sposób, że bit stopu jest widoczny jako 8 bit w PC, to wystarczy zrobić prosty test: wysłać 0x80 (zamiast 0) i wtedy PC powinien odebrać 0xc0. Jeśłi taki będzie wynik testu, to rzeczywiście przyczyny trzeba szukać w niedopasowaniu szybkości transmisji.

    Pozdrawiam
    Mariusz
  • #9 5485840
    cpkpiotr
    Poziom 13  
    Dla $80 komp widzi $C0 - rzeczywiście, na razie tego nie rozumiem.
  • Pomocny post
    #10 5485874
    kulmar
    Poziom 31  
    Wniosek jest prosty - PC odbiera 8 bit z ATMELA jako 7, a bit stopu ATMELA jest odbierany jako 8 bit w PC. Czyli transmisja z ATMELA jest za szybka w stosunku do zadeklarowanej.

    Piszesz, że używasz zewnętrznego kwarcu - 4czy masz tam kondensatory (o ile pamietam 22pF) ?

    EDIT: przepraszam, uzywasz wewnetrznego oscylatora (za mało kawy od rana). Czy ATMEL wymaga w takim wypadku kalibracji ?

    Pozdrawiam
    Mariusz
  • #11 5485912
    cpkpiotr
    Poziom 13  
    (nie mam tych kondensatorków)
    Po lewej inne wartości wysyłane przez mega8, a po prawej to co widzi komp:
    0b01010101 -> 0b10010101
    0b10101010 -> 0b11001010

    Trochę dziwne.
    Dodatkowo dodam, że tak - po stronie kompa mogęw terminalu płynnie zmieniać prędkość transmisji (efekt chyba ten sam, co kalibracja po stronie atmega), robiłem to i - niestety - nie ten efekt, którego się spodziewamy. Wygląda na to, że to co innego... uruchomię zaraz na jeszcze innym sprzęcie atmega8 to samo, ale z kwarcem zewn. i zobaczymy - ale wtedy potwierdzę tylkoew. , że kod jest ok, a w kodzie chyba błędu nie ma.
  • #13 5486031
    cpkpiotr
    Poziom 13  
    Zrobiłem jeszcze inaczej. Dlatego, że algorytm normalnej pracy tych moich AVR-ków nie wymaga kwarca zewn., a transmisję uruchamiam tylko w celach podglądu parametrów pracy, to:
    - zmieniłem prędkość transmisji na 1200 bps i wszystko chodzi jak ta lala.
  • #15 5486068
    cpkpiotr
    Poziom 13  
    dla ciekawości :) :
    dla 1 MHz i 9600bps błąd wychodzi duży, bo aż 7,84%
    dla 1 MHz i 1200bps błąd mały = 0,16%
REKLAMA