0001 ******************************** 0002 * PROGRAM FOR TESTING 0003 * THE PCF8584 I2C INTERFACE 0004 * CONNECTED TO A DS1307 RTC 0005 * TIME CAN BE SET AND READ 0006 * FROM THE DS1307 0007 * BY: DANIEL TUFVESSON 2015 0008 ******************************** 0009 0010 c000 RETURN EQU $C000 RETURN TO PROMPT 0011 c003 OUTCHAR EQU $C003 OUTPUT CHAR ON CONSOLE 0012 c006 INCHAR EQU $C006 INPUT CHAR FROM CONSOLE AND ECHO 0013 c009 PDATA EQU $C009 PRINT TEXT STRING @ X ENDED BY $04 0014 c012 OUT2HS EQU $C012 PRINT 2 HEX CHARS @ X 0015 c01b INBYTE EQU $C01B INPUT 1 BYTE TO A. CARRY SET = OK 0016 c01e BADDR EQU $C01E INPUT ADDRESS TO X. CARRY SET = OK 0017 c021 PCRLF EQU $C021 PRINT CRLF 0018 c024 OUTS EQU $C024 PRINT SPACE 0019 0020 7fe5 CONSVEC EQU $7FE5 CONSOLE STATUS VECTOR 0021 7fe8 CONOVEC EQU $7FE8 CONSOLE OUTPUT VECTOR 0022 7feb CONIVEC EQU $7FEB CONSOLE INPUT VECTOR 0023 0024 0002 PAGEREG EQU $0002 I/O PAGE SELECT REGISTER 0025 0026 * 0027 * PCF8584 REGISTERS 0028 * 0029 8050 P8584 EQU $8050 0030 8050 P8584SX EQU P8584+0 0031 8051 P8584S1 EQU P8584+1 0032 0033 * 0034 * I2C DEVICES 0035 * 0036 0068 RTCADDR EQU $68 0037 0038 * 0039 * PROGRAM BEGIN HERE 0040 * 0041 0100 ORG $0100 0042 0100 7e 02 06 JMP START 0043 0103 28 53 29 45 54 20 TXSTART FCC '(S)ET OR (G)ET TIME?' 4f 52 20 28 47 29 45 54 20 54 49 4d 45 3f 0044 0117 04 FCB $04 0045 0118 0a 0d TXSEC FCB $0A,$0D 0046 011a 53 45 43 4f 4e 44 FCC 'SECONDS [00-59]' 53 20 5b 30 30 2d 35 39 5d 0047 0129 0a 0d 04 FCB $0A,$0D,$04 0048 012c 0a 0d TXMIN FCB $0A,$0D 0049 012e 4d 49 4e 55 54 45 FCC 'MINUTES [00-59]' 53 20 5b 30 30 2d 35 39 5d 0050 013d 0a 0d 04 FCB $0A,$0D,$04 0051 0140 0a 0d TXHOU FCB $0A,$0D 0052 0142 48 4f 55 52 53 20 FCC 'HOURS [00-23]' 5b 30 30 2d 32 33 5d 0053 014f 0a 0d 04 FCB $0A,$0D,$04 0054 0152 0a 0d TXDAY FCB $0A,$0D 0055 0154 44 41 59 20 4f 46 FCC 'DAY OF WEEK [01-07, MON=01 SUN=07]' 20 57 45 45 4b 20 5b 30 31 2d 30 37 2c 20 4d 4f 4e 3d 30 31 20 53 55 4e 3d 30 37 5d 0056 0176 0a 0d 04 FCB $0A,$0D,$04 0057 0179 0a 0d TXDAT FCB $0A,$0D 0058 017b 44 41 54 45 20 5b FCC 'DATE [01-31]' 30 31 2d 33 31 5d 0059 0187 0a 0d 04 FCB $0A,$0D,$04 0060 018a 0a 0d TXMON FCB $0A,$0D 0061 018c 4d 4f 4e 54 48 20 FCC 'MONTH [01-12]' 5b 30 31 2d 31 32 5d 0062 0199 0a 0d 04 FCB $0A,$0D,$04 0063 019c 0a 0d TXYEA FCB $0A,$0D 0064 019e 59 45 41 52 20 5b FCC 'YEAR [0000-9999]' 30 30 30 30 2d 39 39 39 39 5d 0065 01ae 0a 0d 04 FCB $0A,$0D,$04 0066 01b1 0a 0d TXCOR FCB $0A,$0D 0067 01b3 43 4f 52 52 45 43 FCC 'CORRECT? [CR=YES]' 54 3f 20 5b 43 52 3d 59 45 53 5d 0068 01c4 0a 0d 04 FCB $0A,$0D,$04 0069 01c7 0a 0d TXABO FCB $0A,$0D 0070 01c9 41 42 4f 52 54 45 FCC 'ABORTED' 44 0071 01d0 0a 0d 04 FCB $0A,$0D,$04 0072 01d3 0a 0d TXSET FCB $0A,$0D 0073 01d5 54 49 4d 45 20 53 FCC 'TIME SET' 45 54 0074 01dd 0a 0d 04 FCB $0A,$0D,$04 0075 0076 01e0 4d 4f 4e TXDAYS FCC 'MON' 0077 01e3 04 FCB $04 0078 01e4 54 55 45 FCC 'TUE' 0079 01e7 04 FCB $04 0080 01e8 57 45 44 FCC 'WED' 0081 01eb 04 FCB $04 0082 01ec 54 48 55 FCC 'THU' 0083 01ef 04 FCB $04 0084 01f0 46 52 49 FCC 'FRI' 0085 01f3 04 FCB $04 0086 01f4 53 41 54 FCC 'SAT' 0087 01f7 04 FCB $04 0088 01f8 53 55 4e FCC 'SUN' 0089 01fb 04 FCB $04 0090 0091 01fc BUFF RMB 10 0092 0093 0206 ce 01 03 START LDX #TXSTART 0094 0209 bd c0 09 JSR PDATA 0095 020c bd 7f eb JSR CONIVEC 0096 020f 84 df ANDA #$DF 0097 0211 81 47 CMPA #'G 0098 0213 27 0d BEQ LOOP 0099 0215 81 53 CMPA #'S 0100 0217 27 03 BEQ *+5 0101 0219 7e c0 00 JMP RETURN 0102 021c bd 02 d0 JSR RTCSET 0103 021f bd c0 21 JSR PCRLF 0104 0222 bd 02 a8 LOOP JSR RTCGET 0105 0225 b6 01 fc LDAA BUFF 0106 0228 b1 02 05 CMPA BUFF+9 0107 022b 27 f5 BEQ LOOP 0108 022d b7 02 05 STAA BUFF+9 0109 0230 86 0d LDAA #$0D 0110 0232 bd c0 03 JSR OUTCHAR 0111 0235 bd c0 24 JSR OUTS 0112 0238 b6 01 ff LDAA BUFF+3 CALC DAY NAME 0113 023b 4a DECA 0114 023c c6 04 LDAB #4 0115 023e 3d MUL 0116 023f ce 01 e0 LDX #TXDAYS 0117 0242 3a ABX 0118 0243 bd c0 09 JSR PDATA DAY 0119 0246 bd c0 24 JSR OUTS 0120 0249 ce 02 04 LDX #BUFF+8 0121 024c bd c0 12 JSR OUT2HS CENTURY 0122 024f 09 DEX 0123 0250 09 DEX 0124 0251 09 DEX 0125 0252 86 08 LDAA #$08 0126 0254 bd c0 03 JSR OUTCHAR 0127 0257 bd c0 12 JSR OUT2HS YEAR 0128 025a 09 DEX 0129 025b 09 DEX 0130 025c 86 08 LDAA #$08 0131 025e bd c0 03 JSR OUTCHAR 0132 0261 86 2d LDAA #'- 0133 0263 bd c0 03 JSR OUTCHAR 0134 0266 bd c0 12 JSR OUT2HS MONTH 0135 0269 09 DEX 0136 026a 09 DEX 0137 026b 86 08 LDAA #$08 0138 026d bd c0 03 JSR OUTCHAR 0139 0270 86 2d LDAA #'- 0140 0272 bd c0 03 JSR OUTCHAR 0141 0275 bd c0 12 JSR OUT2HS DATE 0142 0278 09 DEX 0143 0279 09 DEX 0144 027a 09 DEX 0145 027b bd c0 12 JSR OUT2HS HOURS 0146 027e 09 DEX 0147 027f 09 DEX 0148 0280 86 08 LDAA #$08 0149 0282 bd c0 03 JSR OUTCHAR 0150 0285 86 3a LDAA #': 0151 0287 bd c0 03 JSR OUTCHAR 0152 028a bd c0 12 JSR OUT2HS MINUTES 0153 028d 09 DEX 0154 028e 09 DEX 0155 028f 86 08 LDAA #$08 0156 0291 bd c0 03 JSR OUTCHAR 0157 0294 86 3a LDAA #': 0158 0296 bd c0 03 JSR OUTCHAR 0159 0299 bd c0 12 JSR OUT2HS SECONDS 0160 029c bd 7f e5 JSR CONSVEC 0161 029f 4d TSTA 0162 02a0 27 80 BEQ LOOP 0163 02a2 bd 7f eb JSR CONIVEC 0164 02a5 7e c0 00 JMP RETURN 0165 0166 * 0167 * RTC GET TIME 0168 * 0169 02a8 86 00 RTCGET LDAA #$00 0170 02aa 97 02 STAA PAGEREG 0171 02ac bd 03 6e JSR I2CINIT INIT PCF8584 0172 02af c6 68 LDAB #RTCADDR 0173 02b1 bd 03 c3 JSR I2CWRIT START WRITE 0174 02b4 4f CLRA 0175 02b5 b7 01 fc STAA BUFF 0176 02b8 ce 01 fc LDX #BUFF 0177 02bb 5f CLRB BYTES TO SEND 0178 02bc bd 04 09 JSR I2CTX SEND ADDRESS 0179 02bf c6 68 LDAB #RTCADDR 0180 02c1 bd 03 93 JSR I2CREAD START READ 0181 02c4 c6 08 LDAB #8 READ 9 BYTES 0182 02c6 ce 01 fc LDX #BUFF 0183 02c9 bd 03 e9 JSR I2CRX READ BYTES 0184 02cc bd 03 de JSR I2CSTOP STOP TRANSMISSION 0185 02cf 39 RTS 0186 0187 * 0188 * RTC SET TIME 0189 * 0190 02d0 ce 01 9c RTCSET LDX #TXYEA READ YEAR 0191 02d3 bd c0 09 JSR PDATA 0192 02d6 bd c0 1e JSR BADDR 0193 02d9 18 XGDX 0194 02da b7 02 04 STAA BUFF+8 0195 02dd f7 02 02 STAB BUFF+6 0196 02e0 ce 01 8a LDX #TXMON READ MONTH 0197 02e3 bd c0 09 JSR PDATA 0198 02e6 bd c0 1b JSR INBYTE 0199 02e9 84 1f ANDA #%00011111 0200 02eb b7 02 01 STAA BUFF+5 0201 02ee ce 01 79 LDX #TXDAT READ DATE 0202 02f1 bd c0 09 JSR PDATA 0203 02f4 bd c0 1b JSR INBYTE 0204 02f7 84 3f ANDA #%00111111 0205 02f9 b7 02 00 STAA BUFF+4 0206 02fc ce 01 52 LDX #TXDAY READ DAY OF WEEK 0207 02ff bd c0 09 JSR PDATA 0208 0302 bd c0 1b JSR INBYTE 0209 0305 84 07 ANDA #%00000111 0210 0307 b7 01 ff STAA BUFF+3 0211 030a ce 01 40 LDX #TXHOU READ HOURS 0212 030d bd c0 09 JSR PDATA 0213 0310 bd c0 1b JSR INBYTE 0214 0313 84 3f ANDA #%00111111 0215 0315 b7 01 fe STAA BUFF+2 0216 0318 ce 01 2c LDX #TXMIN READ MINUTES 0217 031b bd c0 09 JSR PDATA 0218 031e bd c0 1b JSR INBYTE 0219 0321 84 7f ANDA #%01111111 0220 0323 b7 01 fd STAA BUFF+1 0221 0326 ce 01 18 LDX #TXSEC READ SECONDS 0222 0329 bd c0 09 JSR PDATA 0223 032c bd c0 1b JSR INBYTE 0224 032f 84 7f ANDA #%01111111 0225 0331 b7 01 fc STAA BUFF 0226 0334 7f 02 03 CLR BUFF+7 CONFIG REG 0227 0337 ce 01 b1 LDX #TXCOR ENTRY CORRECT? 0228 033a bd c0 09 JSR PDATA 0229 033d bd 7f eb JSR CONIVEC 0230 0340 81 0d CMPA #$0D 0231 0342 27 08 BEQ RTCSETW 0232 0344 ce 01 c7 LDX #TXABO ABORT 0233 0347 bd c0 09 JSR PDATA 0234 034a 20 21 BRA RTCSETE 0235 * WRITE DATA TO RTC 0236 034c 86 00 RTCSETW LDAA #$00 0237 034e 97 02 STAA PAGEREG 0238 0350 bd 03 6e JSR I2CINIT INIT PCF8584 0239 0353 c6 68 LDAB #RTCADDR 0240 0355 bd 03 c3 JSR I2CWRIT START WRITE 0241 0358 7f 02 05 CLR BUFF+9 0242 035b ce 02 05 LDX #BUFF+9 0243 035e 5f CLRB 0244 035f bd 04 09 JSR I2CTX SEND ADDRESS 0245 0362 ce 01 fc LDX #BUFF 0246 0365 c6 08 LDAB #8 WRITE 9 BYTES 0247 0367 bd 04 09 JSR I2CTX 0248 036a bd 03 de JSR I2CSTOP 0249 036d 39 RTCSETE RTS 0250 0251 * 0252 * INIT PCF8584 0253 * 0254 036e 86 80 I2CINIT LDAA #$80 PIN - SX = OWN ADDRESS 0255 0370 b7 80 51 STAA P8584S1 0256 0257 0373 86 55 LDAA #$55 OWN ADDRESS 0258 0375 b7 80 50 STAA P8584SX 0259 0260 0378 86 a0 LDAA #$A0 PIN+ES1 - SX = CLOCK REGISTER 0261 037a b7 80 51 STAA P8584S1 0262 0263 037d 86 00 LDAA #$00 3MHz, 90kHz 0264 037f b7 80 50 STAA P8584SX 0265 0266 0382 86 c1 LDAA #$C1 PIN+ESO+ACK 0267 0384 b7 80 51 STAA P8584S1 0268 0269 0387 bd 03 8b JSR I2CBUSY 0270 038a 39 RTS 0271 0272 * 0273 * WAIT FOR PCF8584 READY 0274 * 0275 038b b6 80 51 I2CBUSY LDAA P8584S1 0276 038e 84 01 ANDA #$01 CHECK BUSY BIT 0277 0390 27 f9 BEQ I2CBUSY 0278 0392 39 RTS 0279 0280 * 0281 * I2C READ START 0282 * B = SLAVE ADDRESS ($00-$7F) 0283 * 0284 0393 b6 80 51 I2CREAD LDAA P8584S1 0285 0396 2a 10 BPL I2CREA1 BUS OPERATION IS CURRENTLY ACTIVE (PIN SET)? 0286 0287 * START NEW BUS OPERATION 0288 0398 bd 03 8b JSR I2CBUSY 0289 039b 58 ASLB 0290 039c ca 01 ORAB #%00000001 SET READ BIT 0291 039e f7 80 50 STAB P8584SX SET SLAVE ADDRESS 0292 0293 03a1 86 c5 LDAA #$C5 PIN+ESO+STA+ACK - "START" 0294 03a3 b7 80 51 STAA P8584S1 0295 0296 03a6 20 0b BRA I2CREAW WAIT FOR COMMAND TO COMPLETE 0297 0298 * RESTART BUS OPERATION 0299 03a8 86 45 I2CREA1 LDAA #$45 ESO+STA+ACK - "START" WITHOUT PREVIOUS "STOP" 0300 03aa b7 80 51 STAA P8584S1 0301 0302 03ad 58 ASLB 0303 03ae ca 01 ORAB #%00000001 SET READ BIT 0304 03b0 f7 80 50 STAB P8584SX SET SLAVE ADDRESS 0305 0306 03b3 b6 80 51 I2CREAW LDAA P8584S1 0307 03b6 2b fb BMI I2CREAW PIN SET? DATA SENT? 0308 03b8 84 08 ANDA #$08 MASK OUT LRB 0309 03ba 26 05 BNE I2CREAE ERROR - SLAVE DID NOT ACK 0310 03bc b6 80 50 LDAA P8584SX DUMMY READ TO CLEAR DATA REG FROM SLAVE ADDRESS 0311 03bf 0d SEC 0312 03c0 39 RTS 0313 I2CREAE 0314 03c1 0c CLC 0315 03c2 39 RTS 0316 0317 * 0318 * I2C WRITE START 0319 * B = SLAVE ADDRESS ($00-$7F) 0320 * 0321 03c3 bd 03 8b I2CWRIT JSR I2CBUSY 0322 03c6 58 ASLB 0323 03c7 c4 fe ANDB #%11111110 SET WRITE BIT 0324 03c9 f7 80 50 STAB P8584SX SET SLAVE ADDRESS 0325 0326 03cc 86 c5 LDAA #$C5 PIN+ESO+STA+ACK - "START" 0327 03ce b7 80 51 STAA P8584S1 0328 0329 03d1 b6 80 51 I2CWRIW LDAA P8584S1 0330 03d4 2b fb BMI I2CWRIW PIN SET? DATA SENT? 0331 03d6 84 08 ANDA #$08 MASK OUT LRB 0332 03d8 26 02 BNE I2CWRIE ERROR - SLAVE DID NOT ACK 0333 03da 0d SEC 0334 03db 39 RTS 0335 03dc 0c I2CWRIE CLC 0336 03dd 39 RTS 0337 0338 * 0339 * I2C STOP 0340 * 0341 03de b6 80 51 I2CSTOP LDAA P8584S1 0342 03e1 2b fb BMI I2CSTOP PIN SET? DATA SENT? 0343 03e3 86 c3 LDAA #$C3 PIN+ES0+STO+ACK - "STOP" 0344 03e5 b7 80 51 STAA P8584S1 0345 03e8 39 RTS 0346 0347 * 0348 * I2C RX 0349 * B = NUMBER OF BYTES TO READ 0350 * X = DATA BUFFER 0351 * 0352 03e9 b6 80 51 I2CRX LDAA P8584S1 0353 03ec 2b fb BMI I2CRX PIN SET? DATA RECEIVED? 0354 03ee 84 08 ANDA #$08 MASK OUT LRB 0355 03f0 26 15 BNE I2CRXER ERROR - SLAVE DID NOT ACK 0356 03f2 5d TSTB CHECK IF THIS IS THE FINAL BYTE 0357 03f3 26 05 BNE I2CRX1 0358 03f5 86 40 LDAA #$40 ESO - SEND "NACK" FOR FINAL BYTE 0359 03f7 b7 80 51 STAA P8584S1 0360 03fa b6 80 50 I2CRX1 LDAA P8584SX READ DATA FROM BUS 0361 03fd a7 00 STAA ,X 0362 03ff 08 INX 0363 0400 5a DECB 0364 0401 c1 ff CMPB #$FF 0365 0403 26 e4 BNE I2CRX MORE BYTES TO READ? 0366 0405 0d SEC 0367 0406 39 RTS 0368 0407 0c I2CRXER CLC 0369 0408 39 RTS 0370 0371 * 0372 * I2C TX 0373 * B = NUMBER OF BYTES TO SEND 0374 * X = DATA BUFFER 0375 * 0376 0409 a6 00 I2CTX LDAA ,X 0377 040b 08 INX 0378 040c b7 80 50 STAA P8584SX SEND DATA TO BUS 0379 040f b6 80 51 I2CTXW LDAA P8584S1 0380 0412 2b fb BMI I2CTXW PIN SET? DATA SENT? 0381 0414 84 08 ANDA #$08 MASK OUT LRB 0382 0416 26 07 BNE I2CTXER ERROR - SLAVE DID NOT ACK 0383 0418 5a DECB 0384 0419 c1 ff CMPB #$FF 0385 041b 26 ec BNE I2CTX MORE BYTES TO WRITE? 0386 041d 0d SEC 0387 041e 39 RTS 0388 041f 0c I2CTXER CLC 0389 0420 39 RTS Number of errors 0