Re: ADRESH和ADRESL
|
||||
---|---|---|---|---|
高級會員
|
謝謝你們的回答
不過我發現是不是用這個指令就可以把10bit的值讀出來了呢 ReadADC()
發表於: 2005/8/9 9:34
|
|||
|
Re: MCP42XXX的SPI傳輸
|
||||
---|---|---|---|---|
高級會員
|
;****************************************************************************************
; * ; * ; Software License Agreement * ; * ; The software supplied herewith by Microchip Technology Incorporated * ; (the ompany?for its PICmicro?Microcontroller is intended and supplied * ; PICmicro Microcontroller to you, the Company customer, for use solely and * ; exclusively on Microchip products. * ; The software is owned by the Company and/or its supplier, and is protected * ; under applicable copyright laws. All rights are reserved. Any use in violation * ; of the foregoing restrictions may subject the user to criminal sanctions under * ; applicable laws, as well as to civil liability for the breach of the terms and * ; conditions of this license. * ; THIS SOFTWARE IS PROVIDED IN AN S IS?CONDITION. NO WARRANTIES, WHETHER * ; EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED * ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO * ; THIS SOFTWARE. THE COMPANY SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR * ; SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. * ; * ; * ;**************************************************************************************** ;**************************************************************************************** ; * ; Interfacing Microchip's MCP42xxx digital potentiometer to the PICmicro MCU * ; * ; - THIS PROGRAM IS ABSOLUTE ASSMEBLY USING THE HARDWARE * ; SPI MODULE TO PROGRAM THE DIGITAL POTENTIOMETER * ; * ; * ;**************************************************************************************** ; * ; * ; Filename: POTSPI1.ASM * ; Date: 11.07.2000 * ; File Version: 1.00 * ; * ; Assembler: MPASM VERSION 2.50 * ; * ; PROGRAMER: PRO MATE DEVICE PROGRAMMER, VERSION 5.20.00 * ; * ; File Required: PIC16F876.inc * ; * ; Author: Ezana Haile * ; Company: Microchip Technology Incorporated * ; * ; * ;**************************************************************************************** ; * ; * ; This code demonstrates how Microchip's MCP42xxx Digital Potentiometer * ; (Pot) is interfaced to the PICmicro MCU (PIC16F876). The Potentiometer * ; requires a serial communication to porgram the command byte and the data * ; byte. This MCU has a built-in Serial Peripheral Interface (SPI) which can * ; be used to program the pot effectively. The following program illustrates * ; how to interface the digital pot using the MCU's SPI. * ; * ; To change the command byte or the Pot wiper possition the user must change * ; the COMMAND and R_VALUE variables properly and reprogram the MCU. * ; * ; * ;**************************************************************************************** #include <p16f876.inc> ERRORLEVEL -302 __CONFIG _BODEN_OFF & _PWRTE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC ;**************************************************************************************** ;******************** EQUATES ********************************************************* ;**************************************************************************************** CS EQU H'00' ;CHIP SELECT COMMAND EQU H'13' ;VARIABLE FOR THE COMMAND BYTE R_VALUE EQU D'140' ;VARIABLE FOR THE RESISTANCE VALUE ;**************************************************************************************** ;******************** PROGRAM ORIGIN ************************************************** ;**************************************************************************************** ORG 0X00 ;---------------------------------------------------------------------------------------- ;-------------------- PORTB AND SPI SETTING ------------------------------------------- ;---------------------------------------------------------------------------------------- BSF STATUS, RP0 ;SPECIFY BANK 1 MOVLW H'00' MOVWF TRISA ;SET PORTA AS AN OUTPUT MOVWF TRISC ;SET PORTB AS AN OUTPUT BCF STATUS, RP0 ;SPECIFY BANK 0 CLRF PCLATH ;ENSURE PCLATH BIT 3 IS CLEARED CLRF INTCON ;ENSURE ALL INTERRUPTS ARE DISABLED MOVLW 0x30 ; MOVWF SSPCON ;SET SYNC SERIAL PORT CONTROL REGISTER ;---------------------------------------------------------------------------------------- ;-------------------- PROGRAM ROUTINE ------------------------------------------------- ;---------------------------------------------------------------------------------------- BCF PORTA, CS ;SELECT THE POT MOVLW COMMAND ;LOAD THE COMMAND BYTE IN THE ACCUMULATOR CALL TRANSMIT ;TRANSMIT THE COMMAND BYTE MOVLW R_VALUE ;LOAD THE RESISTANCE VALUE IN THE ACCUMULATOR CALL TRANSMIT ;TRANSMIT THE RESISTANCE VALUE BSF PORTA, CS ;UNSELECT THE POT GOTO FINISH ;FINISH ;---------------------------------------------------------------------------------------- ;-------------------- TRANSMISION SUBROUTINE ------------------------------------------ ;---------------------------------------------------------------------------------------- TRANSMIT BCF STATUS, RP0 ;SPECIFY BANK 0 MOVWF SSPBUF ;PLACE DATA IN BUFFER TO SEND BSF STATUS, RP0 ;SPECIFY BANK 1 LOOP BTFSS SSPSTAT, BF ;CHECK IF TRANSMISSION IS COMPLETE GOTO LOOP ; BCF STATUS, RP0 ;SPECIFY BANK 0 RETURN ;RETURN FROM SUBROUTINE ;**************************************************************************************** FINISH GOTO FINISH END ;******************** END OF PROGRAM ************************************************** 如果嫌組合語言難懂可以參考一下CCS C compiler code 我不習慣使用他內建函數所以用自己的方式寫這樣要移植到其他的MCU比較方便 #include <12f675.h> #fuses INTRC_IO,NOWDT,NOPROTECT, NOMCLR #use delay(clock=4000000) //int8 PORTDATA; #define GP0 PIN_A0 #define GP1 PIN_A1 #define GP2 PIN_A2 #define GP3 PIN_A3 #define GP4 PIN_A4 #define GP5 PIN_A5 #define P_CS GP0 // pin7 #define P_DI GP1 // pin6 #define P_CLK GP2 // pin5 #define P_KEY1 GP3 // pin4 #define P_KEY2 GP4 // pin3 //#define P_SCL GP4 #zero_ram // clear all RAM memory #define COMMAND 0X13 //#define R_VALUE 140 int8 R_VALUE; /* ********************************************************************** ***** Date: 2005-08-08 ***** version : 1.0 ********************************************************************** for Microchip asm TRANSMIT MOVWF OUT ;MOVE W TO 'OUT' VARIABLE MOVLW 0X08 ;LOAD A COUNTER TO 'COUNT' THE BIT MOVWF COUNT ;TRANSMISSION L_SHIFT BTFSC OUT, 7 ;MONITOR THE 7TH BIT GOTO HI BCF PORTC, SI ;IF LOW: CLEAR SERIAL-IN LINE GOTO PASS HI BSF PORTC, SI ;IF HI: SET SERIAL-IN LINE PASS BSF PORTC, SCLK ;SET SERIAL CLOCK: HI RLF OUT, F ;ROTATE OUT LEFT BCF PORTC, SCLK ;SET SERIAL CLOCK: LOW DECFSZ COUNT, F ;DECREMENT COUNTER UNTIL ITS ZERO GOTO L_SHIFT CLRF PORTC ;WHEN COUNTER IS ZERO IT'S END OF ;TRANSMISSION RETURN ;RETURN FROM SUBROUTINE */ //************************************* //***** SPI CLOCK 產生程式 //************************************* void SEND_SPI(int8 data) { int8 i; for (i=0;i<8;i++) { if ( data & 0x80) output_high(P_DI); else output_low(P_DI); output_high(P_CLK); data <<=1; output_low(P_CLK); } } //**************************************** //***** 送出電阻值 ***** //**************************************** void SEND_RVALUE(void) { output_low(P_CS); SEND_SPI(COMMAND); SEND_SPI(R_VALUE); output_high(P_CS); } //***************************************** //***** 剛剛開機時一些設定 ***** //***** 將MCP41010設定在中心值 ***** //***************************************** void POWER_ON_INIT(void) { set_tris_a(0xf8); R_VALUE = 140; SEND_RVALUE(); } //*************************************** //****** 檢查按鍵 ***** //*************************************** void CHECK_KEY(void) { if ((input(P_KEY1))&&(input(P_KEY2))) return; if (!input(P_KEY1)) // if key1 input { R_VALUE++; SEND_RVALUE(); // send the r_value to MCP41010 while(!input(P_KEY1)); // wait KEY1 = 1 return; } if (!input(P_KEY2)) // if key2 input { R_VALUE--; SEND_RVALUE(); while(!input(P_KEY2)); return; } } //********************************* //***** main Loop ***** //********************************* void main(void) { POWER_ON_INIT(); // power on initial setup while(1) { CHECK_KEY(); // read key detect } } 因為我也在試這一顆IC昨天剛好實驗成功所以可以交流一下 我還沒有測試靜電,電源雜訊方面的測試所以這一方面的對策麻煩自己加上如果發現BUG麻煩你貼上來,我也可以順變更新一下,感恩啊。 剛剛我又改良一下程式 CCS PCM C Compiler, Version 3.222, 16465 09-八月-05 12:05 Filename: D:\Microchip\P12F675\mcp41010_test\v050808\mcp41010.LST ROM used: 132 words (13%) Largest free fragment is 892 RAM used: 3 (5%) at main() level 5 (8%) worst case Stack: 3 locations * 0000: MOVLW 00 0001: MOVWF 0A 0002: GOTO 004 0003: NOP 0004: CALL 3FF 0005: BSF 03.5 0006: MOVWF 10 0007: MOVLW 00 0008: MOVWF 0A 0009: GOTO 060 .................... /* .................... #include <p16f876.inc> .................... ERRORLEVEL -302 .................... __CONFIG _BODEN_OFF & _PWRTE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC .................... .................... .................... ;**************************************************************************************** .................... ;******************** VARIABLES ******************************************************* .................... ;**************************************************************************************** .................... .................... .................... CBLOCK H'20' .................... OUT, COUNT ;VARIABLES USED TO TRANSMIT SERIAL DATA .................... ENDC .................... .................... .................... ;**************************************************************************************** .................... ;******************** EQUATES ********************************************************* .................... ;**************************************************************************************** .................... .................... .................... CS EQU H'00' ;PORTC: <7> CHIP SELECT .................... SCLK EQU H'03' ; <6> SERIAL CLOCK .................... SI EQU H'05' ; <5> SERIAL DATA .................... .................... COMMAND EQU H'13' ;VARIABLE FOR THE COMMAND BYTE .................... R_VALUE EQU D'140' ;VARIABLE FOR THE RESISTANCE VALUE .................... .................... .................... ;**************************************************************************************** .................... ;******************** PROGRAM ORIGIN ************************************************** .................... ;**************************************************************************************** .................... .................... .................... ORG 0x00 .................... .................... .................... ;---------------------------------------------------------------------------------------- .................... ;-------------------- PORT SETTING ---------------------------------------------------- .................... ;---------------------------------------------------------------------------------------- .................... .................... .................... BCF STATUS, RP0 ;MAKE SURE TO BE IN BANK 0 .................... BCF STATUS, RP1 ; .................... .................... BSF STATUS, RP0 ;GO TO BANK 1 .................... MOVLW 0x00 .................... MOVWF TRISA ;MAKE PORTA AN OUTPUT .................... MOVWF TRISC ;MAKE PORTC AN OUTPUT .................... BCF STATUS, RP0 ;RETURN TO BANK 0 .................... .................... CLRF PORTC ;CLEAR PORTB .................... .................... .................... ;---------------------------------------------------------------------------------------- .................... ;-------------------- PROGRAM ROUTINE ------------------------------------------------- .................... ;---------------------------------------------------------------------------------------- .................... .................... .................... BCF PORTA, CS ;SELECT THE POT .................... .................... MOVLW COMMAND ;LOAD THE COMMAND BYTE IN THE ACCUMULATOR .................... CALL TRANSMIT ;TRANSMIT THE COMMAND BYTE .................... .................... MOVLW R_VALUE ;LOAD THE RESISTANCE VALUE IN THE ACCUMULATOR .................... CALL TRANSMIT ;TRANSMIT THE RESISTANCE VALUE .................... .................... BSF PORTA, CS ;UNSELECT THE POT .................... .................... GOTO FINISH ;FINISH .................... .................... .................... ;---------------------------------------------------------------------------------------- .................... ;-------------------- TRANSMISION SUBROUTINE ------------------------------------------ .................... ;---------------------------------------------------------------------------------------- .................... .................... .................... TRANSMIT MOVWF OUT ;MOVE W TO 'OUT' VARIABLE .................... .................... MOVLW 0X08 ;LOAD A COUNTER TO 'COUNT' THE BIT .................... MOVWF COUNT ;TRANSMISSION .................... .................... L_SHIFT BTFSC OUT, 7 ;MONITOR THE 7TH BIT .................... GOTO HI .................... BCF PORTC, SI ;IF LOW: CLEAR SERIAL-IN LINE .................... GOTO PASS .................... HI BSF PORTC, SI ;IF HI: SET SERIAL-IN LINE .................... .................... PASS BSF PORTC, SCLK ;SET SERIAL CLOCK: HI .................... RLF OUT, F ;ROTATE OUT LEFT .................... BCF PORTC, SCLK ;SET SERIAL CLOCK: LOW .................... .................... DECFSZ COUNT, F ;DECREMENT COUNTER UNTIL ITS ZERO .................... GOTO L_SHIFT .................... .................... CLRF PORTC ;WHEN COUNTER IS ZERO IT'S END OF .................... ;TRANSMISSION .................... RETURN ;RETURN FROM SUBROUTINE .................... .................... .................... ;**************************************************************************************** .................... .................... .................... FINISH GOTO FINISH .................... .................... END .................... .................... .................... ;******************** END OF PROGRAM ************************************************** .................... .................... #endif .................... */ .................... //************************************************************** .................... //***** program by XXXXX保留 .................... //***** Date : 2005-08-08 .................... //***** Version : 1.0 .................... //***** SPI communication .................... //***** controller MCP41010 .................... //************************************************************** .................... .................... #include <12f675.h> .................... //////// Standard Header file for the PIC12F675 device //////////////// .................... #device PIC12F675 .................... #list .................... .................... #fuses INTRC_IO,NOWDT,NOPROTECT, NOMCLR .................... #use delay(clock=4000000) * 004B: MOVLW 23 004C: MOVWF 04 004D: MOVF 00,W 004E: BTFSC 03.2 004F: GOTO 05F 0050: MOVLW 01 0051: MOVWF 21 0052: CLRF 20 0053: DECFSZ 20,F 0054: GOTO 053 0055: DECFSZ 21,F 0056: GOTO 052 0057: MOVLW 4A 0058: MOVWF 20 0059: DECFSZ 20,F 005A: GOTO 059 005B: NOP 005C: NOP 005D: DECFSZ 00,F 005E: GOTO 050 005F: GOTO 082 (RETURN) .................... //int8 PORTDATA; .................... #byte gpio = 05 .................... #bit P_CS = gpio.0 .................... #bit P_DI = gpio.1 .................... #bit P_CLK = gpio.2 .................... #bit P_KEY1 = gpio.3 .................... #bit P_KEY2 = gpio.4 .................... #bit P_DEBUG = gpio.5 .................... /* .................... #define GP0 PIN_A0 .................... #define GP1 PIN_A1 .................... #define GP2 PIN_A2 .................... #define GP3 PIN_A3 .................... #define GP4 PIN_A4 .................... #define GP5 PIN_A5 .................... #define P_CS GP0 // pin7 .................... #define P_DI GP1 // pin6 .................... #define P_CLK GP2 // pin5 .................... #define P_KEY1 GP3 // pin4 .................... #define P_KEY2 GP4 // pin3 .................... #define P_DEBUG GP5 // PIN2 .................... */ .................... //#define P_SCL GP4 .................... #zero_ram // clear all RAM memory .................... #define COMMAND 0X13 .................... //#define R_VALUE 140 .................... int8 R_VALUE; .................... /* .................... ********************************************************************** .................... ***** program by 保留 .................... ***** Date: 2005-08-08 .................... ***** version : 1.0 .................... ********************************************************************** .................... for Microchip asm .................... .................... TRANSMIT MOVWF OUT ;MOVE W TO 'OUT' VARIABLE .................... .................... MOVLW 0X08 ;LOAD A COUNTER TO 'COUNT' THE BIT .................... MOVWF COUNT ;TRANSMISSION .................... .................... L_SHIFT BTFSC OUT, 7 ;MONITOR THE 7TH BIT .................... GOTO HI .................... BCF PORTC, SI ;IF LOW: CLEAR SERIAL-IN LINE .................... GOTO PASS .................... HI BSF PORTC, SI ;IF HI: SET SERIAL-IN LINE .................... .................... PASS BSF PORTC, SCLK ;SET SERIAL CLOCK: HI .................... RLF OUT, F ;ROTATE OUT LEFT .................... BCF PORTC, SCLK ;SET SERIAL CLOCK: LOW .................... .................... DECFSZ COUNT, F ;DECREMENT COUNTER UNTIL ITS ZERO .................... GOTO L_SHIFT .................... .................... CLRF PORTC ;WHEN COUNTER IS ZERO IT'S END OF .................... ;TRANSMISSION .................... RETURN ;RETURN FROM SUBROUTINE .................... .................... */ .................... //************************************* .................... //***** SPI CLOCK 產生程式 .................... //************************************* .................... void SEND_SPI(int8 data) .................... { .................... int8 i; .................... for (i=0;i<8;i++) * 000A: CLRF 24 000B: MOVF 24,W 000C: SUBLW 07 000D: BTFSS 03.0 000E: GOTO 01A .................... { .................... if ( data & 0x80) 000F: BTFSS 23.7 0010: GOTO 013 .................... P_DI = 1; //output_high(P_DI); 0011: BSF 05.1 .................... else 0012: GOTO 014 .................... P_DI = 0; //output_low(P_DI); 0013: BCF 05.1 .................... .................... P_CLK = 1; //output_high(P_CLK); 0014: BSF 05.2 .................... data <<=1; 0015: BCF 03.0 0016: RLF 23,F .................... P_CLK = 0; //output_low(P_CLK); 0017: BCF 05.2 .................... .................... } 0018: INCF 24,F 0019: GOTO 00B .................... } 001A: RETLW 00 .................... //**************************************** .................... //***** 送出電阻值 ***** .................... //**************************************** .................... void SEND_RVALUE(void) .................... { .................... P_CS = 0; //output_low(P_CS); 001B: BCF 05.0 .................... SEND_SPI(COMMAND); 001C: MOVLW 13 001D: MOVWF 23 001E: CALL 00A .................... SEND_SPI(R_VALUE); 001F: MOVF 22,W 0020: MOVWF 23 0021: CALL 00A .................... P_CS = 1; //output_high(P_CS); 0022: BSF 05.0 .................... .................... } 0023: RETLW 00 .................... //***************************************** .................... //***** 剛剛開機時一些設定 ***** .................... //***** 將MCP41010設定在中心值 ***** .................... //***************************************** .................... void POWER_ON_INIT(void) .................... { .................... set_tris_a(0x18); 0024: MOVLW 18 0025: BSF 03.5 0026: MOVWF 05 .................... R_VALUE = 140; 0027: MOVLW 8C 0028: BCF 03.5 0029: MOVWF 22 .................... SEND_RVALUE(); 002A: CALL 01B .................... } 002B: GOTO 07D (RETURN) .................... //*************************************** .................... //****** 檢查按鍵 ***** .................... //*************************************** .................... void CHECK_KEY(void) .................... { .................... if ((P_KEY1==1)&&(P_KEY2==1)) //((input(P_KEY1))&&(input(P_KEY2))) 002C: BTFSS 05.3 002D: GOTO 030 002E: BTFSC 05.4 .................... return; 002F: GOTO 044 .................... if (P_KEY1==0) //(!input(P_KEY1)) // if key1 input 0030: BTFSC 05.3 0031: GOTO 03A .................... { .................... R_VALUE++; 0032: INCF 22,F .................... if (R_VALUE >=255) 0033: INCFSZ 22,W 0034: GOTO 036 .................... R_VALUE = 0; 0035: CLRF 22 .................... SEND_RVALUE(); // send the r_value to MCP41010 0036: CALL 01B .................... while(P_KEY1==0); //(!input(P_KEY1)); // wait KEY1 = 1 0037: BTFSS 05.3 0038: GOTO 037 .................... return; 0039: GOTO 044 .................... } .................... if (P_KEY2==0) //(!input(P_KEY2)) // if key2 input 003A: BTFSC 05.4 003B: GOTO 044 .................... { .................... R_VALUE--; 003C: DECFSZ 22,F .................... if (R_VALUE==0) 003D: GOTO 040 .................... R_VALUE = 255; 003E: MOVLW FF 003F: MOVWF 22 .................... SEND_RVALUE(); 0040: CALL 01B .................... while (P_KEY2==0); //(!input(P_KEY2)); 0041: BTFSS 05.4 0042: GOTO 041 .................... return; 0043: GOTO 044 .................... } .................... .................... } 0044: GOTO 07E (RETURN) .................... void debug_pin(void) .................... { .................... P_DEBUG = 0; //output_low(P_DEBUG); 0045: BCF 05.5 .................... delay_us(3); 0046: NOP 0047: NOP 0048: NOP .................... P_DEBUG = 1; //output_high(P_DEBUG); 0049: BSF 05.5 .................... } 004A: GOTO 07F (RETURN) .................... //********************************* .................... //***** main Loop ***** .................... //********************************* .................... void main(void) .................... { * 0060: MOVLW 1F 0061: ANDWF 03,F 0062: MOVLW 3F 0063: MOVWF 20 0064: MOVLW 21 0065: MOVWF 04 0066: CLRF 00 0067: INCF 04,F 0068: DECFSZ 20,F 0069: GOTO 066 006A: CLRF 20 006B: CLRF 04 006C: MOVLW 1F 006D: ANDWF 03,F 006E: BCF 1F.6 006F: BSF 03.5 0070: BCF 1F.0 0071: BCF 1F.1 0072: BCF 1F.2 0073: BCF 1F.3 0074: MOVLW 07 0075: BCF 03.5 0076: MOVWF 19 0077: BSF 03.5 0078: MOVF 05,W 0079: BCF 03.5 007A: MOVF 19,W 007B: BCF 0C.3 .................... POWER_ON_INIT(); // power on initial setup 007C: GOTO 024 .................... while(1) .................... { .................... CHECK_KEY(); // read key detect 007D: GOTO 02C .................... debug_pin(); 007E: GOTO 045 .................... delay_ms(5); 007F: MOVLW 05 0080: MOVWF 23 0081: GOTO 04B .................... } 0082: GOTO 07D .................... } .................... 0083: SLEEP Configuration Fuses: Word 1: 31D4 NOWDT NOCPD NOPROTECT NOMCLR NOPUT INTRC_IO BROWNOUT C 寫是比較快但是CODE比較大所以我又改變方式這樣看起來比較像是組合語言寫的 CODE也比較短。 CC
發表於: 2005/8/9 8:01
|
|||
|
Re: MCP42XXX的SPI傳輸
|
||||
---|---|---|---|---|
高級會員
|
我剛好有sample code,這是使用軟體模擬SPI介面,
下面那一個是硬體介面(MCU內含的SPI)範例程式 再下面是CCS C 寫的那是測試版本可能有BUG不過可以動作啦 因為只花十分鐘寫的,還沒有使用滿清十大酷刑伺候過,所以麻煩自己TRY一下。 #include <p16f876.inc> ERRORLEVEL -302 __CONFIG _BODEN_OFF & _PWRTE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC ;**************************************************************************************** ;******************** VARIABLES ******************************************************* ;**************************************************************************************** CBLOCK H'20' OUT, COUNT ;VARIABLES USED TO TRANSMIT SERIAL DATA ENDC ;**************************************************************************************** ;******************** EQUATES ********************************************************* ;**************************************************************************************** CS EQU H'00' ;PORTC: <7> CHIP SELECT SCLK EQU H'03' ; <6> SERIAL CLOCK SI EQU H'05' ; <5> SERIAL DATA COMMAND EQU H'13' ;VARIABLE FOR THE COMMAND BYTE R_VALUE EQU D'140' ;VARIABLE FOR THE RESISTANCE VALUE ;**************************************************************************************** ;******************** PROGRAM ORIGIN ************************************************** ;**************************************************************************************** ORG 0x00 ;---------------------------------------------------------------------------------------- ;-------------------- PORT SETTING ---------------------------------------------------- ;---------------------------------------------------------------------------------------- BCF STATUS, RP0 ;MAKE SURE TO BE IN BANK 0 BCF STATUS, RP1 ; BSF STATUS, RP0 ;GO TO BANK 1 MOVLW 0x00 MOVWF TRISA ;MAKE PORTA AN OUTPUT MOVWF TRISC ;MAKE PORTC AN OUTPUT BCF STATUS, RP0 ;RETURN TO BANK 0 CLRF PORTC ;CLEAR PORTB ;---------------------------------------------------------------------------------------- ;-------------------- PROGRAM ROUTINE ------------------------------------------------- ;---------------------------------------------------------------------------------------- BCF PORTA, CS ;SELECT THE POT MOVLW COMMAND ;LOAD THE COMMAND BYTE IN THE ACCUMULATOR CALL TRANSMIT ;TRANSMIT THE COMMAND BYTE MOVLW R_VALUE ;LOAD THE RESISTANCE VALUE IN THE ACCUMULATOR CALL TRANSMIT ;TRANSMIT THE RESISTANCE VALUE BSF PORTA, CS ;UNSELECT THE POT GOTO FINISH ;FINISH ;---------------------------------------------------------------------------------------- ;-------------------- TRANSMISION SUBROUTINE ------------------------------------------ ;---------------------------------------------------------------------------------------- TRANSMIT MOVWF OUT ;MOVE W TO 'OUT' VARIABLE MOVLW 0X08 ;LOAD A COUNTER TO 'COUNT' THE BIT MOVWF COUNT ;TRANSMISSION L_SHIFT BTFSC OUT, 7 ;MONITOR THE 7TH BIT GOTO HI BCF PORTC, SI ;IF LOW: CLEAR SERIAL-IN LINE GOTO PASS HI BSF PORTC, SI ;IF HI: SET SERIAL-IN LINE PASS BSF PORTC, SCLK ;SET SERIAL CLOCK: HI RLF OUT, F ;ROTATE OUT LEFT BCF PORTC, SCLK ;SET SERIAL CLOCK: LOW DECFSZ COUNT, F ;DECREMENT COUNTER UNTIL ITS ZERO GOTO L_SHIFT CLRF PORTC ;WHEN COUNTER IS ZERO IT'S END OF ;TRANSMISSION RETURN ;RETURN FROM SUBROUTINE ;**************************************************************************************** FINISH GOTO FINISH END ;******************** END OF PROGRAM **************************************************
發表於: 2005/8/9 8:00
|
|||
|
an899应用问题
|
||||
---|---|---|---|---|
新會員
|
按照an899的电路,设计一套bldc马达驱动系统,在1000转时(hall反馈为20ms时)系统有震荡,其余调速范围内均正常,不得其解,望各位帮帮忙。快急死了。多谢!!!
發表於: 2005/8/8 20:36
|
|||
|
Re: 內部四倍頻有點問題...
|
||||
---|---|---|---|---|
資深會員
|
對了
我的震盪器是用2隻腳的 需外接起震電容那種 我看規格書上寫 這種震盪器也可工作在HS模式 應該也可以4倍頻吧?! 還是說要用4倍頻最好是用4隻腳的震盪器? 以EC方式把頻率從OSC1送進去給他4倍頻??
發表於: 2005/8/8 19:35
|
|||
|
Re: ADRESH和ADRESL
|
||||
---|---|---|---|---|
資深會員
|
ADRESH跟ADRESL哪個放8位元哪個放2位元
是跟設定要向左靠齊或向右靠齊有關 但是一般如果不想自找麻煩的話 要用10位元就選向右靠齊 此時ADRESH放上2位元,ADRESL放下8位元
000000AB CDEFGHIJ
而如果只想用8位元就選向左靠齊 此時ADRESH放上8位元,ADRESL放下2位元
ABCDEFGH IJ000000
雖然他仍然是做10位元AD轉換 但只要取ADRESH上八位元,ADRESL別管他 就可以當作8位元AD轉換了
發表於: 2005/8/8 18:14
|
|||
|
內部四倍頻有點問題...
|
||||
---|---|---|---|---|
資深會員
|
PIC18F8621
石英震盪器4M Hz 起震電容 15p 也順便試過22p 47p 有一點很奇怪 我用測試I/O的程式去測試 只有選XT模式才能正常工作 用HS或 HS-PLL 都沒反應 但是相同的IC燒錄實際要用的程式 選XT HS HS-PLL卻都可以工作... 以下是我用來測試I/O的程式 只是個簡單的跑馬燈 測試IC有無假焊 實在是想不出來問題點在哪...
;連續旋轉 B0=0左旋 B1=0右旋
發表於: 2005/8/8 18:01
|
|||
|
Re: PIC18 ADC function!!!
|
||||
---|---|---|---|---|
高級會員
|
另外請教一下
我第一個指令把AD的FUNCTION開啟是如以下所示 OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_5ANA_0REF, ADC_CH0 & ADC_INT_OFF); 可是那接下來我要怎麼去切換CHANNEL到CH1~CH4呢 如果我是用ADCON0bit.CHS3這樣一次也只能設一個bit 很麻煩 有沒有什麼辦法能直接設CHS3~CHS0直接讓它加1呢 請高手不吝指教 謝謝
發表於: 2005/8/8 17:35
|
|||
|
Re: ADRESH和ADRESL
|
||||
---|---|---|---|---|
高級會員
|
ADRESH(2 Bit) + ADRESL (8 Bit) = 10 Bit
如果要存取完整的10 Bit 必須分兩次存取.. 或用向左向右對齊來處理...
發表於: 2005/8/8 17:27
|
|||
|