让找料更便捷
电子元器件
采购信息平台
生意随身带
随时随地找货
一站式电子元器件
采购平台
半导体行业观察第一站
标签:
摘要: Abstract: The DS1050 is a 5-bit pulse-width modulator (PWM) controlled by a 2-wire bus. This allows a single master device to control up to 8 slave (DS1050 and other 2-wire devices) on a single 2-wire bus. In this application note, an inte...
LCALL START2WIRE ; 2-WIRE START MOV A,#PWM1WRITE ; DEVICE IDENTIFIER=0101, SLAVE ADDRESS=000, R/W=0 LCALL WRITEBITS ; SEND THE COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR AN ACKNOWLEDGE FROM THE SLAVE MOV A,PWM1DATA ; PWM1DATA IS A VARIABLE CONTAINING THE DESIRED DUTY CYCLE LCALL WRITEBITS ; SEND DATA LCALL ACKSLAVEWRITE ; CHECK FOR AN ACKNOWLEDGE FROM THE SLAVE LCALL STOP2WIRE ; 2-WIRE STOPThis code implements the example shown in Figure 3-B.
; PWM1 LCALL START2WIRE ; 2-WIRE START MOV A,#PWM1WRITE ; DEVICE IDENTIFIER=0101, SLAVE ADDRESS=000, R/W=0 LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR ACKNOWLEDGE FROM THE SLAVE MOV A,#0C0H ; SHUTDOWN COMMAND, (CHANGE TO 80 TO EXIT SHUTDOWN) LCALL WRITEBITS ; SEND COMMAND LCALL ACKSLAVEWRITE ; CHECK FOR ACKNOWLEDGE FROM THE SLAVE LCALL STOP2WIRE ; 2-WIRE STOP ; PWM2 LCALL START2WIRE ; 2-WIRE START MOV A,#PWM2WRITE ; DEVICE IDENTIFIER=0101, SLAVE ADDRESS=001, R/W=0 LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR ACKNOWLEDGE FROM THE SLAVE MOV A,#0C0H ; SHUTDOWN COMMAND, (CHANGE TO 80 TO EXIT SHUTDOWN) LCALL WRITEBITS ; SEND COMMAND LCALL ACKSLAVEWRITE ; CHECK FOR ACKNOWLEDGE FROM THE SLAVE LCALL STOP2WIRE ; 2-WIRE STOPFinally, here is an example reading both DS1050s.
; READ PWM1 LCALL START2WIRE ; 2-WIRE START MOV A,#PWM1READ ; DEVICE IDENTIFIER=0101, SLAVE ADDRESS=000, R/W=1 LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR ACKNOWLEDGE FROM THE SLAVE LCALL READBITS ; READ DATA FROM DS1050 #1 (FAN PWM) MOV PWM1DATA,A ; THE ACC CONTAINS THE DATA READ FROM THE DS1050 ; NACK FROM MASTER NOT REQUIRED, BUT OPTIONAL LCALL STOP2WIRE ; 2-WIRE STOP LCALL PACCSP ; DISPLAY BYTE ON PC SCREEN FOLLOWED BY A SPACE ; READ PWM2 LCALL START2WIRE ; 2-WIRE START MOV A,#PWM2READ ; DEVICE IDENTIFIER=0101, SLAVE ADDRESS=001, R/W=1 LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR ACKNOWLEDGE FROM THE SLAVE LCALL READBITS ; READ DATA FROM DS1050 #2 (LCD PWM) MOV PWM2DATA,A ; THE ACC CONTAINS THE DATA READ FROM THE DS1050 ; NACK FROM THE MASTER NOT REQUIRED, BUT OPTIONAL LCALL STOP2WIRE ; 2-WIRE STOP LCALL PACCSP ; DISPLAY DATA ON PC SCREEN LCALL CRLF ; NEWLINEThe firmware found in Appendix A, as well as additional information can be found on our ftp site listed at the end of this application note under Contact Information.
;****************************************************************************** ;* DS1050 APPNOTE FIRMWARE * ;* Copyright (c) 1999,2000,2001 Dallas Semiconductor/MAXIM * ;****************************************************************************** ;* * ;* This program is used to show an example of how to use the DS1050 in a * ;* real application. * ;* * ;* Revision History * ;* 1.0 10/05/01 BJV Initial Release * ;* * ;****************************************************************************** ;* * ;* DS87C520 Reference: * ;* * ;* P0.0 - 74ACQ573 P2.0 - A8 * ;* P0.1 - " P2.1 - A9 * ;* P0.2 - " P2.2 - A10 * ;* P0.3 - " P2.3 - A11 * ;* P0.4 - " P2.4 - A12 * ;* P0.5 - " P2.5 - A13 * ;* P0.6 - " P2.6 - A14 * ;* P0.7 - " P2.7 - A15 * ;* * ;* P3.0 - P1.0 - SCL * ;* P3.1 - P1.1 - SDA * ;* P3.2 - P1.2 - RXD1 - TO PC SERIAL PORT * ;* P3.3 - P1.3 - TXD1 - TO PC SERIAL PORT * ;* P3.4 - P1.4 - ACK FAIL LED * ;* P3.5 - P1.5 - LED * ;* P3.6 - *WR P1.6 - LED * ;* P3.7 - *RD P1.7 - HEARTBEAT LED * ;* * ;* BANK 0 R0 - Used for 2-wire read and write, Do not destroy! * ;* BANK 0 R3 - Used for binasc routine, Do not destroy! * ;* * ;****************************************************************************** ;* Notes: * ;* 1. DS87C520 is running at 22.1184MHz * ;* 2. Connect serial port 1 (P1.2 and P1.3) to PC * ;* * ;****************************************************************************** ;****************************************************************************** $NOMOD51 ; disable predefined 8051 registers $INCLUDE (REG520.INC) ; DS87C520 definition file ;------------------------------------------------------------------ ; SOFTWARE VERSION ;------------------------------------------------------------------ MAJOR_VERSION EQU 1 ; major version number MINOR_VERSION EQU 0 ; minor version number ;------------------------------------------------------------------ ; CONSTANTS ;------------------------------------------------------------------ CR EQU 0DH ;ASCII CARRIAGE RETURN LF EQU 0AH ;ASCII LINE FEED BS EQU 08H ;ASCII BACK SPACE ETX EQU 03H ;ASCII END OF TEXT BEL EQU 07H ;ASCII BELL NAK EQU 15H ;ASCII NEGATIVE ACKNOWLEDGE ;------------------------------------------------------------------ ; SERIAL PORT CONFIGURATION ;------------------------------------------------------------------ SBUFIN EQU SBUF1 ;USE SERIAL PORT 1 SBUFON EQU SBUF1 RIN BIT SCON1.0 TIN BIT SCON1.1 ;------------------------------------------------------------------ ; DS1050 SPECIFIC ;------------------------------------------------------------------ PWM1READ EQU 51h ; control byte, A0=A1=A2=0, read PWM1WRITE EQU 50h ; control byte, A0=A1=A2=0, write PWM2READ EQU 53h ; control byte, A0=1, A1=A2=0, read PWM2WRITE EQU 52h ; control byte, A0=1, A1=A2=0, write DSEG AT 30H PWM1DATA: DS 1 ;DS1050 #1 DATA PWM2DATA: DS 1 ;DS1050 #2 DATA ;------------------------------------------------------------------ ; 2-WIRE BIT DEFINITIONS ;------------------------------------------------------------------ SDA BIT P1.1 SCL BIT P1.0 STACK EQU $ ;STACK IS ABOVE DATA ;********************************************************************* ;* Hardware Interrupt Vectors (Table on page 95 of DS databook) * ;********************************************************************* CSEG AT 0 ;Power up and Reset LJMP MAIN CSEG AT 0003h ;External Interrupt 0 LJMP NOISR CSEG AT 000Bh ;Timer 0 Interrupt LJMP NOISR CSEG AT 0013h ;External Interrupt 1 LJMP NOISR CSEG AT 001Bh ;Timer 1 Interrupt LJMP NOISR CSEG AT 0023h ;Serial Port 0 Interrupt LJMP NOISR CSEG AT 002Bh ;Timer 2 Interrupt LJMP TMR2_INT ;Service Heartbeat LED CSEG AT 0033h ;Power Fail Interrupt (DALLAS Priority 1) LJMP NOISR CSEG AT 003Bh ;Serial Port 1 Interrupt (DALLAS) LJMP NOISR CSEG AT 0043h ;External Interrupt 2 (DALLAS) LJMP NOISR CSEG AT 004Bh ;External Interrupt 3 (DALLAS) LJMP NOISR CSEG AT 0053h ;External Interrupt 4 (DALLAS) LJMP NOISR CSEG AT 005Bh ;External Interrupt 5 (DALLAS) LJMP NOISR CSEG AT 0063h ;Watchdog Interrupt (DALLAS) LJMP NOISR CSEG AT 006Bh ;Real-Time Clock (DALLAS) LJMP NOISR ;********************************************************************* ;* Main Program * ;********************************************************************* CSEG AT 0080h MAIN: CLR EA ;DISABLE INTERRUPTS MOV SP,#STACK ;INITIALIZE STACK LCALL INIT_520 ;INITIALIZE DS87C520 LCALL INIT_LCD ;INITIALIZE LCD LCALL PTBANNER ;PRINT BANNER TO SCREEN LCALL INIT2WIRE ;INITIALIZE 2-WIRE PORT LCALL INIT1050S ;INITIALIZE DS1050'S LCALL LCDSHOWSTAT ;DISPLAY DS1050 DATA TO LCD SETB EA ;ENABLE INTERRUPTS ;********************************************************************* MAINLOOP: JNB RIN,NOCHAR ;CHECK FOR USER INPUT FROM UART LCALL ECHO ;ECHO CHAR TO SCREEN LCALL CRLF ;NEWLINE CLR RIN ;CLEAR RECEIVE FLAG CJNE A,#ETX,CHAR1 ;JUMP IF NOT ETX (CTRL-C) CALL PTBANNER ;REPRINT THE BANNER TO THE SCREEN LJMP MAINLOOP ;LOOP FOREVER NOCHAR:CPL P1.6 ;TOGGLE LED - FOR DEBUG ONLY LJMP MAINLOOP ;LOOP FOREVER UNTIL CHAR RECEIVED ;****************************************************** ;*** MENU COMMANDS *** ;****************************************************** CHAR1:CJNE A,#'1',CHAR2 ; <1> INCREMENT PWM1 MOV A,PWM1DATA ; GET CURRENT PWM1 SETTING ; THIS SHOULD BE READ FROM DEVICE CJNE A,#20H,C1NE ; IF LESS THAN 20H, THEN JUMP ; PWM1 IS ALREADY AT 100% - DO NOTHING LCALL LCDSHOWSTAT ; DISPLAY BOTH PWMS ON LCD LJMP MAINLOOP C1NE: JC C1L ; CHECK IF < OR > ; PWM1 IS >20, IN SHUTDOWN MODE ; DO NOTHING LCALL LCDSHOWSTAT ; DISPLAY BOTH PWMS ON LCD LJMP MAINLOOP C1L: ; PWM1 IS <20, TRUE PWM DATA INC A ; INCREMENT PWM1 DUTY CYCLE MOV PWM1DATA,A ; SAVE PWM1 DATA LCALL LCDSHOWSTAT ; DISPLAY BOTH PWMS ON LCD ; PERFORM 2-WIRE COMMUNICATION LCALL START2WIRE ; 2-WIRE START MOV A,#PWM1WRITE ; DEVICE IDENTIFIER, SLAVE ADDRESS, WRITE LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE MOV A,PWM1DATA ; NEW PWM1 DUTY CYCLE LCALL WRITEBITS ; SEND DATA LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE LCALL STOP2WIRE ; 2-WIRE STOP LJMP MAINLOOP ;****************************************************** CHAR2:CJNE A,#'2',CHAR3 ; <2> DECREMENT PWM1 MOV A,PWM1DATA ; GET CURRENT PWM1 SETTING ; THIS SHOULD BE READ FROM DEVICE JNZ C2NZ ; JUMP IF NOT 0% DUTY CYCLE ; PWM2 IS 0%, CANNOT DECREMENT LCALL LCDSHOWSTAT ; DISPLAY BOTH PWMS ON LCD LJMP MAINLOOP C2NZ: CJNE A,#20H,C2NE ; IF LESS THAN 20H, THEN JUMP SJMP C2SK ; PWM1 IS 100%, JUMP TO DECREMENT C2NE: JNC C2GT ; CHECK IF < OR > C2SK: ; PWM1 IS <20, TRUE PWM DATA DEC A ; DECREMENT PWM1 DUTY CYCLE MOV PWM1DATA,A ; SAVE PWM1 DATA LCALL LCDSHOWSTAT ; DISPLAY BOTH PWMS ON LCD ; PERFORM 2-WIRE COMMUNICATION LCALL START2WIRE ; 2-WIRE START MOV A,#PWM1WRITE ; DEVICE IDENTIFIER, SLAVE ADDRESS, WRITE LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE MOV A,PWM1DATA ; NEW PWM1 DUTY CYCLE LCALL WRITEBITS ; SEND DATA LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE LCALL STOP2WIRE ; 2-WIRE STOP LJMP MAINLOOP C2GT: ; PWM1 IS >20, IN SHUTDOWN ; DO NOTHING LCALL LCDSHOWSTAT ; DISPLAY BOTH PWMS ON LCD LJMP MAINLOOP ;****************************************************** CHAR3:CJNE A,#'3',CHAR4 ; <3> INCREMENT PWM2 MOV A,PWM2DATA ; GET CURRENT PWM2 SETTING ; THIS SHOULD BE READ FROM DEVICE CJNE A,#20H,C3NE ; IF LESS THAN 20H, THEN JUMP ; PWM2 IS ALREADY AT 100% - DO NOTHING LCALL LCDSHOWSTAT ; DISPLAY BOTH PWMS ON LCD LJMP MAINLOOP C3NE: JC C3L ; CHECK IF < OR > ; PWM2 IS >20, IN SHUTDOWN MODE ; DO NOTHING LCALL LCDSHOWSTAT ; DISPLAY BOTH PWMS ON LCD LJMP MAINLOOP C3L: ; PWM2 IS <20, TRUE PWM DATA INC A ; INCREMENT PWM2 DUTY CYCLE MOV PWM2DATA,A ; SAVE PWM2 DATA LCALL LCDSHOWSTAT ; DISPLAY BOTH PWMS ON LCD ; PERFORM 2-WIRE COMMUNICATION LCALL START2WIRE ; 2-WIRE START MOV A,#PWM2WRITE ; DEVICE IDENTIFIER, SLAVE ADDRESS, WRITE LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE MOV A,PWM2DATA ; NEW PWM2 DUTY CYCLE LCALL WRITEBITS ; SEND DATA LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE LCALL STOP2WIRE ; 2-WIRE STOP LJMP MAINLOOP ;****************************************************** CHAR4:CJNE A,#'4',CHAR5 ; <4> DECREMENT PWM2 MOV A,PWM2DATA ; GET CURRENT PWM SETTING ; THIS SHOULD BE READ FROM DEVICE JNZ C4NZ ; JUMP IF NOT 0% DUTY CYCLE ; PWM2 IS 0%, CANNOT DECREMENT LCALL LCDSHOWSTAT ; DISPLAY BOTH PWMS ON LCD LJMP MAINLOOP C4NZ: CJNE A,#20H,C4NE ; IF LESS THAN 20H, THEN JUMP SJMP C4SK ; PWM2 IS 100%, JUMP TO DECREMENT C4NE: JNC C4GT ; CHECK IF < OR > C4SK: ; PWM2 IS <20, TRUE PWM DATA DEC A ; DECREMENT PWM2 DUTY CYCLE MOV PWM2DATA,A ; SAVE PWM2 DATA LCALL LCDSHOWSTAT ; DISPLAY BOTH PWMS ON LCD ; PERFORM 2-WIRE COMMUNICATION LCALL START2WIRE ; 2-WIRE START MOV A,#PWM2WRITE ; DEVICE IDENTIFIER, SLAVE ADDRESS, WRITE LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE MOV A,PWM2DATA ; NEW PWM2 DUTY CYCLE LCALL WRITEBITS ; SEND DATA LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE LCALL STOP2WIRE ; 2-WIRE STOP LJMP MAINLOOP C4GT: ; PWM2 IS >20, IN SHUTDOWN ; DO NOTHING LCALL LCDSHOWSTAT ; DISPLAY BOTH PWMS ON LCD LJMP MAINLOOP ;****************************************************** CHAR5:CJNE A,#'5',CHAR6 ;Jump if not 5 LJMP MAINLOOP ;****************************************************** CHAR6:CJNE A,#'6',CHAR7 ;Jump if not 6 LJMP MAINLOOP ;****************************************************** CHAR7:CJNE A,#'7',CHAR8 ; <7> ENTER SHUTDOWN MODE ; PWM1 LCALL START2WIRE ; 2-WIRE START MOV A,#PWM1WRITE ; DEVICE IDENTIFIER, SLAVE ADDRESS, WRITE LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE MOV A,#0C0H ; SHUTDOWN COMMAND LCALL WRITEBITS ; SEND COMMAND LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE LCALL STOP2WIRE ; 2-WIRE STOP ; PWM2 LCALL START2WIRE ; 2-WIRE START MOV A,#PWM2WRITE ; DEVICE IDENTIFIER, SLAVE ADDRESS, WRITE LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE MOV A,#0C0H ; SHUTDOWN COMMAND LCALL WRITEBITS ; SEND COMMAND LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE LCALL STOP2WIRE ; 2-WIRE STOP LJMP MAINLOOP ;****************************************************** CHAR8:CJNE A,#'8',CHAR9 ; <8> EXIT SHUTDOWN BOTH DS1050S ; PWM1 EXIT SHUTDOWN LCALL START2WIRE ; 2-WIRE START MOV A,#PWM1WRITE ; DEVICE IDENTIFIER, SLAVE ADDRESS, WRITE LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE MOV A,#80H ; EXIT SHUTDOWN COMMAND LCALL WRITEBITS ; SEND COMMAND LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE LCALL STOP2WIRE ; 2-WIRE STOP ; PWM2 SHUTDOWN LCALL START2WIRE ; 2-WIRE START MOV A,#PWM2WRITE ; DEVICE IDENTIFIER, SLAVE ADDRESS, WRITE LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE MOV A,#80H ; EXIT SHUTDOWN COMMAND LCALL WRITEBITS ; SEND COMMAND LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE LCALL STOP2WIRE ; 2-WIRE STOP LJMP MAINLOOP ;****************************************************** CHAR9:CJNE A,#'9',CHAR0 ; <9> READ BOTH DS1050S ; READ PWM1 LCALL START2WIRE ; 2-WIRE START MOV A,#PWM1READ ; DEVICE IDENTIFIER, SLAVE ADDRESS, READ LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE LCALL READBITS ; READ DATA FROM DS1050 #1 (FAN PWM) MOV PWM1DATA,A ; SAVE PWM1DATA ; NACK NOT REQUIRED, BUT OPTIONAL LCALL STOP2WIRE ; 2-WIRE STOP LCALL PACCSP ; DISPLAY DATA ON PC SCREEN ; READ PWM2 LCALL START2WIRE ; 2-WIRE START MOV A,#PWM2READ ; DEVICE IDENTIFIER, SLAVE ADDRESS, READ LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE LCALL READBITS ; READ DATA FROM DS1050 #2 (LCD PWM) MOV PWM2DATA,A ; SAVE PWM2DATA ; NACK NOT REQUIRED, BUT OPTIONAL LCALL STOP2WIRE ; 2-WIRE STOP LCALL PACCSP ; DISPLAY DATA ON PC SCREEN LCALL CRLF LJMP MAINLOOP ;****************************************************** CHAR0:CJNE A,#'0',LAST ; <0> DO NOTHING LJMP MAINLOOP ;****************************************************** LAST: LJMP MAINLOOP ;*************************************************************************** ;**** TIMER 2 ISR - LED Heartbeat **** ;**** **** ;*************************************************************************** TMR2_INT: CLR EA ; DISABLE INTERRUPTS PUSH ACC ; SAVE ACC ANL T2CON,#07FH ; ACKNOWLEDGE INTERRUPT CPL P1.7 ; TOGGLE LED NOHEART:POP ACC ; RESTORE ACC SETB EA ; ENABLE INTERRUPTS RETI ;*************************************************************************** ;**** Spurious Interrupt - Used as a trap for unknown/unwanted ints. **** ;**** **** ;*************************************************************************** NOISR:MOV DPTR, #DB_NOISR ; POINT TO MESSAGE TO BE DISPLAYED LCALL PTXT ; DISPLAY MESSAGE RETI ;*************************************************************************** ;**** Initialize DS87C520 - **** ;**** INITIALIZE SERIAL PORT 1 FOR 19200 BAUD (22.1184MHZ) **** ;*************************************************************************** INIT_520: MOV WDCON,#0A0H ; SMOD=1(UP TO 115200 BPS) AND TURN ON PFI MOV SCON1,#50H ; MODE1, ASYNC, 10BITS, TIMER1 MOV TMOD,#21H ; TIMER1-8BIT AUTO RELOAD,TIMER0-16BIT MOV TCON,#50H ; TIMER0 AND 1 ENABLED,/INT0 AND 1 NOT USED MOV TH1,#0FAH ; TIMER1 RESET VALUE FOR 19200 BAUD MOV P1,#0FFH ; TURN OFF PORT1 LEDS MOV T2CON,#04H ; TURN ON TIMER2 MOV IE,#020H ; ENABLE TIMER2 INTERRUPT CLR RS0 ; SELECT REGISTER BANK 0 CLR RS1 RET ;*************************************************************************** ;**** Initialize DS1050'S **** ;**** DS1050 #1 CONTROLS FAN, DS1050 #2 CONTROLS LCD BACKLIGHT **** ;*************************************************************************** INIT1050S: ; READ PWM1 LCALL START2WIRE ; 2-WIRE START MOV A,#PWM1READ ; DEVICE IDENTIFIER, SLAVE ADDRESS, READ LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE LCALL READBITS ; READ DATA FROM DS1050 #1 (FAN PWM) MOV PWM1DATA,A ; SAVE PWM1DATA LCALL STOP2WIRE ; 2-WIRE STOP ; READ PWM2 LCALL START2WIRE ; 2-WIRE START MOV A,#PWM2READ ; DEVICE IDENTIFIER, SLAVE ADDRESS, READ LCALL WRITEBITS ; SEND COMMAND BYTE LCALL ACKSLAVEWRITE ; CHECK FOR SLAVE ACKNOWLEDGE LCALL READBITS ; READ DATA FROM DS1050 #2 (LCD PWM) MOV PWM2DATA,A ; SAVE PWM2DATA LCALL STOP2WIRE ; 2-WIRE STOP RET ;********************************************************************* ;**** 2-Wire Start Condition Generator Routine **** ;**** Waits until the 2-Wire bus is not busy, the generates a **** ;**** a start condition. Does not wait for the 2-Wire bus **** ;**** free time, because this code is not intended to be used **** ;**** in a 2-Wire multimaster system. **** ;********************************************************************* ;* requires wait2us routine * ;* uses no registers * ;********************************************************************* START2WIRE: JNB SCL, START2WIRE ; if SCL low, bus busy, wait JNB SDA, START2WIRE ; if SDA low, bus busy, wait CLR SDA ; PULL SDA LOW LCALL WAIT2US ; WAIT 2US CLR SCL ; PULL SCL LOW LCALL WAIT2US ; WAIT 2US RET ;********************************************************************* ;**** 2-Wire Stop Condition **** ;**** Used to send a stop condition **** ;********************************************************************* ;* requires wait2us routine * ;* uses no registers * ;********************************************************************* STOP2WIRE: CLR SDA ; PULL SDA LOW ; SDA MUST BE LOW SO IT CAN GO HIGH ; WHILE THE CLOCK IS HIGH TO GENERATE ; THE STOP CONDITION NOP ; WASTE 180NS/NOP, STOP SETUP TIME NOP NOP NOP SETB SCL ; PULL SCL HIGH NOP NOP NOP NOP SETB SDA ; PULL SDA HIGH LCALL WAIT2US ; WAIT 2US RET ;********************************************************************* ;**** 2-Wire Initialization Routine **** ;**** Inits SCL and SDA to Set Condition **** ;********************************************************************* ;* requires no routines * ;* Uses no Registers * ;********************************************************************* INIT2WIRE: SETB SCL ; START PROGRAM WITH SCL HIGH SETB SDA ; START PROGRAM WITH SDA HIGH RET ;********************************************************************* ;**** Write Bits Routine **** ;**** Serializes and Transmits the data in the Accumulator at **** ;**** the time the routine is called **** ;********************************************************************* ;* requires no other routines * ;* Destroys Window 0 R0 register and ACC * ;********************************************************************* WRITEBITS: MOV R0, #8 ; sets up for transfer of 8 bits NEXTWRITEBIT: RLC A ; move the MSB of the ACC into C MOV SDA, C ; write C onto SDA line SETB SCL ; set SCL NOP NOP ; clock high time, 180ns/nop NOP NOP CLR SCL ; clear SCL NOP NOP ; clock low time, 180ns/nop + other NOP ; instructions between last nop and NOP ; next setb SCL DJNZ R0, NEXTWRITEBIT ; if the 8th data bit not sent yet ; then keep sending data RET ;********************************************************************* ;**** 2-Wire Readbits Routine **** ;**** Reads 8-bits of data from the slave device, and stores **** ;**** the received data in the Accumulator **** ;********************************************************************* ;* requires no other routines * ;* Destroys Window0 R0 register and ACC * ;********************************************************************* READBITS: SETB SDA ; SDA must be set for an open ; collector read MOV R0, #8 ; sets up for transfer of 8 bits NEXTREADBIT: SETB SCL ; set SCL NOP ; clock high time, 180ns/nop + other NOP ; instructions before clr SCL MOV C, SDA ; Place Data on SDA into C RLC A ; move the C into LSB of A CLR SCL ; clear SCL NOP NOP ; clock low time, 180ns/nop + other NOP ; instructions before next setb SCL NOP NOP DJNZ R0, NEXTREADBIT ; if the 8th data bit not sent yet ; keep sending data RET ;********************************************************************* ;**** 2-Wire Acknowledge Slave Routine for WRITES **** ;**** Used to acknowledge slave devices DURING WRITES **** ;********************************************************************* ;* requires outstr routines * ;* uses DPTR register * ;********************************************************************* ACKSLAVEWRITE: SETB SDA ; set SDA NOP ; wait 180ns/nop NOP SETB SCL ; set SCL NOP NOP ; wait 180ns/nop + other instructions NOP ; with clock high JB SDA, ACK_FAIL ; if SDA high (acknowledge fails), ; then jump to error routine CLR SCL ; else ack passes, set SCL and NOP ; wait 180ns/nop + other instructions NOP ; for clock to go high SETB P1.4 RET ; return ACK_FAIL: MOV DPTR, #ACKF ; point to ack fail serial message LCALL PTXT ; send message out CLR P1.4 CLR SCL ; clr SCL CLR SDA ; clr SDA NOP NOP ; clock time low, 180ns/nop + clr NOP ; SDA instruction NOP NOP NOP SETB SCL ; set SCL NOP NOP ; clock time high, 180ns/nop NOP NOP NOP NOP NOP SETB SDA ; create stop condition RET ;********************************************************************* ;**** 2-Wire Acknowledge Slave Routine for READS **** ;**** Used to acknowledge slave devices DURING READS **** ;********************************************************************* ;* requires no other routines * ;* uses no registers * ;********************************************************************* ACKSLAVEREAD: CLR SDA ; clear SDA NOP ; wait 180ns/nop NOP SETB SCL ; set SCL NOP NOP ; wait 180ns/nop NOP NOP CLR SCL ; clear SCL RET ;*************************************************************************** ;**** DISPLAY DS1050 DATA TO LCD **** ;*************************************************************************** LCDSHOWSTAT: MOV A,#0C0h ; SET TO SECOND LINE OF LCD DISPLAY MOV DPTR,#8000h ; ADDRESS OF LCD MOVX @DPTR,A ; WRITE ADDRESS TO LCD LCALL DELAY40U ; WAIT FOR LCD LCALL DELAY40U ; WAIT FOR LCD MOV DPTR,#PWM1DISP ; TEXT MESSAGE TO DISPLAY LCALL LCDSTR ; PRINT TEXT TO LCD MOV A,PWM1DATA ; RECALL PWM1 DATA LCALL BINTOASCII ; ACC=FIRST DIGIT,B=SECOND DIGIT LCALL LCDCHAR ; DISPLAY PWM1 DATA ON LCD (FIRST DIGIT) MOV A,B ; GET SECOND DIGIT LCALL LCDCHAR ; DISPLAY PWM1 DATA ON LCD (SECOND DIGIT) MOV A,#094h ; SET TO THIRD LINE OF LCD DISPLAY MOV DPTR,#8000h ; ADDRESS OF LCD MOVX @DPTR,A ; WRITE ADDRESS TO LCD LCALL DELAY40U ; WAIT FOR LCD LCALL DELAY40U ; WAIT FOR LCD MOV DPTR,#PWM2DISP ; TEXT MESSAGE TO DISPLAY LCALL LCDSTR ; PRINT STRING TO LCD MOV A,PWM2DATA ; RECALL PWM2 DATA LCALL BINTOASCII ; ACC=FIRST DIGIT,B=SECOND DIGIT LCALL LCDCHAR ; DISPLAY PWM2 DATA ON LCD (FIRST DIGIT) MOV A,B ; GET SECOND DIGIT LCALL LCDCHAR ; DISPLAY PWM2 DATA ON LCD (SECOND DIGIT) RET ;********************************************************************* ;**** Wait 2us Function **** ;**** Wastes 1.6us of processor time with call, nop and return **** ;********************************************************************* ;* Requires no other routines or registers * ;********************************************************************* WAIT2US: NOP ; 1 nops @4cc each + lcall @16cc + ret @16cc ; produces approximately 1.6us of delay with a ; 22.22MHz clock RET ;*************************************************************************** ;**** 40us Delay **** ;*************************************************************************** DELAY40U: MOV A,#000Fh ; 180ns*2cycles LOOP40U: NOP ; 180ns NOP NOP NOP NOP NOP NOP NOP NOP NOP DEC A JNZ LOOP40U ; 14 cycles in loop RET ; 4 cycles ;*************************************************************************** ;**** Delay 5ms **** ;*************************************************************************** DELAY5MS: MOV A,#079h LOOP5MS: PUSH ACC ; WASTE TIME LCALL DELAY40U ; WASTE TIME POP ACC ; WASTE TIME DEC A ; LOOP COUNTER JNZ LOOP5MS ; CONTINUE WASTING TIME RET ;*************************************************************************** ;**** STRINGS AND ERROR MESSAGES **** ;*************************************************************************** BANNER: DB CR,LF DB 'DS1050/52 APPNOTE FIRMWARE REV ', ETX BANNER2: DB CR,LF DB 'DS1050/52 ', CR, LF, ETX PERIOD: DB '.', ETX PROMPT: DB CR, '> ', ETX LCDBANNER: DB 'DS1050 APPNOTE',00h PWM1DISP: DB 'DS1050 #1 (FAN)= ',00h PWM2DISP: DB 'DS1050 #2 (LCD)= ',00h ACKF: DB 'ACK FAILED', CR, LF, ETX DB_POWER: DB 'LOW POWER INT', CR, LF, ETX DB_NOISR: DB 'NOISR INT', CR, LF, ETX BUETX: DB ETX ;Just in case ;*************************************************************************** $INCLUDE (DSLIB.A51) ;SERIAL PORT DEBUG ROUTINES END ;***************************************************************************
型号 | 厂商 | 价格 |
---|---|---|
EPCOS | 爱普科斯 | / |
STM32F103RCT6 | ST | ¥461.23 |
STM32F103C8T6 | ST | ¥84 |
STM32F103VET6 | ST | ¥426.57 |
STM32F103RET6 | ST | ¥780.82 |
STM8S003F3P6 | ST | ¥10.62 |
STM32F103VCT6 | ST | ¥275.84 |
STM32F103CBT6 | ST | ¥130.66 |
STM32F030C8T6 | ST | ¥18.11 |
N76E003AT20 | NUVOTON | ¥9.67 |