2017-02-16 101 views
1

這是我的第一個問題,因爲我是編碼新手。卡在學習位時

那麼,我想在SPI中使用一個MCP digipot。由於我使用的是PIC16,使用C語言編寫,我瞭解到XC8庫不能包含在PIC16項目中......所以我認爲我會學到很多東西,通過點擊,理解我的工作......

但是...似乎沒有工作!所以我做了一些延遲的LED版本,以便看看發生了什麼。

我有兩個問題:第一,「命令」數據似乎沒有轉移。我只能看到第一個閃光燈,然後結果。 「時鐘」LED工作正常,閃爍8次。

另外,我不明白爲什麼我的無限循環不是無限的。我得到幾個週期,然後主函數被回調,等等。這與我的延遲有關,因爲當我改變延遲時,它會改變週期數。

這裏是我的代碼:

#include <stdio.h> 
#include <pic16f18875.h> 

#define temoin LATAbits.LATA0 
#define CS LATAbits.LATA1 
#define CLK LATAbits.LATA2 
#define DAT LATAbits.LATA3 

#define MASK = 0x80 //isolate the MSB 

unsigned char commande = 0b10011000; //led sequence to be observed (command) 

void delay(void) 
    {    int f, g; 
        for(f=0;f<1000;f++) 
      { 
         for(g=0;g<1;g++) 
        { } } }  //simple delay      

void main() 
{ 
     int i; 

//init       
     TRISA=0x00; //porta as output 
     LATA = 0x00; //init all bits to 0   

     CS=0; //enable writing    

//send command 

     for (i=0; i<8; i++) //browse through the command byte 
      { 

      if (commande & MASK) //read msb and compare      
        DAT = 1;       
      else       
        DAT = 0; 


       CLK=1; //clock signal 
       delay();     
       CLK=0; 
       delay(); 

       commande <<=1; //left shift, read next bit 

      } 

     CS = 1; 

     while (1) //just a heartbeat 
     { 
      temoin = 1; 
      delay();    
      temoin = 0; 
      delay();    
     } 
} 

我真的嘗試了很多在網上找到的任何信息,但沒有爲我工作的罰款。我可能只是缺乏特殊的C語言知識,但我無法分辨出什麼。

在此先感謝!

乾杯

回答

0

我敢肯定你的問題很簡單,你的#define被搞砸:

#define MASK = 0x80 //isolate the MSB 
      ^- ??? 

那等號最終得到視爲定義的一部分,所以預處理器將擴大

if (commande & MASK) //read msb and compare 

到:

if (commande & = 0x80) //read msb and compare 

這不是你想要的!這最後修改if語句中的commande,掩蓋了所有低於0x80的位。

刪除定義中的=應該解決這個問題。


關於另一部分 - 無限循環不是無限的 - 請確保您的處理器沒有啓用看門狗定時器。您可能需要在熔絲位中禁用它。

+0

非常感謝這麼多人! 它適用於兩個想法,完美。 –