2017-04-06 172 views
-1

我正在開發固件來控制定製電路板上的PIC18F45k80引腳排列。 在使用最終版本加載和編程此圖片之前,我正在用最簡單的用戶代碼測試我的程序/調試環境(MPLABX IDE + Pickit3):以50 ms的週期切換一些portD輸出。如何正確配置PIC18端口D的輸出方向?

它們的3個引腳可以正常工作(RD6,RD5,RD4),但不是RD3和R2的情況。他們沒有信號,他們永遠不會開啓。該引腳仍然具有0的所有執行時間。所有的引腳配置,並在同一時間以同樣的方式被激活,你可以在接下來的代碼中看到:

的main.c文件:

//C libraries 
#include <stdio.h> 
#include <stdint.h> 
#include <stdbool.h> 

#include <pic18f45k80.h> 
#include "18f45k80_mainconfig.h" 
#include <xc.h> 

//Application dependent libraries 
#include "gold_whyl_task.h" 

/*outputs defines*/ 
#define CADENZA  PORTDbits.RD2 //problem with this bit 
#define CAPW  PORTDbits.RD3 //problem with this bit 
#define FREQFISSA PORTDbits.RD4 
#define FISSAWAIL PORTDbits.RD5 
#define COMCICLOSIR PORTDbits.RD6 

/*inputs - debug*/ 
#define PGC   PORTBbits.RB6 
#define PGD   PORTBbits.RB7 

int main() 
    { 

    TRISDbits.TRISD0=1;//input ACTIVACIOn 
    TRISDbits.TRISD1=1;//input CLACSON 
    TRISBbits.TRISB6=1;//pdg 
    TRISBbits.TRISB7=1;//pdc 

    /*outputs*/ 
    TRISDbits.TRISD2=0;//output CADENZA //problem with this 
    TRISDbits.TRISD3=0;//output CAPW //problem with this 

    TRISDbits.TRISD4=0;//output FREQFIJA 
    TRISDbits.TRISD5=0;//output FIJAWAIL 
    TRISDbits.TRISD6=0;//output COMCICLOSIR 

    while(1) 
     { 
      COMCICLOSIR=0; 
      FISSAWAIL=0; 
      CAPW=0; 
      CADENZA=0; 
      FREQFISSA=0; 

      __delay_ms(50); 
      COMCICLOSIR=1; 
      FISSAWAIL=1; 
      CAPW=1; //this assignment has no effect --> it stills 0 
      CADENZA=1;//this assignment has no effect--> it stills 0  
      FREQFISSA=1; 
      __delay_ms(50); 
     } 
} 

什麼能發生? 定義,端口配置等有問題嗎?

+0

我們有單獨的微控制器和電子交換站點:http://electronics.stackexchange.com/ – arminb

+0

你是什麼意思?我遵循指示,我總是以相同的方式配置輸入和輸出,但是我從來沒有隻有端口的一部分工作,並且沒有其他部分工作,即使以完全相同的方式配置完整端口。數據表能給我關於這種行爲的什麼樣的信息? –

+0

這些引腳怎麼樣?所有電路都一樣嗎?也許你必須使用寄存器「PADCFG1」啓用上拉。 – LPs

回答

3

您應經常檢查datasheet

MCU有一個A/D port,不幸的是你,默認情況下它使用RD2RD3

您可以在page 364,ADCON1 reg處看到,它使這些引腳成爲模擬。

enter image description here

page 92您可以在啓動時在ADCON1寄存器看到的配置:-111 1111

enter image description here

這意味着,在開機/ browout/WDT/reste ... RD2RD3是設置爲模擬輸入。

您必須禁用A/D轉換器的引腳才能使用這些引腳作爲I/O

我沒有Microchip的SDK,但你必須這樣做

ADCON1 &= 0x9F; 

要設置bit 6bit 50,使RD2RD3作爲I/O

+0

我一直認爲奇怪的是,Microchip決定默認一些端口是模擬的,但我猜它會讓它變高Z。 –

+0

@Colin__s最有可能... – LPs

-1

他們都是相同的連接,內部上拉與這些引腳連接,但在配置輸出時自動關閉。但現在我已經找到了問題的工具包。 PORTDbits.RD2允許您從引腳讀取數據並寫入其中,但沒有保證(這是一些引腳工作而不是其他引腳的原因)。取而代之,我使用LATD選項,在引腳配置爲輸出時寫入引腳。現在它可以工作。

+0

@LPs我配置了ANCON1 = 0x00(我在其他文件中包含);在撰寫與我已評論的問題的第一篇文章之前。我再次閱讀了數據表和其他資源,其中討論了LAT和PORT之間的差異。他們建議總是使用LAT寫入輸出引腳。我試圖用PORT寫一個數字輸出。 –