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

論壇索引


Board index » All Posts (pic5566)




Re: 燒錄時間太長
#31
高級會員
高級會員


更新MPLAB IDE 7.11版試試看
7.2版好像不能載入HEX檔案

發表於: 2005/8/9 12:22
頂部


Re: 電源問題
#32
高級會員
高級會員


可以是一下DC TO DC
TI有那真的很爽,溫度超低,TI可以提供DEMO BOARD
先弄一個來玩玩看
我一次跟他要了三組,不過前提是要跟他買IC啦有一點麻煩


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


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


;****************************************************************************************
; *
; *
; 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傳輸
#34
高級會員
高級會員


我剛好有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
頂部


Re: 電源問題
#35
高級會員
高級會員


大仔:
你7805 input電壓弄15v當然燙啊
我建議你輸入電壓用8V就不會那麼燙
不然你熱機一定過不了
加散熱片就是增加成本

發表於: 2005/8/8 17:01
頂部


Re: 想請問I2C應用範例
#36
高級會員
高級會員


SORRY
我又忘了交代,這一些函數我都有測試過是量產程式基本上沒問題我是寫來控制microchip MCP23016的
你應該可以很容易改成控制EEPROM或者其他IIC的裝置
還有一點這一個程式為了抗雜訊干擾還加上當通訊沒有獲得ACK信號他會送出STOP然後重新RETRY 10次
所以看起來有一點複雜
慢慢看吧
不懂再問
OK
我是用pic12f508寫的
所以你用pic18f452他應該有硬體的IIC介面C18也有支援IIC函數,你如果不想用內部硬體介面當然也可以使用這一些函數。
不過你要注意一下IO PORT方向設定
不然動不了

發表於: 2005/8/8 16:01
頂部


Re: 想請問I2C應用範例
#37
高級會員
高級會員


忘了跟你講
這是用CCS C compiler寫的
如果用其他的c compiler 可以改成
output_high(P_xx)------> P_xx = 1;
output_low(P_xx)-------> P_xx = 0;
output_high();
output_low();
這是CCS 內定函數

發表於: 2005/8/8 15:56
頂部


Re: 想請問I2C應用範例
#38
高級會員
高級會員


void IIC_INIT(void)
{
output_high(P_SDA);
output_high(P_SCL);
}
void IIC_WAIT(void)
{
delay_us(10);
}

void IIC_START(void)
{
output_high(P_SDA); //P_SDA = 1;
output_high(P_SCL); //P_SCL = 1;
IIC_WAIT();
output_low(P_SDA); //P_SDA = 0;
IIC_WAIT();
output_low(P_SCL); //P_SCL = 0;

}
//***** VERSION : 1.0 *****
// /------------
// SCL -----/
//
// /----------
// SDA-------/
//
// SCL先拉HI SDA 再跟著拉HI
//
//***********************************

void IIC_STOP(void)
{
output_low(P_SDA); //P_SDA = 0;
IIC_WAIT();
output_high(P_SCL); //P_SCL = 1;
IIC_WAIT();
output_high(P_SDA); //P_SDA = 1;
}
int8 IIC_SEND_BYTE(int8 databyte)
{
int8 i;
int8 ack;
for(i = 0;i<8;i++)
{
if ( databyte & 0x80)
output_high(P_SDA);
else
output_low(P_SDA);
databyte <<=1;
// IIC_WAIT();
output_high(P_SCL);
IIC_WAIT();
output_low(P_SCL);
// IIC_WAIT();

}
//in 8051 mcu is setting input mode output_high(P_SDA);
input(P_SDA);
IIC_WAIT();
output_high(P_SCL);
IIC_WAIT();
IIC_WAIT();
IIC_WAIT();
ack = input(P_SDA);
output_low(P_SCL);
IIC_WAIT();


return ack;
}
int8 IIC_RECEIVE_BYTE(void)
{
int8 i;
int8 databyte =0;
input(P_SDA);
for (i=0;i<8;i++)
{
output_high(P_SCL);
IIC_WAIT();
databyte <<=1;
if (input(P_SDA)) databyte |= 0x01;
output_low(P_SCL);
IIC_WAIT();

}
return databyte;
}

void SEND_ACK(int8 ack)
{
if (ack==0x01)
output_high(P_SDA);
else
output_low(P_SDA);
output_high(P_SCL);
IIC_WAIT();
output_low(P_SCL);

}
void IIC_BYTEWRITE(int8 device,int8 address,int8 databyte1,int8 databyte2)
{
int8 i;
int8 ack;
for (i=0;i<10;i++)
{
IIC_START();
ack = IIC_SEND_BYTE(device);
if (ack==1)
{
IIC_STOP();
continue;
}
ack = IIC_SEND_BYTE(address);
if (ack==1)
{
IIC_STOP();
continue;
}
ack = IIC_SEND_BYTE(databyte1);
if (ack==1)
{
IIC_STOP();
continue;
}
ack = IIC_SEND_BYTE(databyte2);
if (ack==1)
{
IIC_STOP();
continue;
}

IIC_STOP();
if (ack==0) break;

}
delay_us(2);
}
void IIC_READ_IOPORT(int8 device,int8 command)
{
int8 i;
int8 ack;
// F_SENDTIMEOUT = 1;
for (i=0;i<10;i++)
{
IIC_START();
ack = IIC_SEND_BYTE(device);
if (ack==1)
{
IIC_STOP();
continue;
}
ack = IIC_SEND_BYTE(command);
if (ack==1)
{
IIC_STOP();
continue;
}
IIC_STOP();
if (ack==0) break;

}

delay_us(2);
PORTDATA = IIC_RECEIVE_BYTE();

}
void READ_IO(int8 address,int8 command,int8 address1)
{
int8 i;
int8 ack;
/*
i2c_start(); // Generate START condition
i2c_write(AddressW); // Transmit ADDRESS with WRITE command
i2c_write(Command); // Transmit COMMAND byte
i2c_repStart(); // Generate a REPEATED-START condition
i2c_write(AddressR); // Transmit ADDRESS with READ command
MCP_LSB=i2c_read(1); // Receive first DATA byte (LSB) and acknowledge
MCP_MSB=i2c_read(0); // Receive second DATA byte (MSB) and don't acknowledge
i2c_stop(); // Generate a STOP condition
*/
// F_SENDTIMEOUT = 1;
for (i=0;i<10;i++)
{
IIC_START();
ack = IIC_SEND_BYTE(address);
if (ack==1)
{
IIC_STOP();
continue;
}
ack = IIC_SEND_BYTE(command);
if (ack==1)
{
IIC_STOP();
continue;
}
if (ack==0) break;
}
delay_us(14);
for (i=0;i<10;i++)
{
IIC_START();
ack = IIC_SEND_BYTE(address1);
if (ack==1)
{
IIC_STOP();
continue;
}
if (ack==0) break;

}
BUFFER1 = IIC_RECEIVE_BYTE();
delay_us(20);
input(P_SDA);
IIC_WAIT();
output_high(P_SCL);
IIC_WAIT();
IIC_WAIT();
IIC_WAIT();
if (input(P_SDA))
{
IIC_STOP();
}
output_low(P_SCL);
IIC_WAIT();
BUFFER2 = IIC_RECEIVE_BYTE();
input(P_SDA);
IIC_WAIT();
output_high(P_SCL);
IIC_WAIT();
IIC_WAIT();
IIC_WAIT();
if (input(P_SDA))
{
IIC_STOP();
}
output_low(P_SCL);
IIC_WAIT();

IIC_STOP();
}

void main() {
delay_ms(100);
EXPANDER_IO_INITIAL();

while (TRUE)
{
if (!input(P_INTERRUPT))
{
debug_pin();
READ_IO(WRITECOMMAND_TO_IC,ACCES_GP1,READCOMMAND_FROM_IC);

while(!input(P_INTERRUPT));
}else
{
IIC_BYTEWRITE(WRITECOMMAND_TO_IC,ACCES_OLAT0,0X7F,0xff); //寫初始直
delay_ms(250);
IIC_BYTEWRITE(WRITECOMMAND_TO_IC,ACCES_OLAT0,0XBF,0xff); //寫初始直
delay_ms(250);
}

}
}


發表於: 2005/8/4 15:18
頂部


Re: 各位前輩...我有程式的問題想請教
#39
高級會員
高級會員


真是糟糕
接別人的程式很悲慘
他有include 什麼自己的定義檔嗎?
可以查一下那一些檔案
看看

發表於: 2005/6/14 13:48
頂部


Re: 菜鳥又有疑問囉???
#40
高級會員
高級會員


這時就需要所謂的分時多工了
嘿嘿我剛好會
簡單說明
首先在time設一個機時例如5ms time interrupt時設一個flag
然後使用main loop 輪詢
ex: for P12c508 no time interrupt 你可以選一顆比較強的MCU
使用起來更方便一點

call CLEAR_ALL_RAM ; CLEAR ALL RAM
CALL SYSTEM_INITIAL ; THE SYSTEM INITIAL

MOVLW .256-156 ;124 ;-+ set the timer for 1ms
MOVWF TMR0 ;-+
WAIT_LOOP:
BTFSC P_SYNC
GOTO SUB_PROC1
MOVF TMR0,W ; 1us
BTFSS STATUS,Z ; 1us
GOTO WAIT_LOOP ; 2us
call CHECK_TIME ; 10US
MOVLW .256-156 ;124 ; RELOAD TIMER VALUE
MOVWF TMR0
GOTO WAIT_LOOP
SUB_PROC1:
CALL PHASE_DELAY
CALL KEY_SCAN
CALL KEY_CHATTER
CALL MODE_PROC
WAIT_LOOP1:
BTFSS P_SYNC
GOTO SUB_PROC2
MOVF TMR0,W ; 1us
BTFSS STATUS,Z ; 1us
GOTO WAIT_LOOP1 ; 2us
call CHECK_TIME ; 10US
MOVLW .256-124 ; RELOAD TIMER VALUE
MOVWF TMR0
GOTO WAIT_LOOP1
SUB_PROC2:
CALL PHASE_DELAY
CALL KEY_SCAN
CALL KEY_CHATTER
CALL MODE_PROC
GOTO WAIT_LOOP

所有的時間都是這一個副程式在計算你要delay三年或五年隨你
完全不影響你的其他工作

;***********************************
;*** SYSTEM TIME CONTROL ROUTINE ***
;***********************************
CHECK_TIME: ; CALL TO HERE 2US
MOVF T_CNT1,f ; 1US
BTFSS STATUS,Z ; 1US
DECF T_CNT1,F ; 1US
MOVF KEY_CHT,f ; 1US
BTFSS STATUS,Z ; 1US
DECF KEY_CHT,F ; 1IS
movf KEY_REP,F
DECF KEY_REP,F
RETLW 0 ; 2US


發表於: 2005/6/14 13:45
頂部



« 1 2 3 (4) 5 6 7 ... 13 »



:::

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

教育訓練中心

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