질문게시판 > 답변3 : atmega2560에 관하여 질문드립니다.(비트마스크)

TODAY17 TOTAL241,243
사이트 이용안내
Login▼/회원가입
포럼 동영상강좌 회원가입


BASIC4MCU 후원업체 최신 정보

BASIC4MCU | 질문게시판 | 답변3 : atmega2560에 관하여 질문드립니다.(비트마스크)

페이지 정보

작성자 master 작성일2018-02-07 17:14 조회749회 댓글2건

본문

	

 

interrupt[EXT_INT2]void ext_int2_isr(void){ //ELEV Channel
  if(EICRA==0b11110000){ cnt_rising=TCNT1L|(long)TCNT1H<<8EICRA=0b11100000; }
  elsecnt_falling=TCNT1L|(long)TCNT1H<<8cnt_elev=(40000-cnt_rising+cnt_falling)%40000EICRA=0b11110000; }
}

 

4개의 인터럽트는 모두 같은 유형이니 하나만 설명합니다.

 

연산에 문제가 있습니다.

interrupt[EXT_INT2]void ext_int2_isr(void){ 
  if(EICRA==0b11110000){ EICRA=0b11100000; }
  else                  EICRA=0b11110000; }
}

체크해야 하는 비트는 4,5인데 이대로 조건식을 만들면 

비트6,7의 영향을 받습니다.

interrupt[EXT_INT2]void ext_int2_isr(void){ 
  if((EICRA&0b00110000)==0b00110000){ EICRA&=~0b00010000; }
  else                               EICRA|0b00010000; }
}

if()문의 조건식이나 값을 설정하는 곳 모두 비트마스크 방법을 사용해야 합니다.

interrupt[EXT_INT2]void ext_int2_isr(void){ 
  if(EICRA&0x10){ } //비트4가 1이면
  else          } //비트4가 0이면
  EICRA^0x10; // 나가기 전에 비트4 반전
}
저라면 이렇게 작성하겠습니다.

 

 

언급하지 않은 다른 부분도 잘 체크 해보세요

 

RC수신기로부터 8채널 PWM 신호 입력 - CPPM 이미지 

RC수신기로부터 8채널 PWM 신호 입력 - PPM 이미지 

위 예제 참고하세요 (동작시켜본 것은 이닙니다.)

 

//

"고수가 되는 지름길은 포기하지 않고 오류를 디버깅 하는 것이다."

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 2

조회수 749

희안님의 댓글

희안 작성일

단순히 데이터 시트를 바탕으로 코드를 짜면 되는 줄 알았는데 서로 다른 비트가 조건식에 의해 영향을 받는 것까지는 차마 생각하지 못했었네요. 올려주신 예제와 비트마스크 그리고 답변 1을 참조하여 좀 더 간략하고 깔끔한 코딩식을 짜봐야 겠습니다. 도움을 주셔서 감사합니다.

master님의 댓글

master 댓글의 댓글 작성일

조종기의 PWM 채널 신호는
각각의 인터럽트가 순차적으로 들어오기 때문에
특수한 상황이라서 문제가 되지는 않겠습니다.

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.

ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
게시물 검색

Privacy Policy
MCU BASIC ⓒ 2017