본문 바로가기

오탈자 정보

[아트멜 스튜디오와 아두이노로 배우는 ATmega328 프로그래밍]_오탈자

현재까지 발견된 위 책의 오탈자 정보와 오류, 그리고 보다 매끄러운 문장을 위해 수정한 내용을 알려드리며, 아울러 집필과 편집 시에 미처 확인하지 못하고 불편을 끼쳐 죄송하다는 말씀을 드립니다. 아래의 오탈자 사항은 추후 재쇄 시에 반영하도록 하겠습니다. 


이외의 오탈자 정보를 발견하시면 저자(hgycap@deu.ac.kr)나 출판사(jeipub@gmail.com)로 연락주시면 고맙겠습니다. 


최종수정일자: 2017년 2월 23일

1쇄본 오탈자


200쪽 코드 12-1 12행(저자 제공)

ADMUX |= (ADMUX & 0xE0) | channel); // 채널 선택

==> 

ADMUX = (ADMUX & 0xE0) | channel); // 채널 선택


214쪽 코드 12-5의 밑에서 11행(저자 제공)

ADC_INIT(0x0E); // 15번 채널 선택

==> 

ADC_INIT(0x0E); // 14번 채널 선택


214쪽 코드 12-5의 밑에서 7행(저자 제공)

read = read_ADC(); // 15번 채널 선택

==> 

read = read_ADC(); // 14번 채널 선택


263쪽 그림 15-2(저자 제공)

(그림 15-2에서 사각형 우측 변 누락됨)


296쪽 표 16-6(저자 제공)

(표 16-6의 우측 하변의 선 종류가 잘못됨)


315쪽 코드 17-1 제목 수정(저자 제공)

코드 17-1 현재 날짜의 시간 설정 및 읽기

=> 

코드 17-1 TWI 초기화 함수


455쪽 코드 24-2의 WordDataWrite 함수의 들여쓰기 수정(저자 제공)

    for(uint8_t i = 0; i < 16; i++){

        if(data & 0x8000)

        PORTB |= 0b00001000;

        else

        PORTB &= 0b11110111;

        ShiftClock();

        data = data << 1;

    }

==>

    for(uint8_t i = 0; i < 16; i++){

        if(data & 0x8000)

            PORTB |= 0b00001000;

        else

            PORTB &= 0b11110111;

        ShiftClock();

        data = data << 1;

    }


275쪽 세 번째 문단 마지막 행(저자 제공)

OCR2A 핀을 통해 

=> 

OC2A 핀을 통해 


279쪽 두 번째 문단 4행(저자 제공)

ICR1 레지스터는 TNCT1 레지스터와 마찬가지로 

==>

ICR1 레지스터는 TCNT1 레지스터와 마찬가지로 


303쪽 16.4절 요약 1행(저자 제공)

고속의 주변장치와 통산을 위해 

=> 

고속의 주변장치와 통신을 위해 


308쪽 첫 번째 문단 2행(저자 제공)

클록 전송을 위한 SCA(Serial Clock) 2개의 선만

==>

클록 전송을 위한 SCL(Serial Clock) 2개의 선만


315쪽 2행(저자 제공)

Holt) 비트를 

==>

Halt) 비트를


319쪽 두 번째 문단 2-6행(저자 제공)

코드 17-5는 1바이트의 데이터를 수신하는 함수이다. 코드 17-5는 코드 17-3과 설정이 동일하게 보이며 데이터 레지스터인 TWDR에 데이터를 대입하거나 읽는 것만 차이가 있다. 그림 17-4와 17-5에서 알 수 있듯이 I2C 통신에서 송신과 수신은 주소를 전송할 때 LSB에 의해 이미 결정되어 있으므로 데이터 송신과 수신 함수에서의 설정에는 차이가 없다.

==>

코드 17-5는 1바이트의 데이터를 수신하는 두 종류의 함수를 나타낸다. 데이터 송신의 경우 데이터를 전송하고 ACK를 확인하는 하나의 함수만으로 충분하지만, 데이터 수신의 경우에는 데이터를 수신한 후 ACK를 보내는 경우와 NACK를 보내는 두 가지 경우가 있다. 그림 17-5에서도 알 수 있듯이, 여러 바이트의 데이터를 수신하는 경우 마지막 바이트를 제외하고는 ACK를 보내지만, 마지막 바이트를 수신한 후에는 NACK를 보내야 한다. 기본적으로 코드 17-5와 코드 17-3의 설정은 동일하다. 다만, 코드 17-3에서는 데이터 송신을 위해 TWDR 레지스터에 값을 대입하고 있는 반면, 코드 17-5에서는 데이터 수신을 위해 TWDR 레지스터의 값을 읽는다는 차이가 있다.


319쪽 코드 17-5의 1행(저자 제공)

uint8_t I2C_receive(void) {

==>

uint8_t I2C_receive_ACK(void) {


319쪽 코드 17-5 끝부분에 아래 내용 추가(저자 제공)

uint8_t I2C_receive_NACK(void) {

    TWCR = _BV(TWINT) | _BV(TWEN);

    while( !(TWCR & (1 << TWINT)) ); // 수신 완료 대기

    return TWDR;

}


320쪽 코드 17-6의 위에서 3-4행(저자 제공)

void I2C_transmit(uint8_t data);         // 1바이트 전송

uint8_t I2C_receive(void);                 // 1바이트 수신

==>

uint8_t I2C_receive_ACK(void);          // 1바이트 수신 & ACK

uint8_t I2C_receive_NACK(void);        // 1바이트 수신 & NACK


320쪽 코드 17-7 아래에서 8행(저자 제공)

uint8_t I2C_receive(void) {

==>

uint8_t I2C_receive_ACK(void) {


320쪽 코드 17-7의 끝에서 1-3행(저자 제공)

void I2C_stop(void) {

    TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN) | _BV(TWEA);

}

==>

uint8_t I2C_receive_NACK(void) {

    TWCR = _BV(TWINT) | _BV(TWEN);

    while( !(TWCR & (1 << TWINT)) ); // 수신 완료 대기

    return TWDR;

}


void I2C_stop(void) {

TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN) | _BV(TWEA);

}


322쪽 코드 17-8 아래에서 4-1행0(저자 제공)

    write_message(bcd_to_decimal(I2C_receive()), " second\n");

    write_message(bcd_to_decimal(I2C_receive()), " minute\n");

    write_message(bcd_to_decimal(I2C_receive()), " hour\n");

    write_message(bcd_to_decimal(I2C_receive()), " day of week\n");

    write_message(bcd_to_decimal(I2C_receive()), " day\n");

    write_message(bcd_to_decimal(I2C_receive()), " month\n");

    write_message(bcd_to_decimal(I2C_receive()), " year\n");

==>

    write_message(bcd_to_decimal(I2C_receive_ACK()), " second\n");

    write_message(bcd_to_decimal(I2C_receive_ACK()), " minute\n");

    write_message(bcd_to_decimal(I2C_receive_ACK()), " hour\n");

    write_message(bcd_to_decimal(I2C_receive_ACK()), " day of week\n");

    write_message(bcd_to_decimal(I2C_receive_ACK()), " day\n");

    write_message(bcd_to_decimal(I2C_receive_ACK()), " month\n");

    write_message(bcd_to_decimal(I2C_receive_NACK()), " year\n");


403쪽 코드 21-5 밑에서 4행

lcd.write('3');

==>

lcd.write('4');


353쪽 아래에서 두 번째 문단 5행에서(이*인 님 제공)

타이머/카운터 1번은 8비트이므로

==>

타이머/카운터 0번은 8비트이므로


234-235페이지 EIMSK 레지스터와 EICRA 레지스터 표기 오류건(박*규 님 제공)

ATmega328프로그래밍_오류_234-235.pdf


178페이지 첫 문단 (저자 제공)

입출력 객체의 정의는 main 함수 마지막으로 표준 입출력 장치와 위에서 정의한 입출력 객체들을 연결한다.

==> 마지막으로 main 함수에서 표준 입출력 장치와 위에서 정의한 입출력 객체들을 연결한다.


229쪽 테이블에서 4째 줄 (저자 제공)

0x004    jmp EXT_INT0    ; IRG1 Handler  ==>  0x004    jmp EXT_INT1    ; IRG1 Handler


229쪽 테이블에서 마지막 줄 (저자 제공)

0X036 ==> 0x036


229쪽 밑에서 2번째 줄 (저자 제공)
jum (jump) 명령어로 구성되어 있으므로 ==> jmp (jump) 명령어로 구성되어 있으므로


239쪽 표 13-6에서 (제자 제공)

PD0 ~ PC7 ==> PD0 ~ PD7


404페이지 코드 21-6에서 밑에서 4번째 줄(저자 제공)

lcd.write('3'); ==> lcd.write('4');