BASIC4MCU | 질문게시판 | 답변 : Atmega128 온도센서 활용 재질문입니다.
페이지 정보
작성자 master 작성일2022-11-26 17:31 조회694회 댓글1건본문
int read_twi_2byte_nopreset(char reg){
char high_byte, low_byte;
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x08); // START 전송 // ACK 및 상태 검사
TWDR=LM75A_ADDR|0; // SLA+W 준비, W=0
TWCR=(1<<TWINT)| (1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x18); // SLA+W 전송
TWDR=reg; // LM75A Reg 값 준비
TWCR=(1<<TWINT)| (1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x28); // LM75A Reg 값 전송
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x10); // RESTART 전송 // ACK,NO_ACK 상태 검사
//--------------------------------------------------------------------
TWDR=LM75A_ADDR|1; // SLA+R 준비, R=1
TWCR=(1<<TWINT)| (1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x40); // SLA+R 전송
TWCR=(1<<TWINT)|(1<<TWEN) |(1<<TWEA); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x50); // 1st DATA 준비
high_byte=TWDR; // 1st DATA 수신
TWCR=(1<<TWINT)| (1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x58); // 2nd DATA 준비
low_byte=TWDR; // 2nd DATA 수신
TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); while((TWCR&(1<<TWSTO))); // STOP 전송 // STOP 확인
return((high_byte<<8)|low_byte); // 수신 DATA 리턴
}
함수를 반토막 냈는데요
윗부분이 레지스터(포인터) 지정하는 부분이고요
아랫부분이 지정되어 있는 레지스터(포인터)를 읽는 부분입니다.
단, 읽으면 레지스터(포인터) 가 자동으로 증가하므로
다시 읽을 때는 또 다시 레지스터(포인터) 를 지정해줘야 합니다.
따라서 아랫부분만 쓸 일은 없습니다.
int read_twi_2byte(){
char high_byte, low_byte;
//--------------------------------------------------------------------
TWDR=LM75A_ADDR|1; // SLA+R 준비, R=1
TWCR=(1<<TWINT)| (1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x40); // SLA+R 전송
TWCR=(1<<TWINT)|(1<<TWEN) |(1<<TWEA); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x50); // 1st DATA 준비
high_byte=TWDR; // 1st DATA 수신
TWCR=(1<<TWINT)| (1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x58); // 2nd DATA 준비
low_byte=TWDR; // 2nd DATA 수신
TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); while((TWCR&(1<<TWSTO))); // STOP 전송 // STOP 확인
return((high_byte<<8)|low_byte); // 수신 DATA 리턴
}
예를들면 아랫부분만 함수로 만들어서 읽으면
Temperature,Configuration,THYST,TOS, Product ID Register를 차례대로 2바이트씩 읽게 됩니다.
레지스터(포인터) 지정없이 계속해서 Temperature만 읽을 수 있는 방법은 없습니다.
(Product ID Register는 어드레스가 7번이므로 TOS(3번) 이후에 바로 나오지 않고 쓰레기 데이터가 몇개 나온 후에 나올 수도..)
댓글 1
조회수 694donggle님의 댓글
donggle 작성일도움 주셔서 감사합니다!! 천천히 코드 살펴보고 이해해 보겠습니다