• slider image 442
  • slider image 477
  • slider image 479
  • slider image 480
  • slider image 481
  • slider image 482
:::


Browsing this Thread:   1 Anonymous Users






Re: MCP42XXX的SPI傳輸
#4
高級會員
高級會員


查看用戶資訊
;****************************************************************************************
; *
; *
; 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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: MCP42XXX的SPI傳輸
#3
高級會員
高級會員


查看用戶資訊
我剛好有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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: MCP42XXX的SPI傳輸
#2
高級會員
高級會員


查看用戶資訊
10M Hz

發表於: 2005/8/8 13:21
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


MCP42XXX的SPI傳輸
#1
高級會員
高級會員


查看用戶資訊
請教一下

MCP42XXX的SPI傳輸速度可以到多少MHz呢
因為不曉得是要用那一個SPI_FOSC選項
如果我的內頻是跑到48MHz(PIC18F4550)
那麼那個SPI_FOSC是適合這個元件的呢

發表於: 2005/8/8 11:54
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------