BASIC4MCU | 질문게시판 | 코드 해석에 관한 질문입니다.
페이지 정보
작성자 슬레이브 작성일2020-12-19 16:01 조회3,360회 댓글1건본문
책에 있는 예제중에 이해 안가는 부분이 있어서 질문드립니다.
#include <mega128.h>
#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
// 텍스트 LCD 관련 심볼 정의
#define ENABLE PORTA.2 // ENABLE 신호
#define FUNCSET 0x28 // Function Set
#define ENTMODE 0x06 // Entry Mode Set
#define ALLCLR 0x01 // All Clear
#define HOME 0x02 // HOME
#define DISPON 0x0c // Display On
#define LINE2 0xC0 // 2nd Line Move
// MPU6050 레지스터 어드레스 및 디바이스 어드레스
#define MPU6050_ACCEL_XOUT_H 0x3B // R
#define MPU6050_TEMP_OUT_H 0x41 // R
#define MPU6050_GYRO_XOUT_H 0x43 // R
#define MPU6050_PWR_MGMT_1 0x6B // R/W
#define MPU6050_I2C_ADDR 0x68 // 디바이스 어드레스
typedef unsigned char u_char;
u_char mpudata[14]; // MPU6050 센서값 저장
int x_accel, y_accel, z_accel; // 가속도값
int x_gyro, y_gyro, z_gyro; // 각속도값
int temp; // 온도값
u_char rdata;
// LCD 관련함수
void LCD_init(void); // LCD 초기화
void LCD_String1(char *); // 생성 문자열 출력
void Busy(void); // 2ms 딜레이
void Command(u_char); // 명령어 전송
void Data(u_char); // 데이터 전송
// MPU6050 TWI(I2C) 관련함수
int TWI_Write(int, u_char); // TWI 쓰기
int TWI_Read(int); // TWI 읽기
int TWI_Comm(int); // TWI 공통 함수
void error_out(u_char); // 에러 LED 출력함수
void main(void)
{
float ftemp;
int error, addr, n;
u_char buf[16];
// 7-세그먼트
DDRB = 0xF0; // 포트 B 상위 4비트 출력 설정
DDRD = 0xF0; // 포트 D 상위 4비트 출력 설정
DDRG = 0x0F; // 포트 G 하위 4비트 출력 설정
// LED
DDRC = 0xFF; // 포트 C 출력 설정 (에러표시)
PORTC = 0xFF;
LCD_init();
// TWI 초기설정
TWBR = 12; // 16M/(16 + 2 * 12) = 400kHz(TWPS=0)
TWSR = 0x00;
// Gyro 250도/초, 가속도 2g, 클럭소스 내부 8MHz, Sleep Mode
error = TWI_Write(MPU6050_PWR_MGMT_1, 0); // Sleep mode 해제
if(error != 0) error_out(error); // 에러발생
while(1){
// 가속도, 온도, 각속도 값 읽기
addr = MPU6050_ACCEL_XOUT_H;
for(n = 0;n < 14;n++){
error = TWI_Read(addr++);
if(error != 0) error_out(error); // 에러발생
mpudata[n] = rdata;
}
// 가속도, 온도. 각속도 2바이트 값 계산
x_accel = ((int)mpudata[0] << 8) | ((int)mpudata[1] & 0x0FF);
y_accel = ((int)mpudata[2] << 8) | ((int)mpudata[3] & 0x0FF);
z_accel = ((int)mpudata[4] << 8) | ((int)mpudata[5] & 0x0FF);
temp = ((int)mpudata[6] << 8) | ((int)mpudata[7] & 0x0FF);
x_gyro = ((int)mpudata[8] << 8) | ((int)mpudata[9] & 0x0FF);
y_gyro = ((int)mpudata[10] << 8) | ((int)mpudata[11] & 0x0FF);
z_gyro = ((int)mpudata[12] << 8) | ((int)mpudata[13] & 0x0FF);
// The temperature sensor is -40 to +85 degrees Celsius.
// It is a signed integer.
// 섭씨온도 = (온도 디지털값) / 340 + 36.53
ftemp = (float)temp / 340.0 + 36.53;
// 결과 출력
sprintf(buf, "%3d %3d %3d %3d", x_accel / 200, y_accel / 200, z_accel / 200, (int)ftemp);
Command(HOME);
LCD_String1(buf);
sprintf(buf, "%4d %4d %4d", x_gyro / 200, y_gyro / 200, z_gyro / 200);
Command(LINE2);
LCD_String1(buf);
delay_ms(500);
}
}
// 1바이트 전송
int TWI_Write(int addr, u_char data)
{
TWI_Comm(addr); // Start Condition, SLA + W, RA 전송
// Data
TWDR = data; // 전송 데이터
TWCR = 0x84; // TWINT, TWEN 셋
while((TWCR & 0x80) != 0x80); // TWINT 비트가 1이 될 떄까지
if((TWSR & 0xF8)!= 0x28) return(0xEF); // 에러 체크
// STOP 조건 발생
TWCR = 0x94;
return(0);
}
빨간색으로 표시한 부분에 관해 여쭤보려고 합니다.
우선 data는 어떤 걸 받아오는지 알고 싶습니다.
또한 return 값들은 어떤걸 반환하는지 알고 싶습니다..
이 예제로 응용을 했는데 'must declare first in block' ,'void function may not return a value', 'undefine symbol 'data' ' 이런 오류들이 나와서 질문드립니다.
댓글 1
조회수 3,360master님의 댓글
master 작성일
// 1바이트 전송
int TWI_Write(int addr, u_char data) // data는 두 번째 인수, 즉, TWI data를 말합니다.
if((TWSR & 0xF8)!= 0x28) return(0xEF); // 에러 체크
에러가 발생하면 0xFE 를 리턴하고
return(0);
에러가 없으면 0을 리턴하겠죠