BASIC4MCU | 질문게시판 | atmega128 타이머 카운터를 사용한 버튼제어 스톱워치
페이지 정보
작성자 수제비성애자 작성일2021-12-19 19:11 조회1,203회 댓글1건본문
#define F_CPU 16000000
#define INIT_SEC 0
#define INIT_MIN 0
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned char count_int=0;
volatile int start=0;
char count=0, Seconds=INIT_SEC, Minutes=INIT_MIN;
ISR(INT0_vect) {
if(start==0) start=1; // state가 STOP으로 시작되고, INT0을 누르면 state는 START로 바뀐다. 따라서 INT0을 1번 누르면 START가 된다.
}
ISR(INT1_vect) {
if(start==1) start=0; // INT1을 누르면 state는 INIT가 된다.
}
ISR(TIMER0_OVF_vect) // TIMER0 has overflowed
{
if(start==1){
count_int++; // count_int값이 하나 증가
// 244번에 한번씩 seconds를 하나 증가 즉, 244.14 Hz / 244 = 1Hz, 즉 1초임.
if(count_int == 244){
Seconds++; //1초가 지날 때 Seconds를 1씩 올린다.
count_int=0; //다시 count는 0부터 세어진다.
}
}
}
int main(void)
{
const unsigned char Segment_Data[] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};
//"0, 1, 2, 3, 4, 5, 6, 7, 8, 9"
unsigned int COLUMN[4]={0,0,0,0};
DDRA=0xff; // PORTA 출력용으로 설정
DDRC=0xff; // PORTC 출력용으로 설정
TCCR0 = 0x06; // Normal mode, prescale 256, 16M/256=62500Hz
TCNT0 = 0x00; // n=0, 256 count, 62500Hz/256=244.14Hz
TIMSK = 0x01; // timer0 OVERFLOW interrupt enable
SREG |= 0x80; // Global Interrupt Enable
while (1)
{
COLUMN[0] = (Minutes%100)/10; // 분의 십의자리를 계산하여 넣는다.
COLUMN[1] = (Minutes%10); // 분의 일의자리를 계산하여 넣는다.
COLUMN[2] = (Seconds%100)/10; // 초의 십의자리를 계산하여 넣는다.
COLUMN[3] = (Seconds%10); // 초의 일의자리를 계산하여 넣는다.
for(int i=0;i<4;i++)
{
// i번째 자리의 DIGIT만 선택. Common Anode라서 거기만 Common을 0을 주어 켤 수 있도록 함.*/
PORTC=~(0x01<<i);
// i번째 자리에 해당하는 세그먼트의 숫자를 켬
PORTA = Segment_Data[COLUMN[i]];
_delay_ms(2);
}
if(Seconds>=60) // 초값이 60이 되면 1분 = 60초
{
Seconds=0; // 초값을 0으로 만듦
Minutes++; // 분값은 하나 증가함
}
}
}
switch state를 사용하여 초기값 0000으로 시작해INT0을 누르면 진행, INT1을 누르면 멈춤으로 만들어보려고 합니다.현재코드로 진행하면 0000에서 INT0, INT1을 눌러도 진행이 되지 않습니다.타이머 카운터를 INT0을 눌렀을 때 동작시켜야되는데 그러지 못하고 있는 것으로 보입니다.어떻게 해야 해결할 수 있을까요?
댓글 1
조회수 1,203master님의 댓글
master 작성일
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000
#include <util/delay.h>
//
volatile unsigned char COLUMN[4]={0,0,0,0},Seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};
volatile unsigned char start=0,count=0,Sec=0,Min=0;
//
ISR(INT0_vect){ start=1; }
ISR(INT1_vect){ start=0; }
//
ISR(TIMER0_OVF_vect){ // 1ms
static int ms=0;
static char c=0;
if(start){
if(++ms4>=1000){ ms=0;
if(++Sec>=60){ Sec=0;
if(++Min>=60)Min=0;
COLUMN[0]=(Min%100)/10; COLUMN[1]=(Min%10);
}
COLUMN[2]=(Sec%100)/10; COLUMN[3]=(Sec%10);
}
}
//
PORTC=~(1<<c); PORTA=Seg[COLUMN[c]];
if(++c>3)c=0;
}
//
int main(void){
DDRA=0xff; DDRC=0xff;
TCCR0=0x06; TIMSK=0x01;
EICRA=0xAA; EIFR=0xFF; EIMSK=0x03; //falling edge
SREG|=0x80;
while(1){}
}