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

20150925-23번-이량경-일일업무일지-ASM {jum, cmp}/ 적외선 온도 감지 센서

by 알 수 없는 사용자 2015. 9. 30.
728x90
반응형
<MASM>
----------------------------------------------------------------
<157>
5.2 Conditional Jumps, Compare Instructions, and if Structures

- j 다음에 쓰라는게 아니고 j로 시작하는 명령어 들이다.j 다음에 알파벳이 온다.

* jz  : 플래그 비트가 아주 민감하게 사용된다.
ZF(Zero flag)가 1이면 endwhile로 점프한다. 그렇지 않으면 다음명령을 수행한다.

예제) 1 감소
┌───────────┐
   sub      eax, 1                   
   sub      eax,  eax               
   dec      eax                       
   * 방법은 여러가지다.        
└───────────┘    


- eax , 1을 넣고
- dec 하고 ZF를 체크 한다.  감소를 시켰는데 EFL 값이 바뀌지 않는다...
- sub eax, 1 하고 ZF를 체크 한다.  바뀌지 않았다..

✔  그 전에 계산이 하나 필요하다.

예제) eax가 0이다.
┌───────────┐
     C로 짜면 
 
     if(0==eax)
     {
          eax = 100;
     }
     else
     {
          eax = 200;
     }
     test1로 가고 끝난다.
└───────────┘

┌───────────────┐
     asm
 ──
     .CODE

     _start:                                                                                     

                mov     eax, 0

                add     eax, 1

                 dec     eax
                  ;sub     eax, 1

             
                 jz      test1

                jmp    test2

     test1:  

                mov    eax, 100

                jmp    end1

     test2:

                mov    eax, 200

                jmp    end1

     end1:
        
                 INVOKE ExitProcess, 0

     PUBLIC        _start 

     END

└────────────────┘
<158>
✔ 파스칼


✔ jump not signed
- signed flag 가 not(1이 아닐때)일때,  연산의 결과가 양수일때

✔ Jump not zero
- 0이 아니면
-  다음 조건문으로 점프(뛰어넘어버림.)
┌───────────────────────────────┐
     if(A<0) / 조건:A가0보다 작다 /음수가 아니면 jns(not 점프다) 
     {
          참 ; 참이면 음수다.
     }
     else if(A==0) / 0이 아니면 jnz! /else if 문 점프해버림
     {    
     }
     else / 위의 두 조건과 반대개념이면 점프
     {
     }
└───────────────────────────────┘
- 이렇게 상황에 따라 점프라는 것을 컨디셔널 점프
- if문은 cmp비교문과 imp점프문을 결합시켜 조건문을 완성시킴 : jmp(점프)는 cmp (비교)와 함께쓴다.

 cmp
<159>
- 오퍼랜드 1,  오퍼랜드 2를 비교


* cmp 오퍼랜드1 - 오퍼랜드2
- 실제 C코드에서는 A에서 0을 빼서 그 결과값을 본다.

<160>

* 결과는 정수체제와 양수체제로 나뉜다. 

1번 
3B - 3B = 0  / ZF가 1이 된다는것은 두개의 숫자가 같다고 논리적으로 가능해진다.

2번
3B - 15 / 둘의 차이가 양수면 오퍼1이 오퍼2보다 크다고 추측할수있다.

3번
15 - 3B / DA: 음수(8이 넘어가면 음수)/ 15가 작아 빌림. CF: 1/  SF:1 오퍼2가 크구나를 알수있다.

4번 
F9 - F6 /음수 음수

5번
F6 - F9 / 모잘라서 케리 발생 CF:1, SF:1 음수

6번 
15 - F6 / 양수 음수/ 케리 발생 CF:1,  SF:0, 연산 결과가 양수 OF:0
            / 정수체제: 오퍼1이 크고, 양수체제: 오퍼2가 크다. 

7번
F6 - 15 / 음수 양수/ 연산의 결과가 음이면 OF:0

8번 
68 - A5 / 양수 음수/ 케리 발생 CF:1, SF:1, 연산 결과가 음수 OF:1
            / 6번과 8번(같은 케이스) 경우, 정수일때는 op1이 크고, 양수체제일때는 op2가 크다
6번 연산 결과가 양 OF : 0
8번 연산 결과가 음 OF : 1

  비교할때 사례가 9가지있다. 6번 8번같은 케이스를 구별하기위해서 OF를 사용한다.
9번 
A5 - 68 / 음수 양수 (7번과 같은 케이스)

7번 연산결과가  음 OF : 0
9번 연산결과가  양 OF : 1 

- 외울필요없고 이해만 하면된다. 

<161>
- cmp  op1, op2 
* op2에 
- register 8,16,32, immediate 8, 16, 32 다온다.


<162>
 ja, jnbe, jae, jnb, jb, jnae, jbe, jna (점프명령의 여러가지를 다보임.)
* ja 
- 만약 이상이면 점프한다. CF:0 ZF:0 일 경우를 말한다.

* cmp코드로 비교하고,  
<160> 2번 A>B 즉, CF: 0, ZF: 0이면 ja한다. 
ja와 동일한 jnbe. 컴파일하면 같은 플래그가 나온다. 보통 ja를 사용한다.
ja 라벨
A > B면 ja로간다.

<163>


예제) else 를 사용하면 좋은지?

 
if 조건이 맞지 않으면 else if로 점프할 위치 정보를 가지고 있음.
else를 사용하지 않을경우 jmp코드를 하나 절약한다. 
* 어샘블리 코드가 적으면 최적화.
* 그러나 무작정 없으면 좋다는것이 아니다. 상황에 따라 달라진다.


<회로>
----------------------------------------------------------------
✔ 적외선 온도 센서
* SIP 방식을 이용해서 MCU 쪽에 던져 준다.

아트메가에 프로그램을 올리기 위해 이제까지 잘사용 해왔는데 주의점이 있다.
프로그램 올릴때 센서가 연결이 되어있으면 CPU인식이 안될수도 있다.
그래서 프로그램을 올릴때는 연결않하고 올려야 한다.

UART와 데이터 넘어가는 것이 거의 유사하다.

✔ SIP는 기본핀이 3핀이다.
---------하이 엑티브
MISO
MOSI
CLK
---------로우 엑티브
/CS      : 선택할때 사용한다.
---------
GND

위 처럼 SPI연결을 보면 기본적으로 연결 되어야 한다.
/CS (chip select)는 /RESET pin에 연결되고 그 외엔 그대로 연결 된다.
연결하면 GPIO연결 형식으로 CS하나 만드는 것이 낫다.
나머진 그대로 
MISO ┐ 
MOSI │ (SPI 관련된) PORTB에 있다.
CLK  ┘ 그러므로 PORTB에 사용하는것이 편리하다.


2.4 ~ 3.6 V 사용해야한다. 4V 이상 가하면 치명적손상된다고 datasheet에 있다. 
그래서 3.3V를 만들어야 한다.
방법1. ARM보드를 이용한다.
방법2. 저항을 2개 이용해서 전압분배를 이용해서 3.3V만드는 방법이 있다. 나머지는 1:1 연결을 해주면 된다.

* 연탄그림의 ISP는 통신 규격에 사용한다. 

ISP라인에 이런형식으로 한쪽에 저항 연결방법이 있다.


<4p> 

- 이 온도 센서르 사용하기 위해 가장 중요하다.
- 이 클럭의 SCK는 CPU랑 연결하기 때문에 CPU에서 공급해준다. 
- CS 이칩셀은 로우엑티브로 H->L떨어지는 순간부터 10ms 지난 뒤부터 들어온다.
- Low로 만들어주고 10ms지나서 데이터를 읽어주도록 데이터를 보내고 역으로 받아내는 것이다.

Q. <타이밍도에서>SDO와 SDI는 같은 시간에 일어나는가?
- SDO 가 클럭에 의해 넘러가고 SDO보단 SDI가 약간 늦게 들어간다.

타이밍도의 클럭 1㎲ : 이부분은 임으로 조정 가능한 부분으로 클럭주기가 100㎲ 이면 *100하면된다.
데이터 한 패킷이 6바이트로 구성된다.
앞 3바이트 : 측정온도
뒤 3바이트 : 주변온도

프로토콜을 잘보면 10㎲ 딜레이 되고 데이터 측정온도 3바이트 들어오고 나서 50㎲ 기다리고 주변온도 측정 패킷을 던져준다.

SDI에서 0xA0 만 만들게 되면 뒤는 다른것와도 상관이 없다.
마이크로?에서 온도계한테 온도측정하라고 명령을 던져준다.

<datasheet 온도계산 그림 참고 할 것.>
SDO MISO와 연결
SDI에서 0x22를 셋팅하면 Low바이트 -> 하이가 들어온다.

영하 : 2의 보수값으로 전달.
상위 0xFF 하위 0xFE이것을 변환하면 350도이다.
4~5p를 분석하면 된다.

✔ SPI개요
1: 다 통신 한다면 
마스터에 여러개 슬레이브가 연결되어있다.
이런경우 슬레이브1번, 2번  어디에 통신 데이터를 던져 주냐에 따라 CS가 있다.
그래서 SPI는 4가닥이라고도 한다

마스터 -> 슬레이브 보내는 클럭이 빠르면 데이터 전송이 빨라진다.(느리면 느려진다)
* 클럭 속도에 따라 프로그램 속도를 변경할수 있다.

<책 246>
클럭에 따른 동작모드
SPI 클럭신호에 따라 4가지로 동작한다.
* CPHA 0이면, H -> L 
   CPOL 1이면 로우 엑티브




✔ SPI 마스터와 슬레이브 연결
<책 248>
마스터, 슬래이브 모두 shift register를 가짐.
클럭 제네레이터를에서 클럭 발생. 마스터, 슬레이브 클럭을 공급받고 있다. 이 클럭에 따라 통신속도가 결정된다.
SS : 통신 중단 목적 또는 통신시작 목적으로 일종의 스위치다.


<책 248>
SPI단자 신호의 입출력 방향 
 둘중하나는 마스터, 그외에는 슬레이브 여야한다.


 CPOL에 의한 SCK의 데이터 샘플링 에지의 극성 설정


 CHPA에 의한 SCK의 데이터 샘플링 에지의 위상설정

---------------------참고------------------------
SPI에 인터럽트를 사용할것인지, 그냥 사용할 것인지.
마스터 인지, 슬레이브인지.
CPOL클럭극성
데이터 전송순서 
쓰기도중 충돌 파악을 위한 플래그 비트
--------------------------------------------------

<책 251>
SCK 클록 신호의 주파수 설정
클럭주파수 계산이 편하려면 : 16분주
       16
-------------  = 1000 000  : 1㎲ 만들기 편하다. (어떤것을 사용해도 무방함)
16 000 000


┌────────────────────────────┐

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

//SPI쓰기 함수
unsigned char SPI_Write(unsigned char byte)
{
  // /CS = 0
      // 데이터 쓰기
  // delay 10ms
  // 데이터 쓰기
  // delay 10ms
  // 데이터 쓰기
  // /CS =1
  // delay 50ms
  // /CS = 0
  // 데이터 쓰기
  // delay 10ms
  // 데이터 쓰기
  // delay 10ms    
      // 데이터 쓰기
      // /CS =1
      // delay
}
unsigned char SPI_Read(void)
{
  // 데이터 읽기
  // /CS =1
  // 데이터 반환
  return;
}

int main(void)
{
  //GPIO 설정   
  DDRB = 0xF7;
  //SPI 설정
  SPCR = 0b01111101
  SPSR = 0b00000001

  while(1)
  {
    SPI_Write(0xA0);   
    ;
    SPI_Write(0xA1);    
    ;
  }
  return 0;
}

└────────────────────────────┘

728x90