LM75A és PIC18F45K42 I2C1 és I2C2 kommunikációs program
LM75A és PIC18F45K42 I2C1 kommunikációs program: itt!
Letölthető I2C1 (asm): itt!
LM75A és PIC18F45K42 I2C2 kommunikációs program: itt!
Letölthető I2C2 (asm): itt!
LM75A és PIC18F45K42 I2C1 kommunikációs program
LIST P=PIC18F45K42 ; ISO 8859-2
#include p18f45k42.inc ;
;
; MCLR Enable bit:
;CONFIG MCLRE = INTMCLR ; If LVP = 0, MCLR pin function is port defined function; If LVP =1, RE3 pin fuction is MCLR
; MCLRE = EXTMCLR If LVP = 0, MCLR pin is MCLR; If LVP = 1, RE3 pin function is MCLR
;
;
; Extended Instruction Set Enable bit:
; XINST = ON Extended Instruction Set and Indexed Addressing Mode enabled
;CONFIG XINST = OFF ; Extended Instruction Set and Indexed Addressing Mode disabled
;
;
; WDT operating mode:
;CONFIG WDTE = OFF ; WDT Disabled; SWDTEN is ignored
;
; Low Voltage Programming Enable bit:
;CONFIG LVP = OFF ; HV on MCLR/VPP must be used for programming
; LVP = ON Low voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored
;
;
;CONFIG PPS1WAY = OFF ; OFF- kesobb nem? engedelyezi prgrambol a portmodositasokat
;----------------------------------------------------------------------------
; #include PIC18LF45K42
;
; IMPORTANT: For the PIC18 devices, the __CONFIG directive has been
; superseded by the CONFIG directive. The following settings
; are available for this device.
;
; External Oscillator Selection:
; FEXTOSC = LP LP (crystal oscillator) optimized for 32.768 kHz; PFM set to low power
; FEXTOSC = XT XT (crystal oscillator) above 100 kHz, below 8 MHz; PFM set to medium power
; FEXTOSC = HS HS (crystal oscillator) above 8 MHz; PFM set to high power
; FEXTOSC = RESERVED Reserved (DO NOT USE)
; CONFIG FEXTOSC = OFF ; Oscillator not enabled
; FEXTOSC = ECL EC (external clock) below 100 kHz; PFM set to low power
CONFIG FEXTOSC = ECM ; EC (external clock) for 500 kHz to 8 MHz; PFM set to medium power
; FEXTOSC = ECH EC (external clock) above 8 MHz; PFM set to high power
;
; Reset Oscillator Selection:
; RSTOSC = HFINTOSC_64MHZHFINTOSC with HFFRQ = 64 MHz and CDIV = 1:1
; RSTOSC = RESERVED_1 Reserved
; RSTOSC = EXTOSC_4PLL EXTOSC with 4x PLL, with EXTOSC operating per FEXTOSC bits
; RSTOSC = RESERVED_2 Reserved
; RSTOSC = SOSC Secondary Oscillator
; RSTOSC = LFINTOSC Low-Frequency Oscillator
; CONFIG RSTOSC = HFINTOSC_1MHZHFINTOSC ; with HFFRQ = 4 MHz and CDIV = 4:1
; RSTOSC = EXTOSC EXTOSC operating per FEXTOSC bits (device manufacturing default)
;
; Clock out Enable bit:
; CLKOUTEN = ON CLKOUT function is enabled
; CLKOUTEN = OFF CLKOUT function is disabled
;
; PRLOCKED One-Way Set Enable bit:
; PR1WAY = OFF PRLOCK bit can be set and cleared repeatedly
; CONFIG PR1WAY = ON ; PRLOCK bit can be cleared and set only once
;
; Clock Switch Enable bit:
; CSWEN = OFF The NOSC and NDIV bits cannot be changed by user software
; CSWEN = ON Writing to NOSC and NDIV is allowed
;
; Fail-Safe Clock Monitor Enable bit:
; FCMEN = OFF Fail-Safe Clock Monitor disabled
; FCMEN = ON Fail-Safe Clock Monitor enabled
;
; MCLR Enable bit:
; CONFIG MCLRE = INTMCLR ; If LVP = 0, MCLR pin function is port defined function; If LVP =1, RE3 pin fuction is MCLR
; MCLRE = EXTMCLR If LVP = 0, MCLR pin is MCLR; If LVP = 1, RE3 pin function is MCLR
;
; Power-up timer selection bits:
; PWRTS = PWRT_1 PWRT set at 1ms
; PWRTS = PWRT_16 PWRT set at 16ms
; PWRTS = PWRT_64 PWRT set at 64ms
; PWRTS = PWRT_OFF PWRT is disabled
;
; Multi-vector enable bit:
; CONFIG MVECEN = OFF ; Interrupt contoller does not use vector table to prioritze interrupts
; MVECEN = ON Multi-vector enabled, Vector table used for interrupts
;
; IVTLOCK bit One-way set enable bit:
; IVT1WAY = OFF IVTLOCK bit can be cleared and set repeatedly
; CONFIG IVT1WAY = ON ; IVTLOCK bit can be cleared and set only once
;
; Low Power BOR Enable bit:
; LPBOREN = ON ULPBOR enabled
CONFIG LPBOREN = OFF ; ULPBOR disabled
;
; Brown-out Reset Enable bits:
; BOREN = OFF Brown-out Reset disabled
; BOREN = ON Brown-out Reset enabled according to SBOREN
; BOREN = NOSLP Brown-out Reset enabled while running, disabled in Sleep; SBOREN is ignored
; BOREN = SBORDIS Brown-out Reset enabled , SBOREN bit is ignored
;
; Brown-out Reset Voltage Selection bits:
; BORV = VBOR_2P85 Brown-out Reset Voltage (VBOR) set to 2.8V
; BORV = VBOR_2P7 Brown-out Reset Voltage (VBOR) set to 2.7V
; BORV = VBOR_245 Brown-out Reset Voltage (VBOR) set to 2.45V
; BORV = VBOR_190 Brown-out Reset Voltage (VBOR) set to 1.90V
;
; ZCD Disable bit:
; ZCD = ON ZCD always enabled
; ZCD = OFF ZCD disabled. ZCD can be enabled by setting the ZCDSEN bit of ZCDCON
;
; PPSLOCK bit One-Way Set Enable bit:
; PPS1WAY = OFF PPSLOCK bit can be set and cleared repeatedly (subject to the unlock sequence)
CONFIG PPS1WAY = ON ; PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle
;
; Stack Full/Underflow Reset Enable bit:
; STVREN = OFF Stack full/underflow will not cause Reset
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
;
; Debugger Enable bit:
; DEBUG = ON Background debugger enabled
; DEBUG = OFF Background debugger disabled
;
; Extended Instruction Set Enable bit:
; XINST = ON Extended Instruction Set and Indexed Addressing Mode enabled
CONFIG XINST = OFF ; Extended Instruction Set and Indexed Addressing Mode disabled
;
; WDT Period selection bits:
; WDTCPS = WDTCPS_0 Divider ratio 1:32
; WDTCPS = WDTCPS_1 Divider ratio 1:64
; WDTCPS = WDTCPS_2 Divider ratio 1:128
; WDTCPS = WDTCPS_3 Divider ratio 1:256
; WDTCPS = WDTCPS_4 Divider ratio 1:512
; WDTCPS = WDTCPS_5 Divider ratio 1:1024
; WDTCPS = WDTCPS_6 Divider ratio 1:2048
; WDTCPS = WDTCPS_7 Divider ratio 1:4096
; WDTCPS = WDTCPS_8 Divider ratio 1:8192
; WDTCPS = WDTCPS_9 Divider ratio 1:16384
; WDTCPS = WDTCPS_10 Divider ratio 1:32768
; WDTCPS = WDTCPS_11 Divider ratio 1:65536
; WDTCPS = WDTCPS_12 Divider ratio 1:131072
; WDTCPS = WDTCPS_13 Divider ratio 1:262144
; WDTCPS = WDTCPS_14 Divider ratio 1:524299
; WDTCPS = WDTCPS_15 Divider ratio 1:1048576
; WDTCPS = WDTCPS_16 Divider ratio 1:2097152
; WDTCPS = WDTCPS_17 Divider ratio 1:4194304
; WDTCPS = WDTCPS_18 Divider ratio 1:8388608
; WDTCPS = WDTCPS_19 Divider ratio 1:32
; WDTCPS = WDTCPS_20 Divider ratio 1:32
; WDTCPS = WDTCPS_21 Divider ratio 1:32
; WDTCPS = WDTCPS_22 Divider ratio 1:32
; WDTCPS = WDTCPS_23 Divider ratio 1:32
; WDTCPS = WDTCPS_24 Divider ratio 1:32
; WDTCPS = WDTCPS_25 Divider ratio 1:32
; WDTCPS = WDTCPS_26 Divider ratio 1:32
; WDTCPS = WDTCPS_27 Divider ratio 1:32
; WDTCPS = WDTCPS_28 Divider ratio 1:32
; WDTCPS = WDTCPS_29 Divider ratio 1:32
; WDTCPS = WDTCPS_30 Divider ratio 1:32
; WDTCPS = WDTCPS_31 Divider ratio 1:65536; software control of WDTPS
;
; WDT operating mode:
CONFIG WDTE = OFF ; WDT Disabled; SWDTEN is ignored
; WDTE = SWDTEN WDT enabled/disabled by SWDTEN bit
; WDTE = NSLEEP WDT enabled while sleep=0, suspended when sleep=1; SWDTEN ignored
; WDTE = ON WDT enabled regardless of sleep
;
; WDT Window Select bits:
; WDTCWS = WDTCWS_0 window delay = 87.5; no software control; keyed access required
; WDTCWS = WDTCWS_1 window delay = 75 percent of time; no software control; keyed access required
; WDTCWS = WDTCWS_2 window delay = 62.5 percent of time; no software control; keyed access required
; WDTCWS = WDTCWS_3 window delay = 50 percent of time; no software control; keyed access required
; WDTCWS = WDTCWS_4 window delay = 37.5 percent of time; no software control; keyed access required
; WDTCWS = WDTCWS_5 window delay = 25 percent of time; no software control; keyed access required
; WDTCWS = WDTCWS_6 window always open (100%); no software control; keyed access required
; WDTCWS = WDTCWS_7 window always open (100%); software control; keyed access not required
;
; WDT input clock selector:
; WDTCCS = LFINTOSC WDT reference clock is the 31.0 kHz LFINTOSC
; WDTCCS = MFINTOSC WDT reference clock is the 32kHz MFINTOSC output
; WDTCCS = SOSC WDT reference clock is SOSC
; WDTCCS = SC Software Control
;
; Boot Block Size selection bits:
; BBSIZE = BBSIZE_8192 Boot Block size is 8192 words
; BBSIZE = BBSIZE_4096 Boot Block size is 4096 words
; BBSIZE = BBSIZE_2048 Boot Block size is 2048 words
; BBSIZE = BBSIZE_1024 Boot Block size is 1024 words
; BBSIZE = BBSIZE_512 Boot Block size is 512 words
;
; Boot Block enable bit:
; BBEN = ON Boot block enabled
; BBEN = OFF Boot block disabled
;
; Storage Area Flash enable bit:
; SAFEN = ON SAF enabled
; SAFEN = OFF SAF disabled
;
; Application Block write protection bit:
; WRTAPP = ON Application Block write protected
; WRTAPP = OFF Application Block not write protected
;
; Configuration Register Write Protection bit:
; WRTB = ON Configuration registers (300000-30000Bh) write-protected
; WRTB = OFF Configuration registers (300000-30000Bh) not write-protected
;
; Boot Block Write Protection bit:
; WRTC = ON Boot Block (000000-0007FFh) write-protected
; WRTC = OFF Boot Block (000000-0007FFh) not write-protected
;
; Data EEPROM Write Protection bit:
; WRTD = ON Data EEPROM write-protected
; WRTD = OFF Data EEPROM not write-protected
;
; SAF Write protection bit:
; WRTSAF = ON SAF Write Protected
; WRTSAF = OFF SAF not Write Protected
;
; Low Voltage Programming Enable bit:
CONFIG LVP = OFF ; HV on MCLR/VPP must be used for programming
; LVP = ON Low voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored
;
; PFM and Data EEPROM Code Protection bit:
; CP = ON PFM and Data EEPROM code protection enabled
; CP = OFF PFM and Data EEPROM code protection disabled
;
adat: UDATA_ACS ; H'10' ; nincs kezdo memoriacim megadva az ACCESS ramban
W_TEMP RES 1 ; w register for context saving (ACCESS)
STATUS_TEMP RES 1 ; status used for context saving
BSR_TEMP RES 1 ; bank select used for ISR context saving
_wreg1 res 1 ; Altalanos valtozo
_adatbe res 1 ; I2C-n bejött adat (csak adat) Ez hexa adat!
_szamjegy res 1 ; Kijelzo altal megjelenito 1 darab szamjegy
_kijelzo_jel res 1 ; egy kijelzonek szolo kijelzendo jel
Adat_H res 1 ;{ LM75-bol kiolvasott <D10:D3> hofok hexadesimalisan
Adat_L res 1 ; LM75-bol kiolvasott <D2:D0> hofok hexadesimalisan
; homerseklet adat osszesen <D10:D0> 11 biten tarolodik}
;
; RC3 (18. lab) <--> SCL ---- TB3159 alapjan
; RC4 (23. lab) <--> SDA
RES_VECT CODE 0x0000 ; processor reset vector
; GOTO START ; go to beginning of program
ORG 0X0100
nop ;
goto start ;
;----------------------------------PIC18's--------------------------------------
start:
banksel 0 ;
;FOPROGRAM_KEZDETE_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
; goto $
foprogram:
goto config_I2C1_SSP ; TB3159 alapjan
config_I2C1_SSP_:
goto config_I2C1 ;
config_I2C1_:
; MELYIKET HAJTSA VÉGRE? VÁLASZTÁS:
goto i2c1_lm75a_PRODUCT_R
nop
i2c1_lm75a_PRODUCT_R_:
nop
goto i2c1_lm75a_PRODUCT_R
clrf Adat_H ; T:
movlw b'00000100' ; d'21' ;
banksel Adat_H ;
movwf Adat_H ;
clrf Adat_L ;
goto i2c1_lm75a_CONF_W
i2c1_lm75a_CONF_W_:
; goto i2c1_lm75a_CONF_W
goto $
goto i2c1_lm75a_CONF_R
i2c1_lm75a_CONF_R_:
nop
; goto i2c1_lm75a_CONF_R
goto $
goto i2c1_lm75a_HYS_W
nop
i2c1_lm75a_HYS_W_: ;
nop
; goto i2c1_lm75a_HYS_W
goto i2c1_lm75a_HYS_R
nop
i2c1_lm75a_HYS_R_:
nop
; goto i2c1_lm75a_HYS_R
clrf Adat_H ; T:
movlw d'22' ;
banksel Adat_H ;
movwf Adat_H ;
clrf Adat_L ;
; goto lm75a_i2c1_hofokolvasas ; LM75A POINTER BEÁLLÍTÁSSAL
goto i2c1_lm75a_TOS_W
i2c1_lm75a_TOS_W_:
; goto i2c1_lm75a_TOS_W
goto i2c_lm75a_TOS_R ;
nop
i2c1_lm75a_TOS_R_:
goto$
nop
goto i2c_lm75a_TOS_R
goto i2c1_lm75a_pointeres_hofok_R
nop
i2c1_lm75a_pointeres_hofok_R_:
goto i2c1_lm75a_pointeres_hofok_R
nop
goto i2c1_lm75a_rovid_hofok_R
i2c1_lm75a_rovid_hofok_R_:
goto i2c1_lm75a_rovid_hofok_R
goto $
; goto lm75a_TEMP_R ;
; goto lm75a_TOS_R ;
;lm75a_TOS_R_:
; goto lm75a_HYS_R ;
; goto lm75a_CONF_R ;
goto $
reset
goto $
; goto lm75a_poiner_olvasas
; goto $ ;
; goto hofokolvasas_lm75a_i2c1 ;
goto $ ;
; goto hofoklm75a_THYST
; goto hofokolvasas_lm75a_i2c1 ;
;hofokolvasas_im75a_i2c1:
nop
goto $
goto $
; ----------------------
nop
adatfeldolgozas_vissza:
; RD2 (21. lab) be-ki kapcsolasaval az
; RC4 (23.lab) leset lehet kapcsolgatni
;
;FOPROGRAM_VEGE_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
; --------------------------------------------------------
; kb.: 113-165
;-------------------------------------------------------------
;-------------------------------------------------------------
config_I2C1_SSP: ; TB3159 alapjan
; RC3 (18. lab) <--> SCL
; RC4 (23. lab) <--> SDA
; Letiltjuk globalisan a megszakitasokat
banksel INTCON0
BCF INTCON0,GIE ; letiltjuk globálisan a megszakításokat
; A labalat (RC3 es RC4) digitalissnak konfiguraljuk
banksel ANSELC ;
bcf ANSELC,ANSELC3 ;
bcf ANSELC,ANSELC4 ;
; Letiltjuk globalisan a megszakitasokat
banksel INTCON0
bcf INTCON0,GIE ; letiltjuk globálisan a megszakításokat
; PPS UNLOCK szekvencia
banksel PPSLOCK ;
movlw 0x55 ;
movf PPSLOCK ;
movlw 0xAA ;
movf PPSLOCK ;
bcf PPSLOCK,PPSLOCKED ;
; Engedélyezzuk globalisan a megszakitasokat
banksel INTCON0
bsf INTCON0,GIE ; engedélyezzük globálisan a megszakításokat
; Az RC4 labat az I2C1 modul SDA (adat) portjahoz rendeljuk
movlw 0x22 ;
banksel RC4PPS ;
movwf RC4PPS
movlw 0x14 ;
banksel I2C1SDAPPS ;
movwf I2C1SDAPPS ;
; Az RC3 labat az I2C1 modul SCL (szinkronjel) portjahoz rendeljuk
movlw 0x21 ;
banksel RC3PPS ;
movwf RC3PPS
movlw 0x13 ;
banksel I2C1SCLPPS ;
movwf I2C1SCLPPS ;
; Letiltjuk globálisan a megszakításokat
bcf INTCON0,GIE ; letiltjuk globálisan a megszakításokat
; PPS LOCK szekvencia
banksel PPSLOCK ;
movlw 0x55 ;
movf PPSLOCK ;
movlw 0xAA ;
movf PPSLOCK ;
bsf PPSLOCK,PPSLOCKED ;
; Engedélyezzuk globálisan a megszakításokat
bsf INTCON0,GIE ; engedélyezzuk globálisan a megszakításokat
; A ket labat nyitott collektoros kimenette konfiguraljuak
banksel ODCONC ;
bsf ODCONC,ODCC3 ;
bsf ODCONC,ODCC4 ;
; Beallitjuk az I2C szinteket
banksel RC3I2C
bsf RC3I2C,TH0 ;
bsf RC3I2C,TH1 ;
bsf RC4I2C,TH0 ;
bsf RC4I2C,TH1
; Kimenette konfiguraljuk a ket labat
banksel TRISC ;
bcf TRISC,TRISC3 ;
bcf TRISC,TRISC4 ;
movlw b'01100001' ; x101xx01 Kat.:271. old
banksel RC3I2C
movwf RC3I2C ; { a labak I2C specifikussa tetele
movwf RC4I2C ; es felhuro ellenallasok bekapcsolasa (SDA es SCL)
; goto config_I2C1_SSP_
;-----------------------------------------------------------------------
config_I2C1:
; I2C1 MESTER MOD INICIALIZALASA (7 bites mester címzéssel):
; ne legyenek megszakitasok az I2C-nel
banksel I2C1PIE ;
clrf I2C1PIE ;
; 4-es uzemmos beallitas (mester 7 bites cimzessel)
banksel I2C1CON0 ;
movlw 0x04 ; Katalogus 577. oldal (<3:0=100 uzemmester mód)
movwf I2C1CON0 ; Megj.: a 3 bites MODE beallitasavala tobbi bit torlodik
; I2C szinkronjel forrása megadasa ( MFINTOSC 500 KHz b'xxxx0011'= 3 )
banksel I2C1CLK ;
movlw 0x3 ; Katalogus 581. old.
movwf I2C1CLK ;
; I2C1CON1 regiszter beállítása:
; ACK for every valid byte (ACKDT = 0)
; NACKs to end a Read (ACKCNT = 1)
; 0. bit <CSD> = 0 :
; 1. bit <TXU> = 0 :
; 2. bit <RXOV> = 0 :
; 3. bit <-> = 0 :
; 4. bit <ACKT> = 0 :
; 5. bit <ACKSTAT> = 0 :
; 6. bit <ACKDT> = 0 :
; 7. bit <ACKCNT> = 1 :
movlw b'10000000' ; 0x80 ;
movwf I2C1CON1 ;
; I2C1CON2 regiszter beállítása:
; Auto-count disabled (ACNT = 0)
; General Call disabled (GCEN = 0)
; Fast mode enabled
; (FME = 1; SCL = I2CCLK/4)
; ADB1 address buffer used (ADB = 0)
; SDA Hold time of 300 ns (SDAHT = 0)
; Bus free time of 16 I2C Clock pulses
; (BFRET = 1)
; 0-1. bit BFRET<1:0> = 01 :
; 2-3. bit SDAHT<3:2> = 00 :
; 4. bit <ADB> = 1 (Megj.: példaprogramban 0, és "S" bittel indul a kommunikáció)
; 5. bit <FME> = 0 : Lassú üzemmód
;(megj.: példaprogramban = 1, ami gyors üzemmód)
; 6. bit <GCEN> = 0 :
; 7. bit <ACNT> = 0 :
movlw b'00010001' ; Példaprogramban 0x21
movwf I2C1CON2 ; 0x11 (Példaprogramban 0x21)
bcf I2C1CON2,FME ;Va: Atallitottam lassu üzemmodra
bsf I2C1CON0,EN ; Bekapcsolom az I2C1 modult
goto config_I2C1_ ; visszatérés
;-------------------------------------------------------------
; LM75A POINTER regiszterének beolvasásá, megnézésre
i2c1_lm75a_rovid_hofok_R: ; EZT TÖRÖLNI MERT ÉRTELMETLEN!!!
nop ;
banksel I2C1STAT0 ;
btfss I2C1STAT0,BFRE
goto $-2
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C1CNT ;
movlw 0x2 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010001' ;
banksel I2C1TXB ; T: S kiadása nélkül- <7:1> szolga cime es <0>=R/!W
movwf I2C1TXB ;
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
banksel I2C1STAT1
btfss I2C1STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C1RXB
movf I2C1RXB,w ;
banksel Adat_H ;
movwf Adat_H ;
banksel I2C1STAT1
btfss I2C1STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C1RXB
movf I2C1RXB,w ;
banksel Adat_L ;
movwf Adat_L ;
nop
banksel I2C1STAT0
btfss I2C1STAT0,BFRE
goto $-2
goto i2c1_lm75a_rovid_hofok_R_
;------------------------------------------------------
i2c1_lm75a_pointeres_hofok_R: ; hosszú, TOS-os változat
banksel I2C1STAT0
btfss I2C1STAT0,BFRE
goto $-2
bsf I2C1CON0,RSEN ; restart engedélyezése
; megadni, hogy hany bajt adatot akarok küldeni restartig
banksel I2C1CNT ;
movlw 0x1 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
; banksel I2C1ADB1 ;
; movwf I2C1ADB1 ; <7:1> szolga cime es <0>=R/!W
banksel I2C1TXB ; T: S kiadása nélkül
movwf I2C1TXB ;
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
; KIKÜLDÜM AZ LM75A POINTER REGISZTERÉNEK A HŐFOK FUNKCIÓVÁLASZTÁST
; --------------------------
movlw b'00000000' ;
banksel I2C1TXB ; T: S kiadása nélkül
movwf I2C1TXB ;
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
;HA AZ ACK JEL MEGJÖN, RESTRTOT KELL KIADNI A MESTRTŐL A SZOLGÁNAK
btfss I2C1CON0,MDR ;
goto $-2 ;
nop
; megadni, hogy hany bajt adatot akarok fogadni egymas utan
banksel I2C1CNT ;
movlw 0x2 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010001' ; 0. bit R/!W=1, 1-7 bit a szolga címe
banksel I2C1TXB ; T: S kiadása nélkül
movwf I2C1TXB ;
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
banksel I2C1STAT1
btfss I2C1STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C1RXB
movf I2C1RXB,w ;
banksel Adat_H ;
movwf Adat_H ;
banksel I2C1CON0 ;
bcf I2C1CON0,RSEN ; restart tiltasa, STOP legyen
banksel I2C1STAT1
btfss I2C1STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C1RXB
movf I2C1RXB,w ;
banksel Adat_L ;
movwf Adat_L ;
nop
banksel I2C1STAT0
btfss I2C1STAT0,BFRE ; várni, míg szabaddá nem válik az I2C busz
goto $-2
goto i2c1_lm75a_pointeres_hofok_R_
;-------------------------------------------------------------
i2c_lm75a_TOS_R: ; gyari hőfokbeállítás:80C
; 1 - Szolga címzése írásra
; 2 - Pointer (LM75A) TOS ításra/olvasásra állítás (b'011'=3)
; 3 - Restart
; 4 - Szolga cimzese 2 bájt adat olvasására
; 5 - 2 bajt adat fogadása (egesz + 3 magas helyiértékű biten a tört érték)
banksel I2C1CON0
bsf I2C1CON0,RSEN ; restart tiltasa, STOP legyen
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C1CNT ;
movlw 0x1 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
banksel I2C1TXB ;
movwf I2C1TXB ; <7:1> szolga cime es <0>=R/!W --> Elküldés
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
movlw b'00000011' ;
banksel I2C1TXB ;
movwf I2C1TXB ; LM75A TOS-jának funkcióválasztás --> Elküldés
banksel I2C1STAT1 ;
btfss I2C1STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel I2C1CON0 ;
btfss I2C1CON0,MDR ;
goto $-2 ;
; RESTART foga majd következni
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C1CNT ;
movlw 0x2 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010001' ;
banksel I2C1TXB ;
movwf I2C1TXB ; <7:1> szolga cime es <0>=R/!W
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
banksel I2C1STAT1
btfss I2C1STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C1RXB
movf I2C1RXB,w ;
banksel Adat_H ;
movwf Adat_H ;
banksel I2C1CON0;
bcf I2C1CON0,RSEN ; restart tiltasa, STOP legyen
banksel I2C1STAT1
btfss I2C1STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C1RXB
movf I2C1RXB,w ;
banksel Adat_L ;
movwf Adat_L ;
nop
banksel I2C1STAT0
btfss I2C1STAT0,BFRE
goto $-2
goto i2c1_lm75a_TOS_R_
;----------------------------------------------------------------
i2c1_lm75a_TOS_W: ; gyari hőfokbeállítás:80C
; 1 - Szolga cimzese írásra
; 1 - Pointer (LM75A) TOS ításra/olvasásra. Állítás (b'011'=3)
; 2 - 2 bajt adat elküldese (egesz + 3 biten a tört érték ami többnyire 0)
banksel I2C1STAT0
btfss I2C1STAT0,BFRE
goto $-2
; megadni, hogy hany bajt adatot akarok küldeni egymas utan
banksel I2C1CNT ;
movlw 0x3 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
banksel I2C1TXB ;
movwf I2C1TXB ; Szlga címénekelküldése írásra
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
movlw b'00000011' ;
banksel I2C1TXB ; Kiküldöm az LM75A TOS-jának a funkcióválasztását
movwf I2C1TXB ;
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel Adat_H ;
clrf Adat_L ;
movf Adat_H,w ;
banksel I2C1TXB ;
movwf I2C1TXB ; Elküldöm a TOS felső bájtját
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
nop
banksel Adat_L
movf Adat_L,w ;
banksel I2C1TXB ; Elküldöm a TOS alsó bájtját
movwf I2C1TXB ;
nop
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel I2C1STAT0
btfss I2C1STAT0,BFRE
goto $-2
goto i2c1_lm75a_TOS_W_
;------------------------------------------------------------------
i2c1_lm75a_HYS_W: ; gyari hőfokbeállítás:80C
; 1 - Szolga cimzese írásra
; 1 - Pointer (LM75A) TOS ításra/olvasásra. Állítás (b'011'=3)
; 2 - 2 bajt adat elküldese (egesz + 3 biten a tört érték ami többnyire 0)
banksel I2C1STAT0
btfss I2C1STAT0,BFRE
goto $-2
; megadni, hogy hany bajt adatot akarok küldeni egymas utan
banksel I2C1CNT ;
movlw 0x3 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
banksel I2C1TXB ;
movwf I2C1TXB ; Szlga címénekelküldése írásra
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
movlw b'00000010' ;
banksel I2C1TXB ; Kiküldöm az LM75A TOS-jának a funkcióválasztását
movwf I2C1TXB ;
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel Adat_H ;
clrf Adat_L ;
movf Adat_H,w ;
banksel I2C1TXB ;
movwf I2C1TXB ; Elküldöm a TOS felső bájtját
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
nop
banksel Adat_L
movf Adat_L,w ;
banksel I2C1TXB ; Elküldöm a TOS alsó bájtját
movwf I2C1TXB ;
nop
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel I2C1STAT0
btfss I2C1STAT0,BFRE
goto $-2
goto i2c1_lm75a_HYS_W_ ;
;-------------------------------------------------------------------
i2c1_lm75a_HYS_R: ; gyari hőfokbeállítás:75C (Alsó érték)
; 1 - Szolga cimzese irasra
; 1 - Pointer (LM75A) TOS ításra/olvasásra állítás (b'011'=3)
; 2 - Cimzes
; 2 - 2 bajt adat elküldese (egesz + 3 biten a tört érték ami többnyire 0)
banksel I2C1STAT0
btfss I2C1STAT0,BFRE
goto $-2
banksel I2C1CON0
bsf I2C1CON0,RSEN ; restart engedélyezése
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C1CNT ;
movlw 0x1 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W = 1
movlw b'10010000' ;
banksel I2C1TXB ; <7:1> szolga cime es <0>=R/!W = 0
movwf I2C1TXB ;
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
; KIKÜLDÜM AZ LM75A POINTER TOS (ALSÓ KAPCSOLÁSI HŐFOK) FUNKCIÓVÁLASZTÁST
movlw b'00000010' ;
banksel I2C1TXB ; T: S kiadása nélkül
movwf I2C1TXB ;
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; Ha 1 = üres, kiürült, akkor tovabb
goto $-2
btfss I2C1CON0,MDR ;
goto $-2 ;
nop
; megadni, hogy hany bajt adatot akarok küldeni egymas utan
banksel I2C1CNT ;
movlw 0x2 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=1
movlw b'10010001' ;
banksel I2C1TXB ; T: S kiadása nélkül
movwf I2C1TXB ; <7:1> szolga cime es <0>=R/!W
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
banksel I2C1STAT1
btfss I2C1STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C1RXB
movf I2C1RXB,w ;
banksel Adat_H ;
movwf Adat_H ;
banksel I2C1CON0 ;
bcf I2C1CON0,RSEN ; restart tiltasa, STOP legyen
banksel I2C1STAT1
btfss I2C1STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C1RXB
movf I2C1RXB,w ;
banksel Adat_L ;
movwf Adat_L ;
nop
banksel I2C1STAT0 ;
btfss I2C1STAT0,BFRE ;
goto $-2
goto i2c1_lm75a_HYS_R_ ;
;--------------------------------------------------------------------
i2c1_lm75a_CONF_W: ; gyari hőfokbeállítás:80C
; 1 - Szolga cimzese írásra
; 1 - Pointer (LM75A) TOS ításra/olvasásra. Állítás (b'001'=1)
; 2 - 2 bajt adat elküldese (egesz + 3 biten a tört érték ami többnyire 0)
banksel I2C1STAT0
btfss I2C1STAT0,BFRE
goto $-2
; megadni, hogy hany bajt adatot akarok küldeni egymas utan
banksel I2C1CNT ;
movlw 0x2 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
banksel I2C1TXB ;
movwf I2C1TXB ; Szlga címénekelküldése írásra
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
movlw b'00000001' ;
banksel I2C1TXB ; Kiküldöm az LM75A CONF-jának a funkcióválasztását
movwf I2C1TXB ;
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel Adat_H ;
clrf Adat_L ;
movf Adat_H,w ;
banksel I2C1TXB ;
movwf I2C1TXB ; Elküldöm a TOS felső bájtját
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel I2C1STAT0
btfss I2C1STAT0,BFRE
goto $-2
goto i2c1_lm75a_CONF_W_ ;
;-------------------------------------------------------------------
i2c1_lm75a_CONF_R: ; gyari beállítás: minden bit = 0
; 1 - Szolga címzése írásra
; 1 - Pointer (LM75A) CONF olvasásra állítás (b'001'=1)
; 2 - RESTART
; 4 - Szolga címzése olvasásra
; 2 - 1 bajt adat fogadása
banksel I2C1STAT0 ;
btfss I2C1STAT0,BFRE ;
goto $-2
bsf I2C1CON0,RSEN ; restart engedélyezése
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C1CNT ;
movlw 0x1 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
; banksel I2C1ADB1 ;
; movwf I2C1ADB1 ;
banksel I2C1TXB ;
movwf I2C1TXB ; <7:1> szolga cime es <0>=R/!W
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
movlw b'00000001' ;
banksel I2C1TXB ;
movwf I2C1TXB ; LM75A POINTER beállítása CONF adatok olvasására
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
btfss I2C1CON0,MDR ;
goto $-2 ;
nop
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C1CNT ;
movlw 0x1 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010001' ;
banksel I2C1TXB ;
movwf I2C1TXB ; <7:1> szolga cime es <0>=R/!W = 1
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
bcf I2C1CON0,RSEN ; RESTART tiltása, STOP legyen
banksel I2C1STAT1
btfss I2C1STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C1RXB
movf I2C1RXB,w ;
banksel Adat_H ;
movwf Adat_H ;
banksel I2C1STAT0
btfss I2C1STAT0,BFRE
goto $-2
goto i2c1_lm75a_CONF_R_
;----------------------------------------------------------------
i2c1_lm75a_PRODUCT_R: ; gyari beállítás: minden bit = 0
; 1 - Szolga címzése írásra
; 1 - Pointer (LM75A) PRODUCT ID olvasásra állítás (b'111'=7)
; 2 - RESTART
; 4 - Szolga címzése olvasásra
; 2 - 1 bajt adat fogadása
banksel I2C1STAT0 ;
btfss I2C1STAT0,BFRE ;
goto $-2
bsf I2C1CON0,RSEN ; restart engedélyezése
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C1CNT ;
movlw 0x1 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
; banksel I2C1ADB1 ;
; movwf I2C1ADB1 ;
banksel I2C1TXB ;
movwf I2C1TXB ; <7:1> szolga cime es <0>=R/!W
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
movlw b'00000001' ;
banksel I2C1TXB ;
movwf I2C1TXB ; LM75A POINTER beállítása CONF adatok olvasására
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
btfss I2C1CON0,MDR ;
goto $-2 ;
nop
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C1CNT ;
movlw 0x1 ;
movwf I2C1CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010001' ;
banksel I2C1TXB ;
movwf I2C1TXB ; <7:1> szolga cime es <0>=R/!W = 1
banksel I2C1STAT1
btfss I2C1STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
bcf I2C1CON0,RSEN ; RESTART tiltása, STOP legyen
banksel I2C1STAT1
btfss I2C1STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C1RXB
movf I2C1RXB,w ;
banksel Adat_H ;
movwf Adat_H ;
banksel I2C1STAT0
btfss I2C1STAT0,BFRE
goto $-2
goto i2c1_lm75a_PRODUCT_R_
;----------------------------------------------------------------
end
VISSZA AZ OLDAL ELEJÉRE
LM75A és PIC18F45K42 I2C2 kommunikációs program
LIST P=PIC18F45K42 ; ISO 8859-2
#include p18f45k42.inc ;
; #include PIC18LF45K42
;
; IMPORTANT: For the PIC18 devices, the __CONFIG directive has been
; superseded by the CONFIG directive. The following settings
; are available for this device.
;
; External Oscillator Selection:
; FEXTOSC = LP LP (crystal oscillator) optimized for 32.768 kHz; PFM set to low power
; FEXTOSC = XT XT (crystal oscillator) above 100 kHz, below 8 MHz; PFM set to medium power
; FEXTOSC = HS HS (crystal oscillator) above 8 MHz; PFM set to high power
; FEXTOSC = RESERVED Reserved (DO NOT USE)
; CONFIG FEXTOSC = OFF ; Oscillator not enabled
; FEXTOSC = ECL EC (external clock) below 100 kHz; PFM set to low power
CONFIG FEXTOSC = ECM ; EC (external clock) for 500 kHz to 8 MHz; PFM set to medium power
; FEXTOSC = ECH EC (external clock) above 8 MHz; PFM set to high power
;
; Reset Oscillator Selection:
; RSTOSC = HFINTOSC_64MHZHFINTOSC with HFFRQ = 64 MHz and CDIV = 1:1
; RSTOSC = RESERVED_1 Reserved
; RSTOSC = EXTOSC_4PLL EXTOSC with 4x PLL, with EXTOSC operating per FEXTOSC bits
; RSTOSC = RESERVED_2 Reserved
; RSTOSC = SOSC Secondary Oscillator
; RSTOSC = LFINTOSC Low-Frequency Oscillator
; CONFIG RSTOSC = HFINTOSC_1MHZHFINTOSC ; with HFFRQ = 4 MHz and CDIV = 4:1
; RSTOSC = EXTOSC EXTOSC operating per FEXTOSC bits (device manufacturing default)
;
; Clock out Enable bit:
; CLKOUTEN = ON CLKOUT function is enabled
; CLKOUTEN = OFF CLKOUT function is disabled
;
; PRLOCKED One-Way Set Enable bit:
; PR1WAY = OFF PRLOCK bit can be set and cleared repeatedly
; CONFIG PR1WAY = ON ; PRLOCK bit can be cleared and set only once
;
; Clock Switch Enable bit:
; CSWEN = OFF The NOSC and NDIV bits cannot be changed by user software
; CSWEN = ON Writing to NOSC and NDIV is allowed
;
; Fail-Safe Clock Monitor Enable bit:
; FCMEN = OFF Fail-Safe Clock Monitor disabled
; FCMEN = ON Fail-Safe Clock Monitor enabled
;
; MCLR Enable bit:
; CONFIG MCLRE = INTMCLR ; If LVP = 0, MCLR pin function is port defined function; If LVP =1, RE3 pin fuction is MCLR
; MCLRE = EXTMCLR If LVP = 0, MCLR pin is MCLR; If LVP = 1, RE3 pin function is MCLR
;
; Power-up timer selection bits:
; PWRTS = PWRT_1 PWRT set at 1ms
; PWRTS = PWRT_16 PWRT set at 16ms
; PWRTS = PWRT_64 PWRT set at 64ms
; PWRTS = PWRT_OFF PWRT is disabled
;
; Multi-vector enable bit:
; CONFIG MVECEN = OFF ; Interrupt contoller does not use vector table to prioritze interrupts
; MVECEN = ON Multi-vector enabled, Vector table used for interrupts
;
; IVTLOCK bit One-way set enable bit:
; IVT1WAY = OFF IVTLOCK bit can be cleared and set repeatedly
; CONFIG IVT1WAY = ON ; IVTLOCK bit can be cleared and set only once
;
; Low Power BOR Enable bit:
; LPBOREN = ON ULPBOR enabled
CONFIG LPBOREN = OFF ; ULPBOR disabled
;
; Brown-out Reset Enable bits:
; BOREN = OFF Brown-out Reset disabled
; BOREN = ON Brown-out Reset enabled according to SBOREN
; BOREN = NOSLP Brown-out Reset enabled while running, disabled in Sleep; SBOREN is ignored
; BOREN = SBORDIS Brown-out Reset enabled , SBOREN bit is ignored
;
; Brown-out Reset Voltage Selection bits:
; BORV = VBOR_2P85 Brown-out Reset Voltage (VBOR) set to 2.8V
; BORV = VBOR_2P7 Brown-out Reset Voltage (VBOR) set to 2.7V
; BORV = VBOR_245 Brown-out Reset Voltage (VBOR) set to 2.45V
; BORV = VBOR_190 Brown-out Reset Voltage (VBOR) set to 1.90V
;
; ZCD Disable bit:
; ZCD = ON ZCD always enabled
; ZCD = OFF ZCD disabled. ZCD can be enabled by setting the ZCDSEN bit of ZCDCON
;
; PPSLOCK bit One-Way Set Enable bit:
; PPS1WAY = OFF PPSLOCK bit can be set and cleared repeatedly (subject to the unlock sequence)
CONFIG PPS1WAY = ON ; PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle
;
; Stack Full/Underflow Reset Enable bit:
; STVREN = OFF Stack full/underflow will not cause Reset
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
;
; Debugger Enable bit:
; DEBUG = ON Background debugger enabled
; DEBUG = OFF Background debugger disabled
;
; Extended Instruction Set Enable bit:
; XINST = ON Extended Instruction Set and Indexed Addressing Mode enabled
CONFIG XINST = OFF ; Extended Instruction Set and Indexed Addressing Mode disabled
;
; WDT Period selection bits:
; WDTCPS = WDTCPS_0 Divider ratio 1:32
; WDTCPS = WDTCPS_1 Divider ratio 1:64
; WDTCPS = WDTCPS_2 Divider ratio 1:128
; WDTCPS = WDTCPS_3 Divider ratio 1:256
; WDTCPS = WDTCPS_4 Divider ratio 1:512
; WDTCPS = WDTCPS_5 Divider ratio 1:1024
; WDTCPS = WDTCPS_6 Divider ratio 1:2048
; WDTCPS = WDTCPS_7 Divider ratio 1:4096
; WDTCPS = WDTCPS_8 Divider ratio 1:8192
; WDTCPS = WDTCPS_9 Divider ratio 1:16384
; WDTCPS = WDTCPS_10 Divider ratio 1:32768
; WDTCPS = WDTCPS_11 Divider ratio 1:65536
; WDTCPS = WDTCPS_12 Divider ratio 1:131072
; WDTCPS = WDTCPS_13 Divider ratio 1:262144
; WDTCPS = WDTCPS_14 Divider ratio 1:524299
; WDTCPS = WDTCPS_15 Divider ratio 1:1048576
; WDTCPS = WDTCPS_16 Divider ratio 1:2097152
; WDTCPS = WDTCPS_17 Divider ratio 1:4194304
; WDTCPS = WDTCPS_18 Divider ratio 1:8388608
; WDTCPS = WDTCPS_19 Divider ratio 1:32
; WDTCPS = WDTCPS_20 Divider ratio 1:32
; WDTCPS = WDTCPS_21 Divider ratio 1:32
; WDTCPS = WDTCPS_22 Divider ratio 1:32
; WDTCPS = WDTCPS_23 Divider ratio 1:32
; WDTCPS = WDTCPS_24 Divider ratio 1:32
; WDTCPS = WDTCPS_25 Divider ratio 1:32
; WDTCPS = WDTCPS_26 Divider ratio 1:32
; WDTCPS = WDTCPS_27 Divider ratio 1:32
; WDTCPS = WDTCPS_28 Divider ratio 1:32
; WDTCPS = WDTCPS_29 Divider ratio 1:32
; WDTCPS = WDTCPS_30 Divider ratio 1:32
; WDTCPS = WDTCPS_31 Divider ratio 1:65536; software control of WDTPS
;
; WDT operating mode:
CONFIG WDTE = OFF ; WDT Disabled; SWDTEN is ignored
; WDTE = SWDTEN WDT enabled/disabled by SWDTEN bit
; WDTE = NSLEEP WDT enabled while sleep=0, suspended when sleep=1; SWDTEN ignored
; WDTE = ON WDT enabled regardless of sleep
;
; WDT Window Select bits:
; WDTCWS = WDTCWS_0 window delay = 87.5; no software control; keyed access required
; WDTCWS = WDTCWS_1 window delay = 75 percent of time; no software control; keyed access required
; WDTCWS = WDTCWS_2 window delay = 62.5 percent of time; no software control; keyed access required
; WDTCWS = WDTCWS_3 window delay = 50 percent of time; no software control; keyed access required
; WDTCWS = WDTCWS_4 window delay = 37.5 percent of time; no software control; keyed access required
; WDTCWS = WDTCWS_5 window delay = 25 percent of time; no software control; keyed access required
; WDTCWS = WDTCWS_6 window always open (100%); no software control; keyed access required
; WDTCWS = WDTCWS_7 window always open (100%); software control; keyed access not required
;
; WDT input clock selector:
; WDTCCS = LFINTOSC WDT reference clock is the 31.0 kHz LFINTOSC
; WDTCCS = MFINTOSC WDT reference clock is the 32kHz MFINTOSC output
; WDTCCS = SOSC WDT reference clock is SOSC
; WDTCCS = SC Software Control
;
; Boot Block Size selection bits:
; BBSIZE = BBSIZE_8192 Boot Block size is 8192 words
; BBSIZE = BBSIZE_4096 Boot Block size is 4096 words
; BBSIZE = BBSIZE_2048 Boot Block size is 2048 words
; BBSIZE = BBSIZE_1024 Boot Block size is 1024 words
; BBSIZE = BBSIZE_512 Boot Block size is 512 words
;
; Boot Block enable bit:
; BBEN = ON Boot block enabled
; BBEN = OFF Boot block disabled
;
; Storage Area Flash enable bit:
; SAFEN = ON SAF enabled
; SAFEN = OFF SAF disabled
;
; Application Block write protection bit:
; WRTAPP = ON Application Block write protected
; WRTAPP = OFF Application Block not write protected
;
; Configuration Register Write Protection bit:
; WRTB = ON Configuration registers (300000-30000Bh) write-protected
; WRTB = OFF Configuration registers (300000-30000Bh) not write-protected
;
; Boot Block Write Protection bit:
; WRTC = ON Boot Block (000000-0007FFh) write-protected
; WRTC = OFF Boot Block (000000-0007FFh) not write-protected
;
; Data EEPROM Write Protection bit:
; WRTD = ON Data EEPROM write-protected
; WRTD = OFF Data EEPROM not write-protected
;
; SAF Write protection bit:
; WRTSAF = ON SAF Write Protected
; WRTSAF = OFF SAF not Write Protected
;
; Low Voltage Programming Enable bit:
CONFIG LVP = OFF ; HV on MCLR/VPP must be used for programming
; LVP = ON Low voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored
;
; PFM and Data EEPROM Code Protection bit:
; CP = ON PFM and Data EEPROM code protection enabled
; CP = OFF PFM and Data EEPROM code protection disabled
;
adat: UDATA_ACS ; H'10' ; nincs kezdo memoriacim megadva az ACCESS ramban
W_TEMP RES 1 ; w register for context saving (ACCESS)
STATUS_TEMP RES 1 ; status used for context saving
BSR_TEMP RES 1 ; bank select used for ISR context saving
_wreg1 res 1 ; Altalanos valtozo
_adatbe res 1 ; I2C-n bejött adat (csak adat) Ez hexa adat!
_szamjegy res 1 ; Kijelzo altal megjelenito 1 darab szamjegy
_kijelzo_jel res 1 ; egy kijelzonek szolo kijelzendo jel
Adat_H res 1 ;{ LM75-bol kiolvasott <D10:D3> hofok hexadesimalisan
Adat_L res 1 ; LM75-bol kiolvasott <D2:D0> hofok hexadesimalisan
; homerseklet adat osszesen <D10:D0> 11 biten tarolodik}
; TB3159 alapjan es 278. old.--tol az adatlap alapjan
; RD0 (19. lab) <--> SDA
; RD1 (20. lab) <--> SCL Katalogus: 6.
ORG 0X0100
nop ;
goto start ;
;----------------------------------PIC18's--------------------------------------
; FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
start:
nop
foprogram:
goto config_I2C2_SSP ;
config_I2C2_:
; ------------------------
movlw d'23'
banksel Adat_H ;
movwf Adat_H ;
clrf Adat_L ;
; -----------
; goto i2c2_lm75a_pointeres_hofok_R ;
i2c2_lm75a_pointeres_hofok_R_:
; goto $
; goto i2c2_lm75a_pointeres_hofok_R ;
; goto i2c2_lm75a_rovid_hofok_R
i2c2_lm75a_rovid_hofok_R_:
; goto $
; goto i2c2_lm75a_rovid_hofok_R
goto i2c2_lm75a_TOS_W ;
i2c2_lm75a_TOS_W_:
; goto $
; goto i2c2_lm75a_TOS_W ;
goto i2c2_lm75a_TOS_R ;
i2c2_lm75a_TOS_R_:
; goto $
; goto i2c2_lm75a_TOS_R ;
movlw d'22'
banksel Adat_H ;
movwf Adat_H ;
clrf Adat_L ;
goto i2c2_lm75a_HYS_W ;
i2c2_lm75a_HYS_W_:
; goto $
goto i2c2_lm75a_HYS_W ;
goto i2c2_lm75a_HYS_R ;
i2c2_lm75a_HYS_R_:
goto $
goto i2c2_lm75a_HYS_R ;
goto i2c2_lm75a_CONF_W ;
i2c2_lm75a_CONF_W_:
goto $
goto i2c2_lm75a_CONF_W ;
goto i2c2_lm75a_CONF_R ;
i2c2_lm75a_CONF_R_:
goto $
goto i2c2_lm75a_CONF_R ;
goto i2c2_lm75a_PRODUCT_R ;
i2c2_lm75a_PRODUCT_R_:
goto $
goto i2c2_lm75a_PRODUCT_R ;
;FOPROGRAM_VEGE_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
; --------------------------------------------------------
; kb.: 113-165
;-------------------------------------------------------------
;-------------------------------------------------------------
config_I2C2_SSP: ; TB3159 alapjan
; TB3159 alapjan es 278. old.--tol az adatlap alapjan
; RD0 (19. lab) <--> SDA
; RD1 (20. lab) <--> SCL Katalogus: 6.
; Letiltjuk globalisan a megszakitasokat
banksel INTCON0
BCF INTCON0,GIE ; letiltjuk globálisan a megszakításokat
; A labalat (RD0 - 19.lab es RD1 - 20.lab) digitalissnak konfiguraljuk
banksel ANSELD ;
bcf ANSELD,ANSELD0 ; { Katalógus 12.old. es
bcf ANSELD,ANSELD1 ; 266. oldal }
; Letiltjuk globalisan a megszakitasokat
banksel INTCON0
bcf INTCON0,GIE ; letiltjuk globálisan a megszakításokat
; PPS UNLOCK szekvencia
banksel PPSLOCK ;
movlw 0x55 ;
movf PPSLOCK ;
movlw 0xAA ;
movf PPSLOCK ;
bcf PPSLOCK,PPSLOCKED ;
; Engedélyezzuk globalisan a megszakitasokat
banksel INTCON0
bsf INTCON0,GIE ; engedélyezzük globálisan a megszakításokat
; Az RD0 - 19.labat az I2C2 modul SDA (adat) portjahoz rendeljuk
movlw b'100100' ;
banksel RD0PPS ;
movwf RD0PPS ; Kat.: 280-281. old
movlw b'011000' ;
banksel I2C2SDAPPS ;
movwf I2C2SDAPPS ; Kat.: 288. old
; Az RD1 labat az I2C2 modul SCL (szinkronjel) portjahoz rendeljuk
movlw b'100011' ;
banksel RD1PPS ;
movwf RD1PPS ; Kat.: 280-281. old
movlw b'011001' ;
banksel I2C2SCLPPS ;
movwf I2C2SCLPPS ; Kat.: 288. old
; Letiltjuk globálisan a megszakításokat
bcf INTCON0,GIE ; letiltjuk globálisan a megszakításokat
; PPS LOCK szekvencia
banksel PPSLOCK ;
movlw 0x55 ;
movf PPSLOCK ;
movlw 0xAA ;
movf PPSLOCK ;
bsf PPSLOCK,PPSLOCKED ;
; Engedélyezzuk globálisan a megszakításokat
bsf INTCON0,GIE ; engedélyezzuk globálisan a megszakításokat
; A ket labat nyitott collektoros kimenette konfiguraljuak
banksel ODCOND ; Kat.: 268. old.
bsf ODCOND,ODCD0 ; { Nyitott kollektorossa
bsf ODCOND,ODCD1 ; allitjuk a ket labat }
; Beallitjuk az I2C szinteket
banksel RD0I2C
bsf RD0I2C,TH0 ; {kat.: 271. oldal
bsf RD0I2C,TH1 ; es lentebb
banksel RD1I2C
bsf RD1I2C,TH0 ; van beallitva
bsf RD1I2C,TH1 ; <TH1:TH0> = <1:0> bit
; Kimenette konfiguraljuk a ket labat
banksel TRISD ;
bcf TRISD,TRISD0 ; Kat.: 264. oldal
bcf TRISD,TRISD1 ;
movlw b'01100001' ; x101xx01 Kat.:271. old
banksel RD0I2C
movwf RD0I2C ; { a labak I2C specifikussa tetele es eros felhuzo
movwf RD1I2C ; ellenallasok bekapcsolasa (SDA es SCL)
; goto config_I2C2_SSP_
;-----------------------------------------------------------------------
config_I2C2:
; I2C2 MESTER MOD INICIALIZALASA (7 bites mester címzéssel):
; ne legyenek megszakitasok az I2C-nel
banksel I2C2PIE ;
clrf I2C2PIE ;
; 4-es uzemmos beallitas (mester 7 bites cimzessel)
banksel I2C2CON0 ;
movlw 0x04 ; Katalogus 577. oldal (<3:0=100 uzemmester mód)
movwf I2C2CON0 ; Megj.: a 3 bites MODE beallitasavala tobbi bit torlodik
; I2C szinkronjel forrása megadasa ( MFINTOSC 500 KHz b'xxxx0011'= 3 )
banksel I2C2CLK ;
movlw 0x3 ; Katalogus 581. old.
movwf I2C2CLK ;
; I2C2CON1 regiszter beállítása:
; ACK for every valid byte (ACKDT = 0)
; NACKs to end a Read (ACKCNT = 1)
; 0. bit <CSD> = 0 :
; 1. bit <TXU> = 0 :
; 2. bit <RXOV> = 0 :
; 3. bit <-> = 0 :
; 4. bit <ACKT> = 0 :
; 5. bit <ACKSTAT> = 0 :
; 6. bit <ACKDT> = 0 :
; 7. bit <ACKCNT> = 1 :
movlw b'10000000' ; 0x80 ;
movwf I2C2CON1 ;
; I2C2CON2 regiszter beállítása:
; Auto-count disabled (ACNT = 0)
; General Call disabled (GCEN = 0)
; Fast mode enabled
; (FME = 1; SCL = I2CCLK/4)
; ADB1 address buffer used (ADB = 0)
; SDA Hold time of 300 ns (SDAHT = 0)
; Bus free time of 16 I2C Clock pulses
; (BFRET = 1)
; 0-1. bit BFRET<1:0> = 01 :
; 2-3. bit SDAHT<3:2> = 00 :
; 4. bit <ADB> = 1 (Megj.: példaprogramban 0, és "S" bittel indul a kommunikáció)
; 5. bit <FME> = 0 : Lassú üzemmód
;(megj.: példaprogramban = 1, ami gyors üzemmód)
; 6. bit <GCEN> = 0 :
; 7. bit <ACNT> = 0 :
movlw b'00010001' ; Példaprogramban 0x21
movwf I2C2CON2 ; 0x11 (Példaprogramban 0x21)
bcf I2C2CON2,FME ;Va: Atallitottam lassu üzemmodra
bsf I2C2CON0,EN ; Bekapcsolom az I2C2 modult
goto config_I2C2_ ; visszatérés
;-------------------------------------------------------------
; LM75A POINTER regiszterének beolvasásá, megnézésre
i2c2_lm75a_rovid_hofok_R: ; EZT TÖRÖLNI MERT ÉRTELMETLEN!!!
nop ;
banksel I2C2STAT0 ;
btfss I2C2STAT0,BFRE
goto $-2
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C2CNT ;
movlw 0x2 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010001' ;
banksel I2C2TXB ; T: S kiadása nélkül- <7:1> szolga cime es <0>=R/!W
movwf I2C2TXB ;
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
banksel I2C2STAT1
btfss I2C2STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C2RXB
movf I2C2RXB,w ;
banksel Adat_H ;
movwf Adat_H ;
banksel I2C2STAT1
btfss I2C2STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C2RXB
movf I2C2RXB,w ;
banksel Adat_L ;
movwf Adat_L ;
nop
banksel I2C2STAT0
btfss I2C2STAT0,BFRE
goto $-2
goto i2c2_lm75a_rovid_hofok_R_
;------------------------------------------------------
i2c2_lm75a_pointeres_hofok_R: ; hosszú, TOS-os változat
banksel I2C2STAT0
btfss I2C2STAT0,BFRE
goto $-2
bsf I2C2CON0,RSEN ; restart engedélyezése
; megadni, hogy hany bajt adatot akarok küldeni restartig
banksel I2C2CNT ;
movlw 0x1 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
; banksel I2C2ADB1 ;
; movwf I2C2ADB1 ; <7:1> szolga cime es <0>=R/!W
banksel I2C2TXB ; T: S kiadása nélkül
movwf I2C2TXB ;
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
; KIKÜLDÜM AZ LM75A POINTER REGISZTERÉNEK A HŐFOK FUNKCIÓVÁLASZTÁST
; --------------------------
movlw b'00000000' ;
banksel I2C2TXB ; T: S kiadása nélkül
movwf I2C2TXB ;
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
;HA AZ ACK JEL MEGJÖN, RESTRTOT KELL KIADNI A MESTRTŐL A SZOLGÁNAK
btfss I2C2CON0,MDR ;
goto $-2 ;
nop
; megadni, hogy hany bajt adatot akarok fogadni egymas utan
banksel I2C2CNT ;
movlw 0x2 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010001' ; 0. bit R/!W=1, 1-7 bit a szolga címe
banksel I2C2TXB ; T: S kiadása nélkül
movwf I2C2TXB ;
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
banksel I2C2STAT1
btfss I2C2STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C2RXB
movf I2C2RXB,w ;
banksel Adat_H ;
movwf Adat_H ;
banksel I2C2CON0 ;
bcf I2C2CON0,RSEN ; restart tiltasa, STOP legyen
banksel I2C2STAT1
btfss I2C2STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C2RXB
movf I2C2RXB,w ;
banksel Adat_L ;
movwf Adat_L ;
nop
banksel I2C2STAT0
btfss I2C2STAT0,BFRE ; várni, míg szabaddá nem válik az I2C busz
goto $-2
goto i2c2_lm75a_pointeres_hofok_R_
;-------------------------------------------------------------------------
i2c2_lm75a_TOS_W: ; gyari hőfokbeállítás:80C
; 1 - Szolga cimzese írásra
; 1 - Pointer (LM75A) TOS ításra/olvasásra. Állítás (b'011'=3)
; 2 - 2 bajt adat elküldese (egesz + 3 biten a tört érték ami többnyire 0)
banksel I2C2STAT0
btfss I2C2STAT0,BFRE
goto $-2
; megadni, hogy hany bajt adatot akarok küldeni egymas utan
banksel I2C2CNT ;
movlw 0x3 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
banksel I2C2TXB ;
movwf I2C2TXB ; Szlga címénekelküldése írásra
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
movlw b'00000011' ;
banksel I2C2TXB ; Kiküldöm az LM75A TOS-jának a funkcióválasztását
movwf I2C2TXB ;
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel Adat_H ;
clrf Adat_L ;
movf Adat_H,w ;
banksel I2C2TXB ;
movwf I2C2TXB ; Elküldöm a TOS felső bájtját
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
nop
banksel Adat_L
movf Adat_L,w ;
banksel I2C2TXB ; Elküldöm a TOS alsó bájtját
movwf I2C2TXB ;
nop
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel I2C2STAT0
btfss I2C2STAT0,BFRE
goto $-2
goto i2c2_lm75a_TOS_W_
;-------------------------------------------------------------
i2c2_lm75a_TOS_R: ; gyari hőfokbeállítás:80C
; 1 - Szolga címzése írásra
; 2 - Pointer (LM75A) TOS ításra/olvasásra állítás (b'011'=3)
; 3 - Restart
; 4 - Szolga cimzese 2 bájt adat olvasására
; 5 - 2 bajt adat fogadása (egesz + 3 magas helyiértékű biten a tört érték)
banksel I2C2CON0
bsf I2C2CON0,RSEN ; restart tiltasa, STOP legyen
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C2CNT ;
movlw 0x1 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
banksel I2C2TXB ;
movwf I2C2TXB ; <7:1> szolga cime es <0>=R/!W --> Elküldés
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
movlw b'00000011' ;
banksel I2C2TXB ;
movwf I2C2TXB ; LM75A TOS-jának funkcióválasztás --> Elküldés
banksel I2C2STAT1 ;
btfss I2C2STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel I2C2CON0 ;
btfss I2C2CON0,MDR ;
goto $-2 ;
; RESTART foga majd következni
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C2CNT ;
movlw 0x2 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010001' ;
banksel I2C2TXB ;
movwf I2C2TXB ; <7:1> szolga cime es <0>=R/!W
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
banksel I2C2STAT1
btfss I2C2STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C2RXB
movf I2C2RXB,w ;
banksel Adat_H ;
movwf Adat_H ;
banksel I2C2CON0;
bcf I2C2CON0,RSEN ; restart tiltasa, STOP legyen
banksel I2C2STAT1
btfss I2C2STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C2RXB
movf I2C2RXB,w ;
banksel Adat_L ;
movwf Adat_L ;
nop
banksel I2C2STAT0
btfss I2C2STAT0,BFRE
goto $-2
goto i2c2_lm75a_TOS_R_
;----------------------------------------------------------------
i2c2_lm75a_HYS_W: ; gyari hőfokbeállítás:80C
; 1 - Szolga cimzese írásra
; 1 - Pointer (LM75A) TOS ításra/olvasásra. Állítás (b'011'=3)
; 2 - 2 bajt adat elküldese (egesz + 3 biten a tört érték ami többnyire 0)
banksel I2C2STAT0
btfss I2C2STAT0,BFRE
goto $-2
; megadni, hogy hany bajt adatot akarok küldeni egymas utan
banksel I2C2CNT ;
movlw 0x3 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
banksel I2C2TXB ;
movwf I2C2TXB ; Szlga címénekelküldése írásra
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
movlw b'00000010' ;
banksel I2C2TXB ; Kiküldöm az LM75A TOS-jának a funkcióválasztását
movwf I2C2TXB ;
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel Adat_H ;
clrf Adat_L ;
movf Adat_H,w ;
banksel I2C2TXB ;
movwf I2C2TXB ; Elküldöm a TOS felső bájtját
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
nop
banksel Adat_L
movf Adat_L,w ;
banksel I2C2TXB ; Elküldöm a TOS alsó bájtját
movwf I2C2TXB ;
nop
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel I2C2STAT0
btfss I2C2STAT0,BFRE
goto $-2
goto i2c2_lm75a_HYS_W_ ;
;-------------------------------------------------------------------
i2c2_lm75a_HYS_R: ; gyari hőfokbeállítás:75C (Alsó érték)
; 1 - Szolga cimzese irasra
; 1 - Pointer (LM75A) TOS ításra/olvasásra állítás (b'011'=3)
; 2 - Cimzes
; 2 - 2 bajt adat elküldese (egesz + 3 biten a tört érték ami többnyire 0)
banksel I2C2STAT0
btfss I2C2STAT0,BFRE
goto $-2
banksel I2C2CON0
bsf I2C2CON0,RSEN ; restart engedélyezése
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C2CNT ;
movlw 0x1 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W = 1
movlw b'10010000' ;
banksel I2C2TXB ; <7:1> szolga cime es <0>=R/!W = 0
movwf I2C2TXB ;
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
; KIKÜLDÜM AZ LM75A POINTER TOS (ALSÓ KAPCSOLÁSI HŐFOK) FUNKCIÓVÁLASZTÁST
movlw b'00000010' ;
banksel I2C2TXB ; T: S kiadása nélkül
movwf I2C2TXB ;
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; Ha 1 = üres, kiürült, akkor tovabb
goto $-2
btfss I2C2CON0,MDR ;
goto $-2 ;
nop
; megadni, hogy hany bajt adatot akarok küldeni egymas utan
banksel I2C2CNT ;
movlw 0x2 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=1
movlw b'10010001' ;
banksel I2C2TXB ; T: S kiadása nélkül
movwf I2C2TXB ; <7:1> szolga cime es <0>=R/!W
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
banksel I2C2STAT1
btfss I2C2STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C2RXB
movf I2C2RXB,w ;
banksel Adat_H ;
movwf Adat_H ;
banksel I2C2CON0 ;
bcf I2C2CON0,RSEN ; restart tiltasa, STOP legyen
banksel I2C2STAT1
btfss I2C2STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C2RXB
movf I2C2RXB,w ;
banksel Adat_L ;
movwf Adat_L ;
nop
banksel I2C2STAT0 ;
btfss I2C2STAT0,BFRE ;
goto $-2
goto i2c2_lm75a_HYS_R_ ;
;--------------------------------------------------------------------
i2c2_lm75a_CONF_W: ; gyari hőfokbeállítás:80C
; 1 - Szolga cimzese írásra
; 1 - Pointer (LM75A) TOS ításra/olvasásra. Állítás (b'001'=1)
; 2 - 2 bajt adat elküldese (egesz + 3 biten a tört érték ami többnyire 0)
banksel I2C2STAT0
btfss I2C2STAT0,BFRE
goto $-2
; megadni, hogy hany bajt adatot akarok küldeni egymas utan
banksel I2C2CNT ;
movlw 0x2 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
banksel I2C2TXB ;
movwf I2C2TXB ; Szlga címénekelküldése írásra
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
movlw b'00000001' ;
banksel I2C2TXB ; Kiküldöm az LM75A CONF-jának a funkcióválasztását
movwf I2C2TXB ;
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel Adat_H ;
clrf Adat_L ;
movf Adat_H,w ;
banksel I2C2TXB ;
movwf I2C2TXB ; Elküldöm a TOS felső bájtját
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
banksel I2C2STAT0
btfss I2C2STAT0,BFRE
goto $-2
goto i2c2_lm75a_CONF_W_ ;
;-------------------------------------------------------------------
i2c2_lm75a_CONF_R: ; gyari beállítás: minden bit = 0
; 1 - Szolga címzése írásra
; 1 - Pointer (LM75A) CONF olvasásra állítás (b'001'=1)
; 2 - RESTART
; 4 - Szolga címzése olvasásra
; 2 - 1 bajt adat fogadása
banksel I2C2STAT0 ;
btfss I2C2STAT0,BFRE ;
goto $-2
bsf I2C2CON0,RSEN ; restart engedélyezése
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C2CNT ;
movlw 0x1 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
; banksel I2C2ADB1 ;
; movwf I2C2ADB1 ;
banksel I2C2TXB ;
movwf I2C2TXB ; <7:1> szolga cime es <0>=R/!W
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
movlw b'00000001' ;
banksel I2C2TXB ;
movwf I2C2TXB ; LM75A POINTER beállítása CONF adatok olvasására
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
btfss I2C2CON0,MDR ;
goto $-2 ;
nop
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C2CNT ;
movlw 0x1 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010001' ;
banksel I2C2TXB ;
movwf I2C2TXB ; <7:1> szolga cime es <0>=R/!W = 1
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
bcf I2C2CON0,RSEN ; RESTART tiltása, STOP legyen
banksel I2C2STAT1
btfss I2C2STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C2RXB
movf I2C2RXB,w ;
banksel Adat_H ;
movwf Adat_H ;
banksel I2C2STAT0
btfss I2C2STAT0,BFRE
goto $-2
goto i2c2_lm75a_CONF_R_
;----------------------------------------------------------------
i2c2_lm75a_PRODUCT_R: ; gyari beállítás: minden bit = 0
; 1 - Szolga címzése írásra
; 1 - Pointer (LM75A) PRODUCT ID olvasásra állítás (b'111'=7)
; 2 - RESTART
; 4 - Szolga címzése olvasásra
; 2 - 1 bajt adat fogadása
banksel I2C2STAT0 ;
btfss I2C2STAT0,BFRE ;
goto $-2
bsf I2C2CON0,RSEN ; restart engedélyezése
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C2CNT ;
movlw 0x1 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010000' ;
; banksel I2C2ADB1 ;
; movwf I2C2ADB1 ;
banksel I2C2TXB ;
movwf I2C2TXB ; <7:1> szolga cime es <0>=R/!W
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
movlw b'00000001' ;
banksel I2C2TXB ;
movwf I2C2TXB ; LM75A POINTER beállítása CONF adatok olvasására
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; Ha 1= üres, kiürült, akkor tovabb
goto $-2
btfss I2C2CON0,MDR ;
goto $-2 ;
nop
; megadni, hogy hany bajt adatot akarok küldeni vagy fogadni egymas utan
banksel I2C2CNT ;
movlw 0x1 ;
movwf I2C2CNT ;
;A szolga cime: LM75A cimenek megadasa eszkoz:1001, hardverelem:000 R/!W=x
movlw b'10010001' ;
banksel I2C2TXB ;
movwf I2C2TXB ; <7:1> szolga cime es <0>=R/!W = 1
banksel I2C2STAT1
btfss I2C2STAT1,TXBE ; vár míg kimegy az adat ami most csak a cím
goto $-2 ;
bcf I2C2CON0,RSEN ; RESTART tiltása, STOP legyen
banksel I2C2STAT1
btfss I2C2STAT1,RXBF ; { Ha 1, akkor mar van benne bejott adat,
goto $-2 ; így tovabb kiolvasasra }
banksel I2C2RXB
movf I2C2RXB,w ;
banksel Adat_H ;
movwf Adat_H ;
banksel I2C2STAT0
btfss I2C2STAT0,BFRE
goto $-2
goto i2c2_lm75a_PRODUCT_R_
;----------------------------------------------------------------
end
VISSZA AZ OLDAL ELEJÉRE