BASIC4MCU | 질문게시판 | 답변 : AVR에서 C언어를 이렇게 입력할 시
페이지 정보
작성자 master 작성일2018-06-03 17:38 조회15,273회 댓글7건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-06-03 오후 5:31:34// by Ok-Hyun Park//0번부터 7번까지 LED가 0.1초마다 왔다갔다 하는 걸로 동작되는데어떻게 왜 이렇게 동작하는건지 그 원리를 모르겠습니다 ㅠㅠ//#define F_CPU 16000000UL#include <avr/io.h>#include <util/delay.h>//unsigned char index=0;unsigned char dir=0;//int main(void){DDRA=0xFF;while(1){if(dir==0)PORTA=0x01<<index;else PORTA=0x80>>index;_delay_ms(100);index=(index+1)%8;if(index==0)dir=dir^0x01;}}
unsigned char index=0;unsigned char dir=0;이 두개의 전역변수 초기값을 기억 해두시고요
if(dir==0)PORTA=0x01<<index;else PORTA=0x80>>index;dir=0; 이므로 if()문이 실행 되겠죠?
0x01<<index
index=0이므로 결과는 0x01 입니다.
비트연산 중에서 쉬프트 연산을 알아야합니다.
index=0이면 0x01<<index 결과는 00000001
index=1이면 0x01<<index 결과는 00000010
index=2이면 0x01<<index 결과는 00000100
index=3이면 0x01<<index 결과는 00001000
index=4이면 0x01<<index 결과는 00010000
index=5이면 0x01<<index 결과는 00100000
index=6이면 0x01<<index 결과는 01000000
index=7이면 0x01<<index 결과는 10000000
index=8이면 0x01<<index 결과는 00000000 (오버플로우)
index가 8까지는 안갑니다.
아래에서index=(index+1)%8;if(index==0)dir=dir^0x01;1을 증가한 후에 %(모듈러)연산을 하면 1이 됩니다.%8의 결과는 0~7입니다. 이 범위를 벗어나지 못하게 하는 것이죠예를들면 7에서 1 증가하면 8이 되는데 %8의 결과는 0이 되서 다시 처음부터 시작하게 됩니다.index가 0이 되면 dir을 토글 시켜서 1을 만듭니다.dir이 1이므로 이 때부터는if(dir==0)PORTA=0x01<<index;else PORTA=0x80>>index;if()문이 실행되지 않고 else 문이 실행 됩니다.0x80이 우측 쉬프트하게되면100000000100000000100000000100000000100000001000000001000000001000000001결과가 이렇게 나오고index가 8이 되는 순간 %8에 의해서 0이 되면서if(index==0)dir=dir^0x01;이번엔 dir을 0으로 다시 만듭니다.이해가 안가는 부분은 댓글로 적어보세요
댓글 7
조회수 15,273전기의달인감전맨님의 댓글
전기의달인감전맨 작성일
와진짜... 감탄밖에 안나오네요..
짧은 시간안에 이렇게 퍼펙트한 답변이라니..
사부님으로 모시고 싶을 정도네요. 정말 감사합니다ㅠㅠㅠ
전기의달인감전맨님의 댓글
전기의달인감전맨 작성일
궁금한 게 있습니다
if(index==0)dir=dir^0x01;
이 부분은 인덱스가 0일 경우 dir = dir ^ 0x01 이라고 하는데, 거꾸로 가기 직전에 dir이 0이잖아요?
그럼 0000 0000
+0000 0001
= 0000 0001에서 반전이니까 1111 1110아닌가요??
master님의 댓글
master
xor 연산은 전체 반전이 아니고 1인 비트만 반전 시킵니다.
00000000
00000001
-----------
00000001
//----------------
1과 1을 xor하면 0이 됩니다.
00000001
00000001
-----------
00000000
master님의 댓글
master 작성일
~는 비트 반전 연산자인데 모든 비트를 반전 시킵니다.
char형은 8비트 전체를 반전시키고
int형은 16비트 전체를 반전시키고
long형은 32비트 전체를 반전시킵니다.
master님의 댓글
master 작성일
!는 논리부정 연산자인데
참은 거짓으로 바꾸고, 거짓은 참으로 바꿉니다.
//
int i=3;
if(i){}
조건부호 없이 변수만 달랑 적어놓은 경우가 있는데요
변수가 0이면 거짓 (이 정도는 이해가 되겠죠)
변수가 0이 아니면 참입니다. (0을 제외한 모든 수는 참, 음수도 참임)
if(i){}
따라서 i가 0이 아니면 조건을 만족해서 실행 됩니다.
전기의달인감전맨님의 댓글
전기의달인감전맨
하 정말 감사합니다ㅠㅠ master님께 돈주고서라도 배우고싶네요..
master님의 댓글
master
왼쪽 메뉴에서 AVR 따라하기에 보면
2015년 강좌가 있습니다.
//
https://www.basic4mcu.com/bbs/board.php?bo_table=gesiyo6&wr_id=62
2015년 강좌 001 - 데이터형
이 글부터 차근 차근 읽어보세요
쉽게 작성하려고 만든 글이니 앞부분 수십개만 이해해도 공부하기 쉬울겁니다.