BASIC4MCU | 질문게시판 | 답변 : ATMEGA128 HIGH LOW신호 수신 질문
페이지 정보
작성자 master 작성일2022-06-17 10:05 조회7,526회 댓글3건본문
#define F_CPU 16000000UL
#define HF_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//
volatile char old_PD0=1,now_PD0;
volatile char old_PD1=1,now_PD1;
volatile char old_PD2=1,now_PD2;
//
volatile char LED_Flag=0,flag=0,KEY_CNT=0;
//
volatile unsigned long Freq,top;
//
void PWM_ON(unsigned int top){
TCCR3A=0x2D; TCCR3B=0x11; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
//
void PWM_OFF(unsigned int top){
TCCR3A=0x00; TCCR3B=0x00; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
//
void KEY_SCAN(void){
now_PD0=PIND&1; //PD0 스위치 누르면 now_pin=0
now_PD1=PIND&2; //PD1
now_PD2=PIND&4; //PD2
//
if (old_PD0 && now_PD0==0){ Freq-=1000; top=HF_CPU/Freq; PWM_ON(top); } // 1k씩 주파수 감소
else if(old_PD1 && now_PD1==0){ Freq+=1000; top=HF_CPU/Freq; PWM_ON(top); } // 1k씩 주파수 증가
else if(old_PD2 && now_PD2==0){
if(LED_Flag==0){ LED_Flag=1; PORTB=0x01; Freq=210000UL; top=HF_CPU/Freq; PWM_ON(top); }
else { LED_Flag=0; PORTB=0x00; top=0; PWM_OFF(top); }
}
//
old_PD0=now_PD0; old_PD1=now_PD1; old_PD2=now_PD2;
}
//
ISR(USART0_RX_vect){
RXdata=UDR0;
if(RXdata=='G'){
if(LED_Flag==0){ LED_Flag=1; PORTB=0x01; Freq=210000; top=HF_CPU/Freq; PWM_ON(top); }
}
else if(RXdata=='Q'){
if(LED_Flag){ LED_Flag=0; PORTB=0x00; top=0; PWM_OFF(top); }
}
RXdata=0;
}
//
ISR(TIMER2_COMP_vect){
if(KEY_CNT++==50){ KEY_CNT=0; KEY_SCAN(); } // 50m 때마다 실행.// 키 스캔 카운터 초기화
}
//
int main(void){
DDRA=0xff; // 출력핀 설정
PORTD=0x0F; // PD0,PD1,PD2,PD3 스위치 입력
DDRB=0xFF; // PWM핀으로 출력으로 설정
DDRE=0x30; // 4,5포트 출력
UCSR0B=0x98; UBRR0L=103; // 8MHz : 51
TCCR2=0x0B; OCR2=249; TIMSK=0x80; //16000000/64/(1+249),1ms
sei();
while(1);
}
PD3가 아니고 PD2입니다.
댓글 3
조회수 7,526yhj2644님의 댓글
yhj2644 작성일답변해주셔서 감사합니다. 작성해주신 코딩으로 동작 시켜 봤습니다. 근데 원래처럼 AVRISP를 통해 노트북과 연결하여 3.3V전원을 주었을 때는 정상적으로 동작하지만 외부전원 5V(12V SMPS와 LM7805를 통해 5V를 만들었습니다.)를 인가하였을 때는 PD2번에 아두이노에서 나온 HIGH,LOW신호를 주었을 때 스위치동작을 하지 않습니다. 이유를 잘 모르겠네요
master님의 댓글
master
아두이노 GND와 AVR GND를 연결해야 합니다.
신호만 연결한 것 같군요
yhj2644님의 댓글
yhj2644 작성일감사합니다. 두 개를 같은 그라운드로 하니 해결 되었습니다.