Ok, het is wel in assembler (aangeleerde gewoontes). Ik heb geprobeerd om de code proper weer te geven, de vet aangegeven woorden zijn labels (en worden gebruikt om te springen naar bepaalde routines). Als er vragen zijn rond de code: stel ze gerust (andere opmerkingen rond het oplossen van het probleem zijn ook altijd welkom).
Write
movf Error_cnt, w ; error register herinitialiseren
movwf Error_reg
Writes
bsf STATUS, RP0 ; Naar BANK 1 gaan
bsf SSPCON2, SEN ; START Conditie genereren
call WaitI2C ; Subroutine om te wachten op succesvol aflopen van de I2C operatie
movf Loc_reg, w ; Module adres in W zetten
call SendI2C ; Zend routine oproepen
call WaitI2C ; Wachten
call WaitAck ; Subroutine om te wachten op Ack
movf Con_reg, w ; Control byte in W zetten
call SendI2C
call WaitI2C
call WaitAck
movf Dat_reg, w ; Data byte in W zetten
call SendI2C
call WaitI2C
call WaitAck
bsf STATUS, RP0 ; Naar BANK 1 gaan
bsf SSPCON2, PEN ; STOP Conditie genereren
call WaitI2C ; Wachten
return ; Terugkeren naar oorspronkelijke oproep
WaitAck
bcf STATUS, RP0
movf del16_reg, w ; delay van 16 us voor checken of Ack ontvangen is
movwf TMR0
call TMR
incf Bit_reg, f ; increase timeout counter each time ACK is not received
btfsc Bit_reg, 4
goto FailI2C
bsf STATUS, RP0 ; Naar BANK 1 gaan
btfsc SSPCON2, ACKSTAT ; Testen of de module een ACK heeft gegeven
goto WaitAck ; Blijvan Wachten -> tot max van 256us
bcf SSPCON2, ACKSTAT ; Ack clearen
bcf STATUS, RP0 ; Naar BANK 0 gaan
retlw 0
FailI2C
bsf STATUS, RP0 ; Naar BANK 1 gaan
bsf SSPCON2, PEN ; STOP Conditie genereren
call WaitI2C ; Wachten
bsf SSPCON2, SEN ; START Conditie genereren
call WaitI2C
bsf SSPCON2, PEN ; STOP Conditie genereren
call WaitI2C
bsf SSPCON2, SEN
call WaitI2C
bsf SSPCON2, PEN
call WaitI2C
decfsz Error_reg
goto Writes
bsf PORTC, 2 ; Fout Melden
loop goto loop ; Eternal loop
SendI2C
bcf STATUS, RP0 ; Naar BANK 0 gaan
movwf SSPBUF ; De te verzenden data in I2C buffer register laden
retlw 0 ; Terugkeren naar oproep
WaitI2C
bcf STATUS, RP0 ; Naar BANK 0 gaan
btfss PIR1, SSPIF ; Is deze interrupt gezet?
goto WaitI2C ; Nee, loop terug
bcf PIR1, SSPIF ; Ja, I2C operatie is met succes afgelopen
retlw 0 ; Terugkeren naar oproep