Dokumentáció: Itt!
;++++++++++ Terszteltem és jó +++++++++++++++++++++
;*1 *Bekapapcsolom a modult,
nop
bset I2C1CONL,#I2CEN ; Bekapapcsolom
nop
;*2 * Várok míg át nem áll a SEM bit, vagyis a az I2C moduk bekapcsolásáig:
btss I2C1CONL, #I2CEN ;
bra $-2 ; ha bakapcsoi az I2C modul, akkor továbbmegy
;*3 *Beállítom a START bitet a START jel kiadására
bset I2C1CONL,#SEN ; Start-ot engedélyezi
adatbemasolas:
;*4 *metültöm az elküldendő adatot, ami most a szolga címe és az R/!W bit
mov #0b10010001, W0 ; P24 Adatokat kérek a szolgától R/!W Adatküldés=0, adatkérés=1
mov W0, I2C1TRN ;P24
;*5 Figyelem, hogy betárolódott-e a 8 bites adat, és ha igen, csak akkor lép tovább a program,
btss I2C1STAT, #TBF ; Ha van a I2C1TRN-ben adat, akkot TBF=1
bra adatbemasolas ; vár az adatok kimenésére, a tároló kiürülésére
;*6 Várok a START jel kiadásának megtörtöntére
btss I2C1STAT, #S ; átugor, ha megvolt a START jel
bra $-2 ; vár a START jelre
;*7 Figyelem, hogy kimentek-e az adatok, és ha igen, akkor továbblép a program,
btsc I2C1STAT, #TBF ;Ha van a I2C1TRN-ben adat, akkot TBF=1, ha kimegy, akkor TBF=0
bra $-2 ; vár az adatok kimenésére, a tároló (buffewr) kiürülésére
;*8 Várok a kommunikáció megtörténtére
btsc I2C1STAT, #TRSTAT ; 1-ről 0-ra vált, ha kimegy a 8 bit és megjön az ACK jel
bra $-2 ; Vár az adatok kimenésére és az ACK jel megérkezésére
; * Engedélyezem az adatfogadást
bset I2C1CONL,#RCEN
btss I2C1CONL, #RCEN ; Ha bekapcsol az adatfogadást engedélyező bit, akkor továbblép
bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés
bclr I2C1CONL, #ACKDT ; ACKDT=0 -> ACK, ACKDT=1 -> NACK
btsc I2C1CONL, #ACKDT ; ACK legyen majd jésőbb, ne NACK(Előre beállítjuk)
bra $-4 ; Ha beálla bit, akkor továbblép
; * Várom a szolgától érkező adatot, ha megérkezik, akkor továbblép
btss I2C1STAT, #RBF ; Ha megérkezik, akkor RBF=1 lesz és továbblép
bra $-2
; * A megérkezett adat kiolvasása, ha kiolvasva, akkor továbblép
mov I2C1RCV ,W5
btsc I2C1STAT, #RBF ; Ha kiolvasva, akkor RBF=0 és továbblép
bra $-4
; A mesternek nyugtázásként egy NACK-al vissza kell jelezni a szolgának
bset I2C1CONL, #ACKEN ; jelzi a M a szolgának, hogy újabb adatot vár
btss I2C1CONL, #ACKEN ; Ha engedélyezve a mesternek a nyzgtázás, akkor továbblép
bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés
; * Engedélyezem üjból az adatfogadást
bset I2C1CONL, #RCEN
btss I2C1CONL, #RCEN ; Ha bekapcsol az adatfogadást engedélyező bit, akkor továbblép
bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés
; * Várom a szolgától érkező adatot, ha megérkezik, akkor továbblép
btss I2C1STAT, #RBF ; Ha megérkezik, akkor RBF=1 lesz és továbblép
bra $-2
; * A megérkezett adat kiolvasása, ha kiolvasva, akkor továbblép
mov I2C1RCV ,W6
btsc I2C1STAT, #RBF ; Ha kiolvasva, akkor RBF=0 és továbblép
bra $-4
bset I2C1CONL, #ACKDT ; ACKDT=0 -> ACK, ACKDT=1 -> NACK
btss I2C1CONL, #ACKDT ; Ha bekapcsol az adatfogadást engedélyező bit, akkor továbblép
bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés
; A mesternek nyugtázásként egy NACK-al vissza kell jelezni a szolgának
bset I2C1CONL, #ACKEN ; jelzi a M a szolgának, hogy újabb adatot vár
btss I2C1CONL, #ACKEN ; Ha engedélyezve a mesternek a nyzgtázás, akkor továbblép
bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés
; Megvárja a NACK megtörténtét, majd továbblép
btsc I2C1CONL, #ACKEN ; Ha a NACK megvolt, akkor 0 és továbblép
bra $-2
; A mester STOP jellel jelzi a szolgának, hogy vége a kommunikációnak, így a STOP jel engedélyezése:
bset I2C1CONL, #PEN
btss I2C1CONL, #PEN ; Vár a STOP engedélyezés bit beállására
bra $-2 ;
;* Vár a STOP jel lefutására, megtörténte után továbblép
btsc I2C1CONL, #PEN ; Vár a STOP kimenetelére, mikor a PEN bit 0-ra vált
bra $-2 ;
; * Várok a SZOP jel kiadásának megtörtöntének érzékeléséra
btss I2C1STAT, #P ; átugor, ha megvolt a START jel
bra $-2 ; vár a START jelre
nop
bra $ ;
nop
;*5 *Beállítom a STOP bitet a START jel kiadására
bset I2C1CONL,#PEN ; STOP-ot engedélyezi
btss I2C1CONL,#PEN
bra $-4 ;
; * Várok a START jel kiadásának megtörtöntére
btss I2C1STAT, #P ; átugor, ha megvolt a START jel
bra $-2 ; vár a START jelre
nop
bra $ ;
reset
nop
;++++++++++++++ eddig ++++++++++++++++++++++++++++++++++++++++++++++
;++++++ Még nem teszteltem ++++++++++++++++++++++++++
lm75A_hosszuhofok: ; Hőfokbekérés POINTER megadásával
;*1 *Bekapapcsolom a modult,
nop
bset I2C1CONL,#I2CEN ; Bekapapcsolom
nop
;*2 * Várok míg át nem áll a SEM bit, vagyis a az I2C moduk bekapcsolásáig:
btss I2C1CONL, #I2CEN ;
bra $-2 ; ha bakapcsoi az I2C modul, akkor továbbmegy
;*3 *Beállítom a START bitet a START jel kiadására
bset I2C1CONL,#SEN ; Start-ot engedélyezi
i2c1_adatbemazgatas_1:
;*4 *Betöltöm az elküldendő adatot, ami most a szolga címe és az R/!W bit
mov #0b10010000, W0 ; Cím + R/!W adatokat küldök a szolgán R/!W Adatküldés=0, adatkérés=1
mov W0, I2C1TRN ;P24
;*5 Figyelem, hogy betárolódott-e a 8 bites adat, és ha igen, csak akkor lép tovább a program,
btss I2C1STAT, #TBF ; Ha van a I2C1TRN-ben adat, akkot TBF=1
bra i2c1_adatbemazgatas_1 ; vár az adatok kimenésére, a tároló kiürülésére
;*6 Várok a START jel kiadásának megtörtöntére
btss I2C1STAT, #S ; átugor, ha megvolt a START jel
bra $-2 ; vár a START jelre
;*7 Figyelem, hogy kimentek-e az adatok, és ha igen, akkor továbblép a program,
btsc I2C1STAT, #TBF ;Ha van a I2C1TRN-ben adat, akkot TBF=1, ha kimegy, akkor TBF=0
bra $-2 ; vár az adatok kimenésére, a tároló (buffewr) kiürülésére
;*8 Várok a kommunikáció megtörténtére
btsc I2C1STAT, #TRSTAT ; 1-ről 0-ra vált, ha kimegy a 8 bit és megjön az ACK jel
bra $-2 ; Vár az adatok kimenésére és az ACK jel megérkezésére
i2c1_adatbemazgatas_2:
;*4 *metültöm az elküldendő adatot, ami most a szolga címe és az R/!W bit
mov #0b00000000, W0 ; Pointer (most hőfok) adatot küldök a szolgának
mov W0, I2C1TRN ;P24
;*5 Figyelem, hogy betárolódott-e a 8 bites adat, és ha igen, csak akkor lép tovább a program:
btss I2C1STAT, #TBF ; Ha van a I2C1TRN-ben adat, akkot TBF=1
bra i2c1_adatbemazgatas_2 ; vár az adatok kimenésére, a tároló kiürülésére
;*7 Figyelem, hogy kimentek-e a cím+R adatok, és ha igen, akkor továbblép a program:
btsc I2C1STAT, #TBF ;Ha van a I2C1TRN-ben adat, akkot TBF=1, ha kimegy, akkor TBF=0
bra $-2 ; vár az adatok kimenésére, a tároló (buffewr) kiürülésére
;*8 Várok a kommunikáció megtörténtére
btsc I2C1STAT, #TRSTAT ; 1-ről 0-ra vált, ha kimegy a 8 bit és megjön az ACK jel
bra $-2 ; Vár az adatok kimenésére és az ACK jel megérkezésére
;* Törlöm a START jelző bitet mert kell a RESTART jelzésére:
bclr I2C1STAT, #S ;
;* Vár a START (RESTART) jelzőbit törlésére
btsc I2C1STAT, #S ; átugor, ha törlődött START (RESTZART) jel
bra $-4 ; vár a START jel törlésére
i2c1_adatbemazgatas_3:
;* Betöltöm az elküldendő adatot, ami most a szolga címe és az R/!W bit
mov #0b10010001, W0 ; Cím + R/!W adatokat küldök a szolgán R/!W Adatküldés=0, adatkérés=1
mov W0, I2C1TRN ;
;* Figyelem, hogy betárolódott-e a 8 bites adat, és ha igen, csak akkor lép tovább a program,
btss I2C1STAT, #TBF ; Ha van a I2C1TRN-ben adat, akkot TBF=1
bra i2c1_adatbemazgatas_3 ; vár az adatok kimenésére, a tároló kiürülésére
;* RESTART jelet köldök a folytatás jelzésére ami a pointer által jelzett adatok bekérését kezdeményezi
bset I2C1CONL,#RSEN ; Bekapapcsolom
;* Várok míg át nem áll a RSEN bit, vagyis a RESTART enedélyezése:
btss I2C1CONL, #RSEN ;
bra $-4 ; ha bakapcsoi az I2C modul, akkor továbbmegy
;* Várok a RESTART jel kiadásának megtörtöntére
btss I2C1STAT, #S ; átugor, ha megvolt a RESTART jel
bra $-2 ; vár a RESTART jel kiadásának megtörténtére
;*7 Figyelem, hogy kimentek-e az adatok, és ha igen, akkor továbblép a program,
btsc I2C1STAT, #TBF ;Ha van a I2C1TRN-ben adat, akkot TBF=1, ha kimegy, akkor TBF=0
bra $-2 ; vár az adatok kimenésére, a tároló (buffewr) kiürülésére
; * Engedélyezem az adatfogadást ami at 1, fogadott byte lesz:
bset I2C1CONL,#RCEN
btss I2C1CONL, #RCEN ; Ha bekapcsol az adatfogadást engedélyező bit, akkor továbblép
bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés
; * ACK-ot adjon a mester nyugtázásként mert még vár egy adatbyte-ot:
bclr I2C1CONL, #ACKDT ; ACKDT=0 -> ACK, ACKDT=1 -> NACK
btsc I2C1CONL, #ACKDT ; ACK legyen majd jésőbb, ne NACK(Előre beállítjuk)
bra $-4 ; Ha beálla bit, akkor továbblép
; * Várom a szolgától érkező adatot, ha megérkezik, akkor továbblép
btss I2C1STAT, #RBF ; Ha megérkezik, akkor RBF=1 lesz és továbblép
bra $-2
; * Ha megérkezett az 1. adat, akkor kiolvassa, ha kiolvasva, akkor továbblép
mov I2C1RCV ,W5
btsc I2C1STAT, #RBF ; Ha kiolvasva, akkor RBF=0 és továbblép
bra $-4
; * Engedélyezem üjból az adatfogadást
bset I2C1CONL, #RCEN
btss I2C1CONL, #RCEN ; Ha bekapcsol az adatfogadást engedélyező bit, akkor továbblép
bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés
; *Köldök egy nyugtázó ACK jelet a szolgának, hogy küldhesse a következő adatbyte-ot
bset I2C1CONL, #ACKEN ; jelzi a M a szolgának, hogy újabb adatot vár
btss I2C1CONL, #ACKEN ; Ha engedélyezve a mesternek a nyzgtázás, akkor továbblép
bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés
; * Várom a szolgától érkező adatot, ha megérkezik, akkor továbblép
btss I2C1STAT, #RBF ; Ha megérkezik, akkor RBF=1 lesz és továbblép
bra $-2
; * A megérkezett a 2. adat kiolvasása, ha kiolvasva, akkor továbblép
mov I2C1RCV ,W6
btsc I2C1STAT, #RBF ; Ha kiolvasva a 2. adat, akkor RBF=0 és továbblép
bra $-4
; * NACK-ot adjon a mester nyugtázásként mert még vár egy adatbyte-ot:
bset I2C1CONL, #ACKDT ; ACKDT=0 -> ACK, ACKDT=1 -> NACK
btss I2C1CONL, #ACKDT ; Ha bekapcsol a NACK-ot választó bit (nem ACK), akkor továbblép
bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés
; A mesternek nyugtázásként egy NACK-al vissza kell jelezni az adatfogást a szolgának
bset I2C1CONL, #ACKEN ; jelzi a M a szolgának, hogy nem kér tübb adatot
btss I2C1CONL, #ACKEN ; Ha engedélyezve a mesternek a nyugtázás, akkor továbblép
bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés
; Megvárja a NACK megtörténtét, majd továbblép
btsc I2C1CONL, #ACKEN ; Ha a NACK megvolt, akkor 0 és továbblép
bra $-2
; A mester STOP jellel jelzi a szolgának, hogy vége a kommunikációnak, így a STOP-ot engedélyezi:
bset I2C1CONL, #PEN
btss I2C1CONL, #PEN ; Vár a STOP engedélyezés bit beállására
bra $-4 ;
;* Vár a STOP jel lefutására, megtörténte után továbblép
btsc I2C1CONL, #PEN ; Vár a STOP kimenetelére, mikor a PEN bit 0-ra vált
bra $-2 ;
; * Várok a STOP jel kiadásának megtörtöntének érzékeléséra
btss I2C1STAT, #P ; átugor, ha megvolt a STOP jel
bra $-2 ; vár a STOP érzékelésének megtörténtére
;* Kikapapcsolom a modult:
; bclr I2C1CONL,#I2CEN ; Bekapapcsolom
;* Várok míg át nem áll a SEM bit, vagyis a az I2C moduk kikapcsolásáig:
; btss I2C1CONL, #I2CEN ;
; bra $-4 ; ha kikapcsoi az I2C modul, akkor továbbmegy
nop
bra $ ;
nop
goto lm75A_hosszuhofok_
nop
reset
nop