Ich hab mir das jetzt alles mal ziemlich genau angesehn, und versucht damit ein Programm zu schreiben.
Ich wusste zwar das es nicht leicht wird, aber gleich so kompliziert !!!
So initialisiere ich den TWI beim Slave:
Code:
; TWI einstellen
; TWI TWAR (nur SLAVE) Adress-Register
ldi temp, TWI_Slave_Adresse<<TWA0|TWI_General_Call_Enable<<TWGCE
out TWAR,temp
; TWI TWCR Control-REGISTER
ldi temp, 1<<TWINT|1<<TWEA|0<<TWSTA|0<<TWSTO|0<<TWWC|1<<TWEN|1<<TWIE
out TWCR,temp
und hier wollte ich versuchen einen programmtext zu schreiben um daten zu empfangen:
Code:
TWSI:
in temp, SREG
push temp
in temp, TWSR
andi temp, 0b11111000
????
????
TWI_Ende:
;das TWINT-Flag löschen ((logisch 1)
ldi temp, 1<<TWINT|1<<TWEA|1<<TWEN|1<<TWIE
out TWCR,temp
pop temp
out SREG, temp
reti
Dort wo die ???? stehn endet mein verständnis
Ich habe mir nochmal das Datenblatt vom ATmega8 hergenommen. Auf Seite 186 ist eine schöne Tabelle was bei den ???? so alles drinn stehn sollte. Ich kann zwar English, aber da hier dann andauernd so begriffe wie SLA, ACK, GCA, ... fallen setz ich da aus.
1. Stimmt es das das Register TWSR für die Überwachung des Zustandes auf dem Bus ist, also hier steht drinnen was jetzt als nächstes geschieht?
Wenn ja, dann hab ich das schon mal nicht komplett falsch verstanden.
2. Brauch ich wirklich alle diese Befehle, und wofür stehn die jetzt im einzelnen?
Die Datenbyts empfange ich wenn TWSR auf 0x80 steht oder? ich will allerdings immer 2 Bytes empfangen, wie mach ich das?
Ich weiß das sind jetzt ziemlich viele Fragen aufeinmal, aber ich hab mir fest vorgenommen das genauer zu verstehn.
EDIT: Ich glaub ich hab jetzt aus dem Datenblatt herausgelesen das 0x80 und 0x88 jeweils ankündigen ein Datenbyte übertragen zu haben, also würde das dann so aus sehn:
Code:
TWSI:
in temp, SREG
push temp
in temp, TWSR
andi temp, 0b11111000
cpi temp, 0x80
breq Datenbyte_empfangen
cpi temp, 0x88
breq Datenbyte_empfangen
rjmp TWI_Ende
Datenbyte_empfangen:
inc TWI_Anzahl_empfangen
cpi TWI_Anzahl_emfpangen, 0b00000001
rjmp Datenbyte1_emfpangen
cpi TWI_Anzahl_emfpangen, 0b00000010
rjmp Datenbyte2_empfangen
Datenbyte1_empfangen:
mov TWI_empfangen1, temp
rjmp TWI_Ende
Datenbyte2_emfpangen:
clr TWI_Anzahl_empfangen
mov TWI_emfpangen2, temp
;Daten verarbeiten...
rjmp TWI_Ende
TWI_Ende:
;das TWINT-Flag löschen ((logisch 1)
ldi temp, 1<<TWINT|1<<TWEA|1<<TWEN|1<<TWIE
out TWCR,temp
pop temp
out SREG, temp
reti
Wenn ich also die Anderen Status Codes weglassen kann wäre ich doch mit dem Slave schon fertig beim Programmieren oder?
Lesezeichen