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

[ASM][UART] Inicjalizacja i odbór danych przez przerwanie

pgnige 27 Maj 2010 22:59 1994 6
  • #1 8125266
    pgnige
    Poziom 14  
    Witam, męczę się z tym programem już kilka godzin i nie mogę nic innego wymyślić.
    Mianowicie, rejestr UDR wg symulatora AVR Studio jest zerowany, ale na wg podłaczonego wyświetlacza siedmio-segmentowego bez względu na to co faktycznie jest nadawane, zawsze odbierane jest 12 w rejestrze UDR.
    Dlaczego tak się dzieje?

    .nolist
    .include "m16def.inc"
    .list
    
    .dseg
    .org 0x0100
    Number: .byte 2
    Cols: .byte 1
    
    .cseg
    .org 0x00
    rjmp Reset
    .org URXCaddr
    rjmp rs232
    
    .org 0x0030
    Digit: .db 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 
    
    Reset:
    	ldi R16, low(RAMEND)
    	out SPL, R16
    	ldi R16, high(RAMEND)
    	out SPH, R16
    	ldi R16, 0xFF
    	out DDRA, R16
    	out DDRB, R16
    	com R16
    	out PORTA, R16
    	out PORTB, R16
    	ldi R16, 8
    	sts Number, R16
    	ldi R16, 1
    	sts Number + 1, R16
    	ldi R16, low(16000000/(16*9600)-1)
    	out UBRRL, R16
    	ldi R16, (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)
    	out UCSRB, R16
    	ldi R16, (1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1)|(1<<UPM0)
    	out UCSRC, R16
    	ldi R16, high(16000000/(16*9600)-1)
    	out UBRRH, R16
    	sei
    
    Main:
    	//rcall Display
    	rs232:
    	IN R16, UCSRA
    	sbrs R16, RXC
    	rjmp rs232
    	ldi R16, UDR
    	out PORTA, R16
    rjmp Main
    /*
    rs232:
    	ldi R16, 10
    	sts UDR, R16
    	ldi R16, UDR
    	out PORTA, R16
    reti*/
    
    Display:
    	push R16
    	ser R17
    	out PORTB, R17
    	lds R16, Cols
    	inc R16
    	ldi R18, 1
    	lds R17, Number
    	sbrc R16, 1
    		rcall Disp
    	sts Cols, R16
    	ldi ZL, low(Digit<<1)
    	ldi ZH, high(Digit<<1)
    	add ZL, R17
    	lpm R16, Z
    	out PORTA, R16
    	com R18
    	out PORTB, R18
    	pop R16
    reti
    
    Disp:
    	clr R16
    	lds R17, Number + 1
    	ldi R18, 2
    ret
  • #2 8125334
    MAREK74
    Poziom 20  
    co to robi ?
    sts UDR, R16

    ldi R16, UDR
  • Pomocny post
    #3 8125354
    asembler
    Poziom 32  
    A gdzie masz procedure obsługi przerwania?
    Pomijajac to ze rejestry specjalne odczytuje sie i zapisuje przez IN/OUt
    Program totalnie skopany otwierasz przerwanie od uarta a obsługe mas w main podejrzewam ze ten program przepisałes z neta chyba.
  • #4 8125366
    pgnige
    Poziom 14  
    Usunąłem to co zbędne - aktualnie kod wygląda następująco:

    .nolist
    .include "m16def.inc"
    .list
    
    .cseg
    .org 0x00
    rjmp Reset
    .org URXCaddr
    rjmp rs232
    
    Reset:
    	ldi R16, low(RAMEND)
    	out SPL, R16
    	ldi R16, high(RAMEND)
    	out SPH, R16
    	ldi R16, 0xFF
    	out DDRA, R16
    	ldi R16, low(16000000/(16*9600)-1)
    	out UBRRL, R16
    	ldi R16, (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)
    	out UCSRB, R16
    	ldi R16, (1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1)|(1<<UPM0)
    	out UCSRC, R16
    	ldi R16, high(16000000/(16*9600)-1)
    	out UBRRH, R16
    
    Main:
    rjmp Main
    
    rs232:
    	ldi R16, UDR
    	out PORTA, R16
    reti


    Program pisałem samodzielnie, tylko próbowałem przeróżne opcje - sprawdzałem czy procek zadziała.
  • Pomocny post
    #5 8125373
    asembler
    Poziom 32  
    IN R16,UDR
    Zainteresuj sie bitem URSEL

    ldi R16, (1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1)|(1<<UPM0)
    out UCSRC, R16
    TO NIC NIE ROBI
  • #6 8125397
    pgnige
    Poziom 14  
    To przepisywałem akuratnie z książki.
    Dzięki wielkie działa, problem był jedynie w instrukcji IN :-)
  • #7 8125421
    asembler
    Poziom 32  
    To bardzo popularny błąd srednio ja tez go robie raz dziennie :-)
    Niestety popularne kompilatory nie wykrywają i nie sugerują ze może to byc błedna linia. mój akurat się drze i wymysla od pacanów:-)
    Następną sprawą bedzie odczyt rejestrów specjalnych spoza dzialania rozkazów IN/OUT. To tak wspominam żebys nie zakładał kolejnego postu w tym temacie.
REKLAMA