BASIC4MCU | 질문게시판 | atmega128
페이지 정보
작성자 망경이 작성일2022-06-18 16:20 조회518회 댓글2건본문
atmega128 CTC mode 스피커 동작 관련 질문있습니다.
안녕하세요. atmega128 pro로 혼자 연습 중인 학생입니다.
현재 스위치를 누르면 멜로디가 나오고 모터가 돌아가는 프로그램을 만들고 있습니다.
그런데 스위치 ON일 때 멜로디만 나오고 OFF일 때 모터만 돌아가는 문제가 생겨 며칠째 골머리를 앓고 있는 중입니다.
같은 if문 안에 있어도 따로 동작하는 원인이 뭔지 도저히 모르겠습니다.
스위치 연결 시 풀다운 저항으로 연결하였습니다.
답변 부탁드립니다 ㅠㅠ
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define F_CPU 16000000UL //외부 크리스탈 16MHz
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define P 2000 //파라솔 여닫는 시간
#define X 1000 //조건 점검 간격
#define Y 2000 //펼친 후 여유 시간
int op[4] = {3830, 3038, 2550, 1911}; //도(261) 미(329) 솔(392) 도(523) 16M/(2x분주비x주파수) = 1+OCRn
int cl[4] = {1911, 2550, 3038, 3830}; //도(523) 솔(392) 미(329) 도(261)
volatile int status=0; //파라솔 상태를 저장하는 변수
void port_init(void){
DDRB = 0x10; //스피커 출력(PB4)
PORTB = 0x01;
DDRC = 0x03; //모터 회전 신호 출력
PORTC = 0x00;
DDRD = 0x00; // 수동 ON OFF 스위치(PD0)
PORTD = 0x00;
}
void OpenSound(void){
TCNT0 = 0x00;
TCCR0 = 0x1A; //0b0001 1010 CTC, 분주비=8, compare match에서 OCR0 toggle
for(int i=0; i<4; i++){
OCR0 = op[i];
_delay_ms(500);
}
TCCR0 = 0x08; //스피커용 파형 발생 정지
OCR0 = 0;
}
int main(){
port_init();
unsigned int pa_sw;
while(1){
pa_sw = PIND&0x01;
if(pa_sw==0x01){
OpenSound();
PORTC = 0x01; //모터로 파라솔 엶
status = 1;
_delay_ms(2000); //Y분 지연
PORTC = 0x00;
}
}
}
댓글 2
조회수 518master님의 댓글
master 작성일
아직도 해결 안됬나요?
LED 점멸 같은 간단한 코드를 작성해서 컴파일이 문제없이 되서 정상적으로 돌아가는지 체크하세요
master님의 댓글
master 작성일
스위치를 다른 핀으로 변경해서도 돌려보세요
초보자들은 핀을 잘 고장내기도 합니다.