BASIC4MCU | 질문게시판 | atmmega128 타이머 인터럽트질문이요!!
페이지 정보
작성자 베렐렐렐레 작성일2018-12-19 01:31 조회7,273회 댓글1건본문
인터럽트코드하고 타이머코드를 이용해서 SW1을누르면 LCD가 한바퀴돌아 SW1이 표시되는 숫자가 1이 증가하고
SW2를 누르면 반대로 SW2가 표시되는 숫자가 감소하게 구동부탁드립니다. 그외에 신박하게 구동할 수 있는 아이디어 있으면 도와주세요.ㅠㅠ
#include <stdio.h>
#include <avr/io.h>
#include "WAT128.h"
// 카운터용 변수
int g_iSW1Count = 0;
int g_iSW2Count = 0;
unsigned char led = 0xff; //led 초기값설정
// 출력용 임시 변수
char g_Temp[20];
int main()
{
CLCD_Init(); // LCD 초기화
DDRE = 0xff; // E포트 설정
PORTE = 0xff;
// 외부 인터럽트 초기화
EICRA = 0x22; // // INT0 과 INT2 하강 에지에서 인터럽트 요청 0010 0010
EIMSK = 0x05;//외부장치 인터럽트레지스터 INT0과 INT2를 활성화 0000 0101
sei(); // Set Enable Interrupt 전체 인터럽트 활성화
// CLCD 화면에 출력
CLCD_PutString(0,0,"Please push..");
sprintf(g_Temp," %4d, %4d",g_iSW1Count,g_iSW2Count);
CLCD_PutString(0,1,g_Temp);
// 수시로 카운터 출력
while(1)
{
sprintf(g_Temp," %4d, %4d",g_iSW1Count,g_iSW2Count);
CLCD_PutString(0,1,g_Temp);
}
}
// INT0 걸리면 ( SW1 버튼 눌리면 )
ISR(INT0_vect)
{
g_iSW1Count++; // g_iSW1Count 증가
led<<=1; //지정한 수만큼 왼쪽으로 비트들을 이동led|=0x01; //비트연산자
if(led == 0xff) led = 0xfe; //led값이 0xff일때 led값을 0xfe로 저장
PORTE=led;
}
// INT2 걸리면 ( SW2 버튼 눌리면 )
ISR(INT2_vect)
{
g_iSW2Count++; // g_iSW2Count 증가
led>>=1; //지정한 수만큼 오른쪽으로 비트들을 이동
led|=0x80; //비트연산자
if(led == 0xff) led = 0x7f; //led값이 0xff일때 led값을 0x7f로 저장
PORTE=led;
}인터럽트 코드입니다
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "WAT128.h"
#define LED_PORT PORTE
#define LED_PORT_DIR DDRE
// 1초 계산용
volatile int g_Timer = 0;
volatile int g_TimeTick = 0; // 1초 경과 횟수
ISR(TIMER0_COMP_vect) // 타이머0 compare 인터럽트 루틴
{
TCNT0 =0x00; // 8비트 2진 카운터 초기치를 0으로 줌
g_Timer++; // 1mS 마다 증가
if(g_Timer>=1000)
{
g_TimeTick ++; // 1초마다 증가
g_Timer = 0;
}
}
void InitTimer0()
{
ASSR = 0x00; // 플래그 레지스터
TCCR0 = 0x04; // 일반모드로 계수 클럭주파수를 클럭소스/64 분주하여 설정함.
TCNT0 = 0x00;
OCR0 = 171; // Compare레벨 설정값 Register, 대략 1초가 되도록 세팅
}
int main()
{InitTimer0();
LED_PORT_DIR = 0xFF; // E포트를 LED 출력용으로 설정
LED_PORT = 0xFE; // 첫번째 LED 1개를 ON
TIMSK=0x02; // TIMSK레지스터 2번째 비트를 활성화하여 TIMER0_COMP_vect
// 인터럽트 루틴을 사용함
sei(); // 전체 인터럽트 활성화
while(1)
{
if(g_TimeTick >=1) // 1초가 경과되면
{
if(LED_PORT == 0x7F) // 마지막 LED 가 ON 되었다면
{
LED_PORT = 0xFE; // 처음 LED ON되게 함
}
else // 그렇지 않다면
{
LED_PORT <<= 1; // 한칸 상위비트로 이동한 후
LED_PORT |= 1; // 마지막 LED는 OFF 되게 최하위비트를 1로 만듬
}
g_TimeTick = 0;
}
}
}타이머 코드입니당
댓글 1
조회수 7,273master님의 댓글
master 작성일https://www.basic4mcu.com/bbs/board.php?bo_table=gesiyo10&wr_id=21