2011-05-16 5 views
2

마이크로 칩 버전 v8.63을 C 컴파일러와 함께 사용하고 있습니다.한 번 왼쪽으로 이동하고 값 형식을 가져 오십시오.

다음 코드는 한 번 '값 1206420333240d'로 옮기고 싶습니다. 1 비트가 캐리 레지스터에 들어 있다는 것을 알고 있습니다. 하지만 pic18F4550 어셈블리 언어에서이 값을 검색하는 방법을 모르겠습니다. 제 질문은, 18F4550 그림으로 어셈블러로 한 번 이동 한 다음 캐리에서 값을 가져올 수 있습니까?

전체 프로젝트에 포함되었습니다.

unsigned int rood = 1206420333240; 


void main (void) 
{ 
    //int rood[] = {0,0,1,0,1,0,1,0,1,0,1,1,1,0,0,0,0,1,1,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,1,0,1,0,0,0,1,1}; 

    TRISD = 0x00;    // PORTD als output 
    TRISB = 0b00110000;   // RB4 en RB5 als input 
    TRISA = 0x00;    // RA output 

    RCONbits.IPEN = 0;   // prioriteit disable 
    INTCONbits.GIE = 1;   // enable interrupt 
    INTCONbits.RBIE = 1;  // interrupt portB on 

    while(1) 
    { 
     _asm sleep _endasm 
    } 
} 

#pragma interrupt ISR 
void ISR (void) 
{ 


    if (INTCONbits.RBIF==1) 
    { 
     if(PORTBbits.RB5==0)  // S3 pressed ? 
     { 
      int i = 0; 
      int b; 
      do { 
       // Try to shift left (SHF) and get value in carry. 
       _asm 
        mov EAX, 1206420333240d 
       _endasm 
       //LATAbits.LATA2 = rood << 1; 
       //LATDbits.LATD1 ^= 1; 

       //do-while for the frequentie (1500 is de freq) 
       b = 0; 
       do { 
        b++; 
       }while(b <= 2000); 

       i++; 
      }while(sizeof(rood) <= 50); 

      //LATDbits.LATD1 ^= 1;  // D2 togglen 

     } 

    } 
    INTCONbits.RBIF = 0; 
} 

답변

2

PIC 18 assembly를 사용하는 경우는 값을 왼쪽으로 회전 지명 된 레지스터의 캐리 비트를 저장하는 하나의 명령이 있습니다.

RLCF REG, 0, 0 

(상기 링크 된 문서의 243 페이지 참조). 주의 : 캐리 레지스터를 조사하여 값을 검색하고 잠재적으로 최하위 비트를 '0'으로 설정하여 회전 작업을 방해하고 시프트 작업으로 전환해야합니다.

int carry = (value & 0X80) >> 7; // substitute the correct bit masks here 
value = value << 1; 

if(carry == 1) 
{ 
    // Perform action 
} 
+1

을 실제로 내가 사용했던 모든 PIC C 컴파일러는 완전한 때문에이 작동하지 않을 수 있습니다 다음 작동하지 않을 다음과 같은 이유

내가 궁금하지만,이 작업을 수행하기 위해 조립 인라인 리조트 수 쓰레기. –

+0

나는 당신의 판단을 믿을 것입니다 ... 제가 한 PIC18 개발은 어셈블러에 있다는 것을 자유롭게 인정할 것입니다. 그래서 나는 여기서 얼마나 잘 작동 할 수 있는지 완전히 확신하지 못합니다. –

관련 문제