2017-02-16 3 views
1

이것은 코딩을 처음 접했을 때의 첫 번째 질문입니다.조금 두드리는 소리를 배우는 동안 붙어있다

글쎄, SPI에서 MCP 디지 포토를 사용하려고합니다. CIC로 작성한 PIC16을 사용하면서 XC8 라이브러리가 PIC16 프로젝트에 포함될 수 없다는 것을 알았습니다 ... 그래서 저는 비트 뱅잉, 내가하는 일에 대한 이해로 많은 것을 배울 것이라고 생각했습니다 ...

하지만 ... 작동하지 않는 것 같습니다! 그래서 나는 어떤 일이 일어나고 있는지를보기 위해 약간의 지연이있는 LED 버전을 만들었다.

두 가지 문제점이 있습니다. 첫째, "명령"데이터가 이동하지 않는 것 같습니다. 나는 첫 번째 비트 만 플래시를 볼 수있다. "clock"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

정말 고마워요! 두 아이디어 모두 완벽하게 작동했습니다. –