von Hoschi79 am Montag 21. Februar 2011, 09:47
Hi BlueHazzard..
Wir benutzen den Assembler und die Simulatorsoftware von/für Atmelprozessoren. Mit MT/ST bzw. SR/MR war der Modus gemeint: Master / Slave als Tansmitter bzw. Slave / Master als Receiver.
Die beiden AVR ATMega8-Boards hatten wir schon per I²C-Bus verbunden. Es funktionierte nur soweit, dass der Master als Transmitter und der Slave als Receiver arbeitet bzw. umgekehrt. Aber es klappte nicht beides und die Anbindung des myEthernet-Moduls von AVR gestaltet sich schwieriger als gedacht.
init:
ldi r16,LOW(RAMEND)
out spl,r16
ldi r16,HIGH(RAMEND)
out sph,r16
ldi r16,0x00
out ddrc,r16 ;PC zur Eingabe
ldi r16,0xff
out portc,r16 ;Pull Up für Port C
ldi r16,0xf0
out ddrd,r16
ldi r16,0x0f
out portd,r16
ldi r16,0x0a ;Wert für den Bitregister
out twbr,r16 ;Bitdatenregister laden
ldi r16,0x00 ;Wert für den Statusregister
out twsr,r16 ;Statusregister laden
start:
rcall zeit
sbis pinc,0 ;springe, wenn PC0=1
rjmp twi_mr ;sonst bei s1 weiter
rjmp twi_mt ;wiederhole
;#############################################################################
; * Master als Receiver *
;#############################################################################
twi_mr:
ldi r16,0b10100100 ;TWINT=1 - TWSTA=1 - TWEN=1
out twcr,r16 ;Start-Bedingung senden
twi_mr1:
in r16,twcr ;Controlregister holen
sbrs r16,twint ;springe, wenn TWINT=1
rjmp twi_mr1 ;sonst warte bis TWINT=!
in r16,twsr ;Statusregister holen
andi r16,0xf8 ;TWPS1|2 maskieren
cpi r16,$08 ;Start-Bedingung erfolgreich gesendet?
brne twi_mr ;Fehleranzeige
ldi r16,0b00000011 ;Wert für Datenregister
out twdr,r16 ;Slave-Adresse=0b0000001 - R/W=1 (SLA+R)
ldi r16,0b10000100 ;TWINT=1 - TWEN=1
out twcr,r16 ;SLA+R senden
twi_mr2:
in r16,twcr ;Controlregister holen
sbrs r16,twint ;springe, wenn TWINT=1
rjmp twi_mr2 ;sonst warte auf TWINT=1
in r16,twsr ;Statusregister holen
andi r16,0xf8 ;TWPS1|2 maskieren
cpi r16,$40 ;SLA+R erfolgreich gesendet?
brne twi_mr ;Fehleranzeige
ldi r16,0b10000100 ;TWINT=1 - TWSTA=0 - TWEN=1
out twcr,r16 ;Datenübertragung starten
twi_mr3:
in r16,twcr ;TWI Control-Register holen
sbrs r16,twint ;springe, wenn TWINT = 1
rjmp twi_mr3 ;warte auf TWINT=1
in r16,twsr ;TWI Status-Register holen
andi r16,0xf8 ;TWPS1|2 maskieren
cpi r16,0x58 ;Daten erfolgreich empfangen?
brne twi_mr ;sonst Fehleranzeige
in r17,twdr ;Daten holen
rcall ausgabe ;und ausgeben
ldi r16,0b10010100 ;TWINT=1 - TWSTO=1 - TWEN=1
out twcr,r16 ;Stop-Bedingung senden
rjmp start
ausgabe:
andi r17,0xf0 ;unteres Nibble maskieren
out portd,r17 ;oberes Nibble ausgeben
ret
;#############################################################################
; * Master als Transmitter *
;#############################################################################
twi_mt:
in r17,pind ;Daten holen
ldi r16,0b10100100 ;TWINT=1 - TWSTA=1 - TWEN=1
out twcr,r16 ;Start-Bedingung senden
twi_mt1:
in r16,twcr ;Controlregister holen
sbrs r16,twint ;springe, wenn TWINT=1
rjmp twi_mt1 ;sonst warte bis TWINT=1
in r16,twsr ;Statusregister holen
andi r16,0xf8 ;TWPS1|2 maskieren
cpi r16,$08 ;Start-Bedingung erfolgreich gesendet?
brne fehler ;Fehleranzeige
ldi r16,0b00000010 ;Wert für Datenregister
out twdr,r16 ;Slave-Adresse=0b0000001- R/W=0 (SLA+W)
ldi r16,0b10000100 ;TWINT=1 - TWEN=1
out twcr,r16 ;SLA+W senden
twi_mt2:
in r16,twcr ;Controlregister holen
sbrs r16,twint ;springe, wenn TWINT=1
rjmp twi_mt2 ;sonst warte auf TWINT=1
in r16,twsr ;Statusregistern holen
andi r16,0xf8 ;TWSP1|2 maskieren
cpi r16,$18 ;SLA+W erfolgreich gesendet?
brne fehler ;Fehleranzeige
andi r17,0x0f
out twdr,r17 ;TWI-Register laden
ldi r16,0b10000100 ;TWINT=1 - TWEN=1
out twcr,r16 ;Datenübertragung starten
twi_mt3:
in r16,twcr ;TWI Control-Register holen
sbrs r16,twint ;springe, wenn TWINT=1
rjmp twi_mt3 ;warte auf TWINT=1
in r16,twsr ;TWI Status-Register holen
andi r16,0xf8 ;TWPS1|2 maskieren
cpi r16,0x28 ;Daten erfolgreich gesendet?
brne fehler ;sonst Fehleranzeige
ldi r16,0b10010100 ;TWINT=1 - TWSTO=1- TWEN=1
out twcr,r16 ;Stop Bedingung senden
rjmp start
MFG Hoschi