📄 pic12i2c.lst
字号:
00145
00146
00147 ;******* Set up output data (control, address, or data) and counter ********
00148 ;***************************************************************************
002B 00149 PREP_TRANSFER_BYTE
002B 003D 00150 MOVWF EEBYTE ; Byte to transfer to EEPROM already in W
002C 0C08 00151 MOVLW .8 ; Counter to transfer 8 bits
002D 003E 00152 MOVWF COUNTER
00153 #ifdef EMULATED
00154 movlw 0x00 ; make sure both are outputs
00155 tris I2C_PORT
00156 #endif
00157
00158
00159 ;************ Clock out data (control, address, or data) byte ************
00160 ;***************************************************************************
002E 00161 OUTPUT_BYTE
002E 04E6 00162 BCF I2C_PORT,SCL ; Set clock low during data set-up
002F 037D 00163 RLF EEBYTE, F ; Rotate left, high order bit into carry bit
0030 04C6 00164 BCF I2C_PORT,SDA ; Set data low, if rotated carry bit is
0031 0603 00165 SKPNC ; a '1', then:
0032 05C6 00166 BSF I2C_PORT,SDA ; reset data pin to a one, otherwise leave low
0033 0000 00167 NOP
0034 05E6 00168 BSF I2C_PORT,SCL ; clock data into EEPROM
0035 02FE 00169 DECFSZ COUNTER, F ; Repeat until entire byte is sent
0036 0A2E 00170 GOTO OUTPUT_BYTE
0037 0000 00171 NOP
00172
00173 ;************************** Acknowledge Check *****************************
00174 ;***************************************************************************
0038 04E6 00175 BCF I2C_PORT,SCL ; Set SCL low, 0.5us < ack valid < 3us
0039 0000 00176 NOP
003A 05C6 00177 BSF I2C_PORT,SDA
00178 #ifdef EMULATED
00179 movlw (0x01 << SDA) ; make SDA an input
00180 tris I2C_PORT
00181 #endif
003B 0A3C 00182 GOTO $+1 ; May be necessary for SCL Tlow at low voltage,
003C 05E6 00183 BSF I2C_PORT,SCL ; Raise SCL, EEPROM acknowledge still valid
003D 06C6 00184 BTFSC I2C_PORT,SDA ; Check SDA for acknowledge (low)
003E 04FA 00185 BCF PC_OFFSET,EE_OK ; If SDA not low (no ack), set error flag
003F 04E6 00186 BCF I2C_PORT,SCL ; Lower SCL, EEPROM release bus
0040 07FA 00187 BTFSS PC_OFFSET,EE_OK ; If no error continue, else stop bit
0041 0A69 00188 GOTO STOP_BIT
00189 #ifdef EMULATED
00190 movlw 0x00 ; SDA back to an output
00191 tris I2C_PORT
00192 #endif
00193
00194
MPASM 03.00 Released PIC12I2C.ASM 4-19-2002 17:00:20 PAGE 6
PIC with Flash EE data memory Interface
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00195 ;***** Set up program counter offset, based on EEPROM operating mode *****
00196 ;***************************************************************************
0042 021A 00197 MOVF PC_OFFSET,W
0043 0E0F 00198 ANDLW B'00001111'
0044 01E2 00199 ADDWF PCL, F
0045 0A4C 00200 GOTO INIT_ADDRESS ;PC offset=0, write control done, send address
0046 0A4F 00201 GOTO INIT_WRITE_DATA ;PC offset=1, write address done, send data
0047 0A69 00202 GOTO STOP_BIT ;PC offset=2, write done, send stop bit
0048 0A4C 00203 GOTO INIT_ADDRESS ;PC offset=3, write control done, send address
0049 0A52 00204 GOTO INIT_READ_CONTROL ;PC offset=4, send read control
004A 0A58 00205 GOTO READ_BIT_COUNTER ;PC offset=5, set counter and read byte
004B 0A69 00206 GOTO STOP_BIT ;PC offset=6, random read done, send stop
00207
00208
00209 ;********** Initalize EEPROM data (address, data, or control) bytes ******
00210 ;***************************************************************************
004C 00211 INIT_ADDRESS
004C 02BA 00212 INCF PC_OFFSET, F ; Increment PC offset to 2 (write) or to 4 (read)
004D 021B 00213 MOVF EEADDR,W ; Put EEPROM address in W, ready to send to EEPROM
004E 0A2B 00214 GOTO PREP_TRANSFER_BYTE
00215
00216
004F 00217 INIT_WRITE_DATA
004F 02BA 00218 INCF PC_OFFSET, F ; Increment PC offset to go to STOP_BIT next
0050 021C 00219 MOVF EEDATA,W ; Put EEPROM data in W, ready to send to EEPROM
0051 0A2B 00220 GOTO PREP_TRANSFER_BYTE
00221
0052 00222 INIT_READ_CONTROL
0052 05E6 00223 BSF I2C_PORT,SCL ; Raise SCL
0053 0000 00224 nop
0054 05C6 00225 BSF I2C_PORT,SDA ; raise SDA
0055 02BA 00226 INCF PC_OFFSET, F ; Increment PC offset to go to READ_BIT_COUNTER next
0056 0CA1 00227 MOVLW B'10100001' ; Set up read control byte, ready to send to EEPROM
0057 0A2A 00228 GOTO START_BIT ; bit 0 = '1' for read operation
00229
00230
00231 ;************************** Read EEPROM data *****************************
00232 ;***************************************************************************
0058 00233 READ_BIT_COUNTER
0058 05C6 00234 BSF I2C_PORT,SDA
0059 0000 00235 NOP
005A 05E6 00236 BSF I2C_PORT,SCL ; set data bit to 1 so we're not pulling bus down.
005B 0C08 00237 MOVLW .8 ; Set counter so 8 bits will be read into EEDATA
005C 003E 00238 MOVWF COUNTER
00239 #ifdef EMULATED
00240 movlw (0x01 << SDA)
00241 tris I2C_PORT
00242 #endif
00243
005D 00244 READ_BYTE
005D 05E6 00245 BSF I2C_PORT,SCL ; Raise SCL, SDA valid. SDA still input from ack
005E 0503 00246 SETC ; Assume bit to be read = 1
005F 07C6 00247 BTFSS I2C_PORT,SDA ; Check if SDA = 1
MPASM 03.00 Released PIC12I2C.ASM 4-19-2002 17:00:20 PAGE 7
PIC with Flash EE data memory Interface
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0060 0403 00248 CLRC ; if SDA not = 1 then clear carry bit
0061 037C 00249 RLF EEDATA, F ; rotate carry bit (=SDA) into EEDATA;
0062 04E6 00250 BCF I2C_PORT,SCL ; Lower SCL
0063 05C6 00251 BSF I2C_PORT,SDA ; reset SDA
0064 02FE 00252 DECFSZ COUNTER, F ; Decrement counter
0065 0A5D 00253 GOTO READ_BYTE ; Read next bit if not finished reading byte
00254
0066 05E6 00255 BSF I2C_PORT,SCL
0067 0000 00256 NOP
0068 04E6 00257 BCF I2C_PORT,SCL
00258 ;****************** Generate a STOP bit and RETURN ***********************
00259 ;***************************************************************************
0069 00260 STOP_BIT
00261 #ifdef EMULATED
00262 movlw 0x00 ; set SDA as output
00263 tris I2C_PORT
00264 #endif
0069 04C6 00265 BCF I2C_PORT,SDA ; SDA=0, on TRIS, to prepare for transition to '1'
006A 05E6 00266 BSF I2C_PORT,SCL ; SCL = 1 to prepare for STOP bit
006B 0A6C 00267 GOTO $+1 ; 4 NOPs neccessary for I2C spec Tsu:sto = 4.7us
006C 0A6D 00268 GOTO $+1
006D 05C6 00269 BSF I2C_PORT,SDA ; Stop bit, SDA transition to '1' while SCL high
00270
006E 07FA 00271 BTFSS PC_OFFSET,EE_OK ; Check for error
006F 0800 00272 RETLW NO ; if error, send back NO
0070 0801 00273 RETLW OK ; if no error, send back OK
00274
00275 ;Note: SDA and SCL still being driven by master, both set to outputs.
00276 ;****************************************************************************
00277 ;************************ End EEPROM Subroutines **************************
00278
00068
00069 END
MPASM 03.00 Released PIC12I2C.ASM 4-19-2002 17:00:20 PAGE 8
PIC with Flash EE data memory Interface
SYMBOL TABLE
LABEL VALUE
C 00000000
COUNTER 0000001E
DC 00000001
EEADDR 0000001B
EEBYTE 0000001D
EEDATA 0000001C
EE_OK 00000007
F 00000001
FSR 00000004
GPIO 00000006
GPWUF 00000007
I2C_PORT 00000006
INDF 00000000
INIT_ADDRESS 0000004C
INIT_READ_CONTROL 00000052
INIT_WRITE_CONTROL 00000028
INIT_WRITE_DATA 0000004F
NO 00000000
NOT_GPPU 00000006
NOT_GPWU 00000007
NOT_PD 00000003
NOT_TO 00000004
OK 00000001
OSCCAL 00000005
OUTPUT_BYTE 0000002E
PA0 00000005
PCL 00000002
PC_OFFSET 0000001A
PREP_TRANSFER_BYTE 0000002B
PS0 00000000
PS1 00000001
PS2 00000002
PSA 00000003
READ_BIT_COUNTER 00000058
READ_BYTE 0000005D
READ_CURRENT 00000022
READ_RANDOM 00000027
SCL 00000007
SDA 00000006
START_BIT 0000002A
STATUS 00000003
STOP_BIT 00000069
T0CS 00000005
T0SE 00000004
TMR0 00000001
W 00000000
WRITE_BYTE 00000025
Z 00000002
_CP_OFF 00000FFF
_CP_ON 00000FF7
_ExtRC_OSC 00000FFF
_IntRC_OSC 00000FFE
_LP_OSC 00000FFC
MPASM 03.00 Released PIC12I2C.ASM 4-19-2002 17:00:20 PAGE 9
PIC with Flash EE data memory Interface
SYMBOL TABLE
LABEL VALUE
_MCLRE_OFF 00000FEF
_MCLRE_ON 00000FFF
_WDT_OFF 00000FFB
_WDT_ON 00000FFF
_XT_OSC 00000FFD
__12CE518 00000001
count 00000011
loop 00000005
loop1 00000018
result 00000010
serout 00000016
start 00000001
wait1 0000000A
wait2 00000012
MEMORY USAGE MAP ('X' = Used, '-' = Unused)
0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX X---------------
All other memory blocks unused.
Program Memory Words Used: 113
Program Memory Words Free: 399
Errors : 0
Warnings : 1 reported, 0 suppressed
Messages : 0 reported, 0 suppressed
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -