본문 바로가기
코스웨어/15년 스마트컨트롤러

20510924-23번-윤재희 적외선 센서 코딩, 큰 수의 덧셈과 뺄셈, 분기와 순환

by 알 수 없는 사용자 2015. 9. 24.
728x90
반응형

==================================Outline====================================

적외선 센서 코딩

----------------------------------------------------------------------------

 

적외선 센서 코딩

 

적외선 센서를 동작시키기 위한 코딩을 해보자.

 

우선 하드웨어 설정을 한 후 데이터 시트를 보고 하나 하나 코딩을 한다.


우선 기본적으로 알아야 할 점들.

- 입력 전압은 3.3V이다물체의 표면을 500ms 이내에 정확하게 측정할 수 있다.

- DTS-L300-V2는 온도계산 프로세서를 내장하고 있어 따로 온도 계산이 필요 없다.

- DTS-L300-V2는 디지털 통신으로 온도 값을 출력한다때문에 통신의 연결이 필요하다.

주변 온도와 대상 온도를 동시에 측정한다.

 

VCC와 GND를 제외하고 사용하는 핀은 4개이다.

- SCK: 클럭 공급

- SCE: 적외선 센서 활성화

- SDI: 신호를 입력

- SDO: 신호를 출력

 

이러한 신호들은 SPI통신을 통해 이루어지기 때문에 SPI사용에 대한 숙지를 해야 한다.

 


 

SPI에 대한 학습이 되어 있지 않음으로 우선 I/O를 사용하여 코딩에 성공하면 SPI를 사용하여 코딩을 하도록 하자.

 

우선 데이터 시트에 나와 있는 코드를 주석을 사용하여 해석해보자.

 

unsigned char buffer_Lo, buffer_Hi, p02; //1byte선언


long CHECK(unsigned char datum) //2byte return 함수

{
  
    unsigned char i= 0;
    buffer Lo = 0//버퍼 비워주기
    buffer Hi = 0//버퍼 비워주기
 

    /*** 적외선 준비 설정 ***/
    EN_LOW; //enable low
    delay us(10); //10us 딜레이
    for(i=0; i<8; ++i)
    {
        if( ( (0x80 >> i ) & datum) == 0)
        {
            SDO_LOW; //SDO = 0;
        }
        else
        {
            SDO_HIGH; //SDO = 1;
        }

}

SDO_LOW; //SDO = 0;
delay_ms(10); //10ms 딜레이
/*** 하위 바이트 읽기 ***/
for(i=0; i<8; I++)
{
        buffer_Lo = buffer_Lo << 1//하위 버퍼 좌로 한비트 밀기
        SCK_LOW; //SCK = 0;
        delay_us(1); //1us 딜레이
        SCK_HIGH; //SCK = 1;
        dealy_us(1); //1us 딜레이
        p02 = FP02 //포트의 상태 읽기
        if(p02 == 1)
        {
            buffer_Lo = buffer_Lo|0x01;}
        }
        else
        {
            buffer_Lo = buffer_Lo&0xFE;
         }
}
SDO_LOW; //SDO = 0;
delay_ms(10); //10ms 딜레이

/*** 상위 바이트 읽기 ***/

for(i=0; i<8; i++)
{
     buffer_Hi = buffer_Hi << 1//상위 버퍼 좌로 한비트 밀기
     SCK_LOW; //SCK = 0;
     delay_us(1); //1us 딜레이
     SCK_HIGH; //SCK = 1;
     dealy_us(1); //1us 딜레이
     p02 = FP02 //포트의 상태를 변수에 담아서 판단
     if(p02 == 1)
     {
         buffer_Hi = buffer_Hi|0x01;}
     }
     else
     {
         buffer_Lo = buffer_Lo&0xFE;
     }
}
EN_HIGH; //enable = 1;
return (buffer_Hi*256 + buffer_Lo);

}

 

void main(void)
{
    while(1)
    {
        Target_Value = CHECK(0xa0); // 대상 온도
        delay_ms(50);
         Ambient_Value = CHECK(0xa0); // 주변 온도
        delay_ms(500);
        //LCD에 값 출력 코드 넣기
    }

}

대충 감이 잡히면 코딩을 해보도록 하자. 순서는 아래와 같다.

  

1. 각 핀의 포트설정

 

DDRJ = 0x07; //0~2번핀 출력, 3번핀 입력

 

2. 입력 값에 대한 high, low 값 정의

 

#define SCE_LOW PORTJ=PORTJ&(~0x01)

#define SCE_HIGH PORTJ=PORTJ|0x01

 

#define SCK_LOW PORTJ=PORTJ&(~0x02)

#define SCK_HIGH PORTJ=PORTJ|0x02

 

#define SDO_LOW PORTJ=PORTJ&(~0x08)

#define SDO_HIGH PORTJ=PORTJ|0x08

 

 

 

3. SPI 함수 해석하여 작성

 

int SPI(unsigned char uiMode)

{

unsigned char ucCnt;

ucBuf_Low = ucBuf_High = 0;

SCE_LOW; //enable low

 

(진행 중)

}

 

 

4. main에서 적외선 센서 감지 값을 LCD에서 출력하도록 설정

5. main에서 적외선 센서 감지 값을 LCD로 출력


 

 


==================================Outline====================================

div 명령어 숙제


큰 수의 덧셈과 뺄셈
- 캐리 플래그 변경 명령어

분기와 순환
- 무조건 이동 

----------------------------------------------------------------------------

 div 명령어 숙제

 

[답안]

 

C = (5/9) * (F - 32)

C = 5(F-32)/9

 

mov esi, 70        //esi = F

sub esi, 32        //esi = F - 32

imul esi, 5        // esi = 5(F-32)


mov edi, 9        //edi = 9

mov eax, esi    //eax = 5(F-32)

cdq                //register setting for div.

idiv edi          // eax = 5(F-32)/9


mov edi, eax    //edi = 5(F-32)/9


edi = 15h

 

 

큰 수의 덧셈과 뺄셈(pdf p/130)

 

64bit길이의 숫자를 계산하려면 32bit인 두 개의 변수를 선언하여 하위 32bit와 상위 32bit를 더해준 후에 올림수만 처리해주면 된다이 때 adc 명령어를 사용한다.

 

adc = 올림수가 생기는 것까지 포함하여 덧셈을 해주는 연산

 

   A B C

+ D E F

----------

 

add C + F 일의 자리수는 일반 덧셈 사용

adc B + E 올림수가 발생하는 자리는 adc 사용

adc A + D 올림수가 발생하는 자리는 adc 사용

 

 

 

덧셈이나 뺄셈 모두 뒤에서부터 올림 수나 빌림 수를 생각하여 계산해야 한다.

 

캐리 플래그 변경 명령어

 

clc: 클리어(0)

stc: (1)

cmc: 보수(0이면 1, 1이면 0)

 

 

 

분기와 순환(Branching and Looping)

 

 

무조건 이동

 

 

C의 goto문과 같은 기능을 한다명령어는 jmp이다실행 코드 안에서 이동하기 때문에 코드 영역의 주소를 알아야 한다때문에 코드 영역에 라벨을 표시하여 명령어가 실행되면 라벨이 표시된 곳으로 이동한다.

 

 

라벨을 표시하는 방법은 라벨:' //라벨은 사용자가 지정

 

 

pdf p/152 예제




jmp는 앞은 물론 뒤로도 가능하다.

 

jmp를 사용할 때 라벨은 문자임으로 어셈블러는 라벨을 숫자로 기억하고 라벨이 끝나는 자리를 기준으로 라벨이 붙혀진 곳을 계산하여 라벨점으로 이동하게 된다.

 

short와 near은 라벨 용량을 뜻한다. short 1BYTE near은 4BYTE이다.

 

레지스터도 jmp명령어의 라벨이 될 수 있다이것을 레지스터 indirect라고 부른다.

또한 메모리에 저장된 값도 이동 기준이 될 수 있다.





728x90