BASIC4MCU | 질문게시판 | ATMEGA128 HIGH LOW신호 수신 질문
페이지 정보
작성자 yhj2644 작성일2022-06-16 21:13 조회236회 댓글0건본문
아트메가128로 PWM파형을 만들고 스위치 3개를 이용해 하나는 ON/OFF, 나머지 두 개는 주파수 변경 기능을 합니다.
블루투스 모듈로 ON/OFF제어도 가능합니다. 여기까지는 완성 되었고 추가적으로 아두이노 메가에서 특정 동작을 시작하면
아트메가를 ON/OFF시키는 동작을 하고 싶어서 아트메가 128의 ON/OFF제어를 담당하는 스위치가 연결된 PD3번 핀에 아두이노 메가에서 HIGH, LOW신호를 번갈아가면서 주어 스위치처럼 동작 시키려고 하였습니다. (테스트를 위해 HIGH,LOW 신호 코딩만 함)
그런데 아트메가128을 노트북과 연결하였을 때에는 원하는 동작을 하였지만 VCC에 5V의 외부전원을 연결하였더니
아트메가에서 HIGH신호를 제대로 받지 못하는지 아무런 동작을 하지 않습니다. 아무리 찾아봐도 이유를 모르겠어서 이렇게 질문문 드립니다. (아두이노에서 주는 HIGH신호는 5V입니다.)
-------------------------------- 아트메가 코딩 ---------------------------------------
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
//
volatile unsigned char flag;
unsigned char top;
unsigned int old_pind0=0,now_pind0=1;
unsigned int old_pind1=0,now_pind1=1;
unsigned int old_pind2=0,now_pind2=1;
unsigned int LED_Flag=0;
double Freq;
unsigned int KEY_CNT=0 ;
#define Array_EA sizeof(SineTable)/sizeof(SineTable[0])//배열개수 계산
#define SYS_CLK 16e6 // 클럭 주파수
#define FRESCALE 128 // 분주비
#define EIGHT_BIT 0x100 //(256)
#define TIME_GAP2 1e-3 // 1(ms)
#define AUTO_REROAD2 EIGHT_BIT-TIME_GAP2 * SYS_CLK/FRESCALE // 1m 마다 오버플로우 발생
//
ISR(USART0_RX_vect){
flag=UDR0;
}
//
void KEY_SCAN(void){
now_pind0=PIND&1; //PD0 스위치 누르면 now_pin=0
now_pind1=PIND&2; //PD0
now_pind2=PIND&4; //PD2
//
DDRA=0xff; // 출력핀 설정
UCSR0B=0x98; UBRR0L=103; // 8MHz : 51
//
if(old_pind0 && now_pind0==0){
Freq-=1e3; top=16e6/(2*1*Freq); //1k씩 주파수 감소
TCCR3A=0x2D; TCCR3B=0x11; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
else if(old_pind1 && now_pind1==0){
Freq+=1e3;
top=16e6/(2*1*Freq); // 1k씩 주파수 증가
TCCR3A=0x2D; TCCR3B=0x11; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
else if(old_pind2 && now_pind2==0){
if(LED_Flag==0){ LED_Flag=1; //PWM On
PORTB=0x01; Freq=210000; top=16e6/(2*1*Freq);
TCCR3A=0x2D; TCCR3B=0x11; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
else{ LED_Flag=0; //PWM off(LED_Flag=1)
PORTB=0x00; top=0;
TCCR3A=0x00; TCCR3B=0x00; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
}
//
old_pind0=now_pind0; old_pind1=now_pind1; old_pind2=now_pind2;
//
if(flag=='G'){ flag=0;
if(LED_Flag==0){ LED_Flag=1;
PORTB=0x01; Freq=210000; top=16e6/(2*1*Freq);
TCCR3A=0x2D; TCCR3B=0x11; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
}
else if(flag=='Q'){ flag=0;
if(LED_Flag){ LED_Flag=0;
PORTB=0x00; top=0;
TCCR3A=0x00; TCCR3B=0x00; OCR3A=top; OCR3B=(top/2); OCR3C=(top/2);
}
}
}
//
SIGNAL(SIG_OVERFLOW2){
TCNT2=AUTO_REROAD2; // 1m마다 오버플로우 발생
if(KEY_CNT++==50){ KEY_CNT=0; KEY_SCAN(); } // 50m 때마다 실행.// 키 스캔 카운터 초기화
}
//
int main(void){
DDRA=0xff; // 출력핀 설정
UCSR0B=0x98; UBRR0L=103; // 8MHz : 51
//DDRD=0x00; //스위치 입력
DDRB=0xFF; // PWM핀으로 출력으로 설정
DDRE=0x30; //4,5포트 출력
TCCR2=0x03; TCNT2=AUTO_REROAD2; TIMSK=0x40;
sei();
while(1);
}
------------------------------ 아두이노 메가 HiGH, LOW 코딩 ----------------------------------
#include <SoftwareSerial.h> void setup() { pinMode(40, OUTPUT); // 8번 핀을 출력으로 설정합니다. Serial.begin(9600); } void loop() // { digitalWrite(40, HIGH); Serial.println("HIGH"); delay(1000); digitalWrite(40, LOW); Serial.println("LOW"); delay(1000); }
댓글 0
조회수 236등록된 댓글이 없습니다.