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:
Kod SR:
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
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