BASIC4MCU | 질문게시판 | 인터럽트 활성화시 LCD 오류 발생
페이지 정보
작성자 마프하나 작성일2022-11-16 21:53 조회1,134회 댓글0건본문
초음파 센서를 I2C(TWI)로 atmega128과 연결해서 거리 값을 측정하려고 시도 중입니다. 아직 초음파 센서(SRF02)를 구입하지 않아서 임시로 확인 용으로 코드만 구현해보았는데요.
sei()를 활성화 시키면 LCD에서 _만 출력 됩니다.
sei()를 주석 처리하면 정상적으로 "Hello"가 출력되고요.
초음파 센서와 관련된 코드는 현재 문제와는 상관 없다고 생각됩니다.
책과 인터넷을 찾아보았지만 크게 관련있는 정보는 찾지 못하였습니다.
#define F_CPU 14745600UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include "lcd.h"
#include "TWI.h"
unsigned char ti_Cnt_1ms; //1ms 단위 시간 계수를 위한 전역 변수 선언
//1ms 계수를 위한 타이머 설정
unsigned char *str;
unsigned char Ptr1[] = "Hello";
void Timer0_Init()
{
TCCR0 = (1<<WGM01) | (1 << CS00) | (1<<CS01) | (1 << CS02); //CTC모드, 1024 분주
TCNT0 = 0x00;
OCR0 = 14; //14.7456MHz / 1024 분주 / 14단계 = 1.028kHz
TIMSK = (1 << OCIE0); //비교 일치 인터럽트 허가
}
ISR(TIMER0_OVF_vect)
{
ti_Cnt_1ms++;
}
void LCD_print1(void){
LCD_Pos(0, 0);
LCD_Str(str);
LCD_Delay(5);
}
void main(void)
{
char Sonar_addr = 0xE0; //측정하고자하는 장치 주소
unsigned int Sonar_range; //측정 거리를 저장할 변수
char Message[40]; //LCD 화면에 문자열 출력을 위한 문자열 변수
DDRB = 0xFF; // PORTB를 출력으로 설정
PORTB = 0xFF; // LED를 끄도록 설정함
LCD_Init(); //LCD 초기화
Timer0_Init(); //1ms 계수를 위한 타이머 초기화
I2C_Init(); //I2C 통신 초기화
sei(); //인터럽트 활성화시 LCD 사용 불가
_delay_ms(10);
startRanging(Sonar_addr);
str = Ptr1;
ti_Cnt_1ms = 0;
while(1)
{
str = Ptr1;
LCD_Pos(0,0);
LCD_Str(str);
//대기 시간이 66ms 이상일 경우
if(ti_Cnt_1ms > 66)
{
//초음파 센서 거리 측정 데이터 얻기
Sonar_range = getRange(Sonar_addr);
//측정된 거리 LCD화면에 출력
LCD_Pos(0,0);
LCD_Str("Hello2");
//LCD_Str("Measured Dist. = ");
sprintf(Message, "%03d cm", Sonar_range);
LCD_Pos(1,10);
LCD_Str(Message);
//초음파 센서 거리 측정 시작 명령어
startRanging(Sonar_addr);
//대기 시작 초기화
ti_Cnt_1ms = 0;
}
}
}
댓글 0
조회수 1,134등록된 댓글이 없습니다.