• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::

論壇索引


Board index » All Posts




請問內部RC四倍頻怎麼弄?
資深會員
資深會員


我剛剛在測試PIC18F8627
PDF上說可以使用內部RC震盪器四倍頻
但只限於4M與8M

震盪器設定方式如下
CONFIG  =  INTIO67

    MOVLW   
B'01100011'
    
MOVWF   OSCCON
    MOVLW   
B'01000000'
    
MOVWF   OSCTUNE

他要求的兩個條件我都有達到
但結果卻只有4MHz並無四倍頻為16MHz
請問還缺少哪個條件呢?

發表於: 2005/8/9 10:26
頂部


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右旋
          
LIST  P=18F8621 R=DEC
          
#INCLUDE <P18F8621.INC>

;設定變數位址
TEMP     EQU   44H
TMP      EQU   46H
COUNTER  EQU   50H

;使用者重置向量
          ORG   00H
          
GOTO START
START
        MOVLW   
B'00001110'
        
MOVWF   OSCCON
        MOVLW   
B'00001111'
        
MOVWF   ADCON1
        MOVLW   
B'10000000'
        
MOVWF   TMP
         CLRF   TRISA
         CLRF   TRISB
         CLRF   TRISC
         CLRF   TRISD
         CLRF   TRISE
         CLRF   TRISF
         CLRF   TRISG
         CLRF   TRISH
         CLRF   TRISJ
_中文
         RLNCF TMP
         MOVFF TMP
,PORTA
         MOVFF TMP
,PORTB
         MOVFF TMP
,PORTC
         MOVFF TMP
,PORTD
         MOVFF TMP
,PORTE
         MOVFF TMP
,PORTF
         MOVFF TMP
,PORTG
         MOVFF TMP
,PORTH
         MOVFF TMP
,PORTJ
         CALL  DELAY1             
;呼叫時間延遲
     BRA  _中文
DELAY1
         MOVLW 100
         MOVWF 16H
DETT6
         MOVLW 100
         MOVWF 17H
DETT7
         MOVLW 12
         MOVWF 18H
DETT8
         DECFSZ 18H
         
GOTO   DETT8
         DECFSZ 17H
         
GOTO   DETT7
         DECFSZ 16H
         
GOTO   DETT6
         
RETURN
  
END

發表於: 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
頂部



« 1 ... 6979 6980 6981 (6982) 6983 6984 6985 ... 7522 »



:::

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... ]

教育訓練中心

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