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:
Dort wo die ???? stehn endet mein verständnisCode: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![]()
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:
Wenn ich also die Anderen Status Codes weglassen kann wäre ich doch mit dem Slave schon fertig beim Programmieren oder?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







Zitieren

Lesezeichen