BASIC4MCU | 질문게시판 | 도와주세요
페이지 정보
작성자 hello0 작성일2021-12-24 01:20 조회528회 댓글2건본문
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <stdio.h>
#include <avr/interrupt.h> // interrupt 관련 lib가 들어 있다.
extern void UART0_transmit(char data); // FILE OUTPUT = FDEV_SETUP_STREAM(UART0_transmit, NULL, _FDEV_SETUP_WRITE); 이거보다 앞에 선언해야함
#define DELAY 2000
// printf를 동작 시키위한 mapping작업
FILE OUTPUT = FDEV_SETUP_STREAM(UART0_transmit, NULL, _FDEV_SETUP_WRITE);
//3번 timer/counter를 설정 - OC3C / PE5 / 2~16bit
void pwm_init(void)
{
DDRE |= (1<<PE0) | (1<<PE2) | (1<<PE5);
// DDRE |= 0b00100101
// 모드14 고속pwm timer 3번
TCCR3A |= (1<<WGM30); // TCCR(Timer Counter Control Resistor)
TCCR3B |= (1<<WGM32);
// 비반전모드 TOP: 0xff 비교일치값: OCR3C: PE5
TCCR3A |= (1<<COM3C1);
// 분주비 64 -> 16000000Hz/64 = 250000Hz
// 256/250000 = 1.02ms -> 최대속도
// 127/250000 = 0.5ms -> 중간속도
TCCR3B |= (1<<CS31) | (1<<CS30); // 분주비 64 / 318p
OCR3C = 0;
}
int main(void)
{
uint8_ISR=0;
ISR = (1<<ISR(INT1_vect));
pwm_init();
stdout = &OUTPUT;
//UART0_init();
while (1)
{
if (ISR(INT1_vect) == 1) // 모터정지
{
ISR(INT1_vect) = 0;
OCR3C =0;
PORTE |= 0b00000101; // PE0:1 PE2:1 정지
}
else // start
{
ISR(INT1_vect) = 1;
PORTE &= 0b11111110;
PORTE |= 0b00000100;
OCR3C=70;
}
}
else if (ISR(INT2_vect)()) // speed 20 증가
{
if (OCR3C < 250)
{
PORTE &= 0b11111110; // PE0:0 PE2:1
PORTE |= 0b00000100;
OCR3C +=20;
}
else
{
;
}
}
else if (ISR(INT3_vect)()) // speed 20 감소
{
if (OCR3C > 70)
{
PORTE &= 0b11111110; // PE0:0 PE2:1
PORTE |= 0b00000100;
OCR3C -=20;
}
else
{
;
}
}
}
}
s/w1 : Start/Stop (toggle 버튼)
s/w2 : speed-up을 누르면 20씩 증가 / 범위: OCR3C=70 ~ 250
s/w3 : speed-down 누르면 20씩 감소 / 범위: OCR3C=70 ~ 25
을 만들고 싶은데 계속 실행이 안되네요....어디가 잘못된 걸까요
댓글 2
조회수 528master님의 댓글
master 작성일
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
//
volatile char run=0;
//
ISR(INT1_vect){
run^=1;
if(run){ OCR3C=70; PORTE&=~1; }
else { OCR3C= 0; PORTE|= 1; } // 정지
}
//
ISR(INT2_vect)(){ // speed 20 증가
if(run){
if(OCR3C<=235)OCR3C+=20;
}
}
//
ISR(INT3_vect)(){ // speed 20 감소
if(run){
if(OCR3C>=90)OCR3C-=20;
}
}
//
int main(void){
DDRE=0x25; PORTE=4;
TCCR3A=(1<<WGM30)|(1<<COM3C1); TCCR3B=(1<<WGM32)|(1<<CS31)|(1<<CS30);
EICRA=0xFF; EIFR=0xFF; EIMSK=0x0E;
while(1);
}
룰루님의 댓글
룰루
전체코드인가요??아님 틀린 부분만 있는 코드인가요??
혹시 전체코드로 써주실수있을까요??급하게 해야하는데 밖이여서 폰으로 복사해서 지인한테 해달라고 해야해서요ㅠㅠ 진짜 죄송합니다ㅠ