1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 바람샤워 | 판매 납포인트 | 무료 | 평점 | 0점 / 총 0명 참여 |
---|
#include <avr/io.h>
#include <avr/delay.h>
#include <stdio.h>
#define DQ_HIGH (PORTE |= 0x10)
#define DQ_LOW (PORTE &= ~0x10)
#define CLK_HIGH (PORTE |= 0x20)
#define CLK_LOW (PORTE &= ~0x20)
#define RST_HIGH (PORTE |= 0x40)
#define RST_LOW (PORTE &= ~0x40)
typedef unsigned char byte;
byte k,n,led;
void delay_500m()
{
byte k;
for(k=0; k<50; k++)
_delay_ms(10);
}
// 8비트 데이터에서 최하위 비트 값이 1이면 DQ_HIGH로 데이터 유지, 비트 값이 0이
//면 DQ_LOW로 데이터 출력한 후, 하위로 이동시켜 최하위 비트부터 출력
void write_byte(byte W_Byte) // DS1620에 1바이트 데이터 쓰기
{
byte i;
DDRE = 0x70; // 포트 B의 상위 3핀이 DS1620과 연결
for(i = 0; i < 8; ++i) // 8비트 데이터를 CLK의 하강에지에서 출력
{ // 데이터를 LSB부터 출력
CLK_LOW;
_delay_us(1);
if(W_Byte & 0x01) // 출력할 데이터의 최하위 비트만 마스킹
// 출력할 데이터가 “1”이면, DQ 핀에 상승 클럭을 발생시켜 데이터 유지
DQ_HIGH;
else
// 데이터가 “0”이면, DQ 핀에 하강 클럭을 발생시켜 데이터 출력하고
DQ_LOW;
CLK_HIGH; // 상승 클럭 발생
_delay_us(1);
W_Byte >>= 1; // 다음 비트 출력을 위해 한 비트 하위로 이동
}
}
byte read_byte() // DS1620으로부터 1바이트 데이터 읽기
{
byte i, R_Byte, TmpByte;
R_Byte = 0x00; // 리턴 값 클리어
DDRE = 0x60; // CLK, RST = 1, DQ=0 데이터 입력
for(i = 0; i < 8; i++)
{
CLK_LOW;
_delay_us(1);
// 8비트를 읽어 4번째 비트(DQ)만 뽑아 MSB로 이동
TmpByte = (PINE & 0x10) << 3;
CLK_HIGH;
_delay_us(1);
// 다음 비트 입력을 위해 한 비트 하위로 이동
R_Byte >>= 1;
// MSB를 합해서 8번 반복하여 한 바이트를 만들어 리턴시킴.
R_Byte |= TmpByte;
}
DDRE = 0x70;
return R_Byte;
}
int main(void)
{
char *str1 = "Thermometer Test";
byte temp_and_half_bit, sign_bit, sign, half, temp_read;
byte k, temper[16];
DDRE = 0x70; // DS1620과 연결되어 있는 상위 3비트를 출력으로 설정
// 온도를 읽기위한 초기설정 RST_LOW;
RST_HIGH;
write_byte(0xAC); // 구성 데이터를 읽어 들이겠다고 선언
k = read_byte(); // 구성 레지스터 데이트를 읽어 들인다.
RST_LOW;
if ( (k & 0x03) != 0x03 ) // 구성 레지스터 값이 모드 설정 값이면
{
RST_HIGH;
write_byte(0x0c); // 구성 데이터를 라이트
write_byte(0x03); // CPU와 3선 통신하며, 1SHOT 모드로 설정
RST_LOW;
}
RST_HIGH;
write_byte(0x22); // 온도 변환 종료
RST_LOW;
do {
RST_HIGH;
write_byte(0xEE); // 온도 변환 시작
RST_LOW;
do
{
RST_HIGH;
write_byte(0xAC); // 구성 데이터를 읽어 들이겠다고 선언
k = read_byte(); // 데이터를 읽어 들임
RST_LOW;
} while( (k & 0x80) != 0x80 );
delay_500m();
// 온도와 부호 읽기
RST_HIGH;
write_byte(0xAA); // 온도 읽기 명령
// read 1st byte of temp, DS1620은 9비트로 온도 표시하므로,
// 하위 1바이트의 데이터를 먼저 읽는다.?
temp_and_half_bit = read_byte();
// 상위 1바이트, 즉 부호에 대한 데이터를 읽는다.
sign_bit = read_byte();
RST_LOW;
// 온도 계산
// 최하위 비트는 온도의 소수점 값을 표시하기 위해 없앤 후, temp_read에 저장
// temp_read 값은 한 비트 하위로 이동했으므로 반으로 감소
temp_read = ( temp_and_half_bit >> 1 );
// 2번째 1바이트 데이터의 값이 “0”이면 +, “1”이면 - 온도
if ( sign_bit )
{
sign = '-';
temp_read = (128 - temp_read); // 음수를 양수로 변환
}
else
sign = '+';
// 최하위 비트가 “1”이면 소수점 5, “0”이면 소수점 0
if ((temp_and_half_bit & 0x01) == 1)
half = 5;
else
half = 0;
sprintf(temper,"TempC = %c%d.%d C",sign,temp_read,half);
} while(1);
}
atmega128에서 GCC로 프로젝트 생성하였습니다.
코드는 위와 같습니다.
컴파일 후에 에러도 없는데, 하이퍼 터미널에는 이상한 문자들만 나옵니다.
고수님들 왜 그런지 알려주시면 감사하겠습니다.
이상한 문자만 나오는 이유는 보통 2가지 이유입니다
1. 소프트웨어: baudrate, start,stop bit 설정 잘못 이경우는 마이컴 쪽을 고치지 말고 하이퍼터미날 쪽을 바꾸어서 실험해보면 알수 있습니다.
2. 하드웨어:마이컴 시리얼쪽회로 문제시리얼 통신 신호의 전압은 12v입니다 따라서 마이콤 신호를 그냥 pc에 연결하는게 아니고 중간에 마이콤 전압(보통 3.3v나 5v)->12v로 바꾸어주는
ic가 들어가야합니다 이부부니이 없거나 문제가 생겨 12v가 안되면 (10v정도만 나와도 동작함)이상한 문자가 찍힙니다(전압 측정 해보세요 )