empfangen: JB b_TWI_busy,empfangen MOV ACC,SSCON JB ACC.4,empfangen MOV R7,#00h ;--Inhalt von R7 "löschen" SETB b_TWI_busy ;--Setzten des TWI auf "belegt" MOV TWI_data,#003h ;--Sendedaten laden / Register 3 MOV slave_adr,#0E3h ;--Slave-Adresse laden SETB rw ;--R/W-Bit auf "1" setzen (lesen) MOV SSDAT,#00h ;--Inhalt von SSDAT "löschen" ORL SSCON,#20h ;--Senden MOV R4,SSDAT ;--Daten von SSDAT in R4 verschieben ;Erstes Byte empfangen empfangen2: CJNE R7,#48h,empfangen3 ;--Schleife wenn Adresse nicht bestätigt sind LJMP senden ;--Senden wiederholen empfangen3: CJNE R7,#58h,empfangen4 ;--Schleife wenn Daten nicht bestätigt sind LJMP senden ;--Senden wiederholen empfangen4: CJNE R7,#50h,empfangen2 ;--Weiter wenn die Übertragung abgeschlossen ist ********************************************************************************************* ********************************************************************************************* Interruptroutinen: (ATMEL) twi_it: MOV R7,SSCS ;--Bus-status in R7 kopieren CJNE R7,#00h,end_case_00 ; /* A start condition has been sent *//* SLR+R/W are transmitted, ACK bit received */ CLR b_TWI_busy ; /* TWI is free */ JMP end_switch end_case_00: CJNE R7,#08h,end_case_08 ANL SSCON,#~20h MOV ACC,slave_adr MOV SSDAT,ACC ORL SSCON,#04h ; /* set AA */ JMP end_switch end_case_08: CJNE R7,#10h,end_case_10 ANL SSCON,#~20h MOV ACC,slave_adr MOV SSDAT,ACC ORL SSCON,#04h ; /* set AA */ JMP end_switch end_case_10: CJNE R7,#18h,end_case_18 ; /* SLR+W was transmitted, ACK bit received */ MOV SSDAT,TWI_data ; /* Transmit data byte, ACK bit received */ ORL SSCON,#04h ; /* set AA */ JMP end_switch end_case_18: CJNE R7,#20h,end_case_20 ; /*SLR+W was transmitted,NOT ACK bit received*/ ORL SSCON,#10h ; /* Transmit STOP */ CLR b_TWI_busy ; /* TWI is free */ JMP end_switch end_case_20: CJNE R7,#28h,end_case_28 ; /* DATA was transmitted, ACK bit received */ ;ORL SSCON,#10h ; /* send STOP */ CLR b_TWI_busy ; /* TWI is free */ JMP end_switch end_case_28: CJNE R7,#30h,end_case_30 ORL SSCON,#10h CLR b_TWI_busy JMP end_switch end_case_30: end_switch: ANL SSCON,#~08h RETI