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

[ATmega8][ASM] TWI, TWDR przesunięty

interjaz 30 Kwi 2009 21:21 855 0
REKLAMA
  • #1 6476065
    interjaz
    Poziom 2  
    Witam,

    Mam pewien problem.
    Mianowicie połączyłem dwie ATmegi 8 przez TWI, rolę pullup-ów pełnią rezystory w ATmedze która pełni funkcję Master Transmiter.

    Gdy wysyłam przez TWI jakąś wartość np 0b00001000, to w TWDR w Slave Receiver, w TWDR jest wartość 0b00010000, czyli ta wartość przesunięta w lewo o jeden bit.

    Co może być powodem takiego stanu rzeczy?

    Kod MT:
    
    .def L = R20; liczby
    ...
    ldi R16, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
    out TWCR, R16
    tw_wait1:
    in R16, TWCR
    sbrs R16, TWINT
    rjmp tw_wait1
    
    
    ldi R16, (1<<1)+0
    out TWDR, R16
    ldi R16, (1<<TWINT)|(1<<TWEN)
    out TWCR, R16
    tw_wait2:
    in R16, TWCR
    sbrs R16, TWINT
    rjmp tw_wait2
    
    out TWDR, L
    ldi R16, (1<<TWINT)|(1<<TWEN)
    out TWCR, R16
    tw_wait3:
    in R16, TWCR
    sbrs R16, TWINT
    rjmp tw_wait3
    
    
    ldi R16, (1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
    out TWCR, R16
    tw_wait4:
    
    inc L
    rjmp main
    


    Kod SR:
    
    start programu
    .org 0x000
    rjmp reset
    
    ;obsluga wektora przerwan
    .org 0x011
    rjmp TWSI
    
    ;RESET
    .org 0x020
    reset:
    
    ...
    
    TWSI:
    
    
    in R16, TWDR
    
    cpi R16, 0x0F
    brne twsi_nn
    
    sbi PORTB, 0
    rcall W100ms
    rcall W100ms
    rcall W100ms
    rcall W100ms
    
    twsi_nn:
    
    ; CZEMU TO MUSI BYC
    lsr R16
    mov WM, R16
    
    ;if Liczba99 (99+1)
    ldi R16, 100
    cp WM, R16
    brlo l099
    rjmp s1
    l099:
    rcall Liczba99
    rjmp TWSI_fin
    
    s1:
    ;if Liczba9k9
    ldi R16, 110
    cp WM, R16
    brge l9k9a
    rjmp s2
    l9k9a:
    mov R16, WM
    ldi R17, 110
    sub R16, R17
    cpi R16, 100
    brlo l9k9
    rjmp s2
    l9k9:
    rcall Liczba9k9
    rjmp TWSI_fin
    s2:
    
    TWSI_fin:
    ldi R16, (1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
    out TWCR, R16
    
    sbi PORTD, 0
    reti
    
    


    Nie wiem, czego może to być błąd.
    Sprawa jest o tyle dziwna, że jak sprawdzam w AVR STUDIO 4, dla ręcznie wpisanej wartości TWDR to działa poprawnie.

    Na wyswietlaczu jest wypisywana wartość z TWDR po lsr.
    Czyli, jeśli wyswietla 15, to wartość w TWDR wynosiła 0b00011110.
    Jednak dioda gasnie przy wartości na wyswietlaczu 15 co jest dziwne
    (warunek zgaśniecia TWDR == 15).

    TWI w SR, obsługiwane jest przez przerwania.

    Prosze o pomoc,
    Dzięki
  • REKLAMA
REKLAMA