BASIC4MCU | 통신 | SPI통신 | DTM300 온도센서 - 128 외부인터럽트와 GPIO - 하이퍼터미널
페이지 정보
작성자 키트 작성일2017-09-01 10:28 조회1,517회 댓글0건본문
//DTM 300 온도센서
//
//pin1 = vcc, supply
//pin2 = INT, Output => PD0 //128 입력, 외부 인터럽트0
//pin3 = sck Output => PB1 sck //128 입력
//pin4 = SI input => PB3 MISO //128 출력
//pin5 = SO Output => PB2 MOSI //128 입력
//pin6 = GND Ground
//
//
#include <mega128.h>
#include <delay.h>
#include <stdio.h>
//
#define DTM300_INT PIND.0 //128 입력
//
#define DTM300_SCK PINB.1 //128 입력
#define DTM300_SO PINB.2 //128 입력
#define DTM300_SI PORTB.3 //128 출력
//
bit DTM300_flag=0;
unsigned int Object_temp=0, Ambient_temp=0;
//
void TX0_CH(char ch){ while(!(UCSR0A&0x20)); UDR0=ch; } // 송신함수
//
interrupt [EXT_INT0] void ext_int0_isr(void){ // 외부인터럽트0
unsigned char temp[5], i;
for(i=0;i<5;i++)temp[i]=0; // 버퍼 크리어
//
for(i=0;i<40;i++){
while(DTM300_SCK); // 0 이 될 때까지 대기
while(DTM300_SCK==0); // 1 이 될 때까지 대기
if(DTM300_SO)temp[i/8]=1<<(i%8); // data 저장, first LSB
//
if(DTM300_INT)return; // 비정상 상태 종료
}
//
if(temp[0]==0xA1){
Object_temp =(temp[1]*256)+temp[2];
Ambient_temp=(temp[3]*256)+temp[4];
DTM300_flag=1;
}
}
//
void main(void){
int i;
char str[50];UCSR0B=8; UBRR0H=0; UBRR0L=103; // 9600, USART0
EICRA=0xaa; EIMSK=1; // falling edge, int0
#asm("sei")
while(1){
if(DTM300_flag){ DTM300_flag=0;
sprintf(str,"Object Temp=%d Ambient Temp=%d\r\n", Object_temp, Ambient_temp);
i=0; while(str[i])TX0_CH(str[i++]); // USART0 전송
}
}
}
//데이터시트 잠깐 보고 만든거라서 동작 확인은 안된겁니다.
센서가 없어서 확인 못 했습니다.
돌려보신분은 아래 댓글로 동작 여부를 적어 주세요
약 3ms 정도 걸립니다.
동작 중에 다른 인터럽트의 방해를 받으면 데이터 손실이 발생 하게 됩니다.
인터럽트를 막아서 받으면 온도 값을 제대로 받지만
3ms 사이에 발생 하는 다른 인터럽트를 받지 못하게 됩니다.
3ms가 문제가 되면 SPI로 받아야 합니다.
댓글 0
조회수 1,517등록된 댓글이 없습니다.