Re: 燒錄時間太長
|
||||
---|---|---|---|---|
高級會員
|
更新MPLAB IDE 7.11版試試看
7.2版好像不能載入HEX檔案
發表於: 2005/8/9 12:22
|
|||
|
Re: 電源問題
|
||||
---|---|---|---|---|
高級會員
|
可以是一下DC TO DC
TI有那真的很爽,溫度超低,TI可以提供DEMO BOARD 先弄一個來玩玩看 我一次跟他要了三組,不過前提是要跟他買IC啦有一點麻煩
發表於: 2005/8/9 10:41
|
|||
|
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
|
|||
|
Re: 電源問題
|
||||
---|---|---|---|---|
高級會員
|
大仔:
你7805 input電壓弄15v當然燙啊 我建議你輸入電壓用8V就不會那麼燙 不然你熱機一定過不了 加散熱片就是增加成本
發表於: 2005/8/8 17:01
|
|||
|
Re: 想請問I2C應用範例
|
||||
---|---|---|---|---|
高級會員
|
SORRY
我又忘了交代,這一些函數我都有測試過是量產程式基本上沒問題我是寫來控制microchip MCP23016的 你應該可以很容易改成控制EEPROM或者其他IIC的裝置 還有一點這一個程式為了抗雜訊干擾還加上當通訊沒有獲得ACK信號他會送出STOP然後重新RETRY 10次 所以看起來有一點複雜 慢慢看吧 不懂再問 OK 我是用pic12f508寫的 所以你用pic18f452他應該有硬體的IIC介面C18也有支援IIC函數,你如果不想用內部硬體介面當然也可以使用這一些函數。 不過你要注意一下IO PORT方向設定 不然動不了
發表於: 2005/8/8 16:01
|
|||
|
Re: 想請問I2C應用範例
|
||||
---|---|---|---|---|
高級會員
|
忘了跟你講
這是用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應用範例
|
||||
---|---|---|---|---|
高級會員
|
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: 各位前輩...我有程式的問題想請教
|
||||
---|---|---|---|---|
高級會員
|
真是糟糕
接別人的程式很悲慘 他有include 什麼自己的定義檔嗎? 可以查一下那一些檔案 看看
發表於: 2005/6/14 13:48
|
|||
|
Re: 菜鳥又有疑問囉???
|
||||
---|---|---|---|---|
高級會員
|
這時就需要所謂的分時多工了
嘿嘿我剛好會 簡單說明 首先在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
|
|||
|