BASIC4MCU | 질문게시판 | 아트메가128코딩질문
페이지 정보
작성자 asdf 작성일2018-06-06 15:30 조회6,681회 댓글1건본문
저희가 구현하려는게 회전문인데 i_ray 값이 일정값이상 이거나 포토인터럽트에 물체가 있다고 인식되면 dc모터를 구동하는 것입니다.
이것까진 문제없이 코딩했는데 저희가 원하는게 i-ray 값이 일정이상이되거나 포터인터럽트가 작동해서 dc모터가돌아갈때 동시에 저희가 원하는 도트매트릭스를 구현하려합니다.
저희가 원하는 도트매트릭스를 따로 실행했을때는 문제없이 나왔는데 이것을
i_ray조건에 넣거나 포토인터럽트에 같이 넣어서 구현하니까 실행이 이상하게 깨지거나 안나오더라구요..
제가생각하기엔 타임카운트를 같이써서 그런거같기도하고 TNCT관련 인것 같기도한데..
잘모르겠네요.
지금까지 해온 코딩입니다 어떻게 수정해주면 될까요?..
/*****************************************************
Project : AD컨버터 제어 테스트
Version : LK-AVR128-F V01
Date : 2012-09-11
Author : Kyung Nam Lee
Company : LKEMBEDDED
Compiler: WINAVR+AVRStudio
Comment: 가변저항, 온도, 조도, 적외선센서의 아날로그전압을 AD컨버터하여 RS232통신
포트로 디지털값을 전송하는 프로그램이다.
이때의 UTS(USB TO RS232)컨버터를 사용하여 PC와 AVR FULL 트레이닝보드를 연결하였다.
*****************************************************/#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <compat/deprecated.h>
#include <stdio.h>#define LED_CON *((unsigned char *)0x8000) // LED Control bus
#define SET_CON *((unsigned char *)0x8100) // FND, Buzzer, RELAY Control bus
#define LCD_CON *((unsigned char *)0x8200) // TLCD, GLCD Control bus
#define LCD_DATABUS *((unsigned char *)0x8300) // TLCD, GLCD, FND, Dotmatrix Data bus
#define DOT_YELLOW *((unsigned char *)0x8400) // Dotmatrix Yellow LED
#define DOT_RED *((unsigned char *)0x8500) // Dotmatrix Yellow RED
#define STEPMOR *((unsigned char *)0x8600) // Stepping Motor Control bus
#define DCSERVO *((unsigned char *)0x8700) // DC, Servo Motor Control busvolatile unsigned int ad_buff[5]={0};
volatile const char stm1_ccwSet[4]={0X08,0X02,0X04,0X01};
char status=0;volatile const unsigned char vertical[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
volatile const unsigned char english[11][8]={
0Xf7,0Xf3,0X01, 0X00, 0X00, 0X01, 0Xf3, 0Xf7,
0Xfb,0Xf9,0X80, 0X80, 0X80, 0X80, 0Xf9, 0Xfb,
0Xfd,0Xfc,0XC0, 0Xc0, 0Xc0, 0Xc0, 0Xfc, 0Xfd,
0Xfe,0Xfe,0Xe0, 0X60, 0X60, 0Xe0, 0Xfe, 0Xfe,
0Xff,0Xff,0X70, 0X30, 0X30, 0X70, 0Xff, 0Xff,
0Xff,0X7f,0X38, 0X18, 0X18, 0X38, 0X7f, 0Xff,
0X7f,0X3f,0X1c, 0X0c, 0X0c, 0X1c, 0X3f, 0X7f,
0Xbf,0X9f,0X0e, 0X06, 0X06, 0X0e, 0X9f, 0Xbf,
0Xdf,0Xcf,0X07, 0X03, 0X03, 0X07, 0Xcf, 0Xdf,
0Xef,0Xe7,0X03,0X01, 0X01, 0X03, 0Xe7, 0Xef // O
};
volatile int num_cnt=0;
void Dotmatrix_Timer()
{
volatile static unsigned int cnt=1;
cnt++;
if(cnt>100) //1초 간격
{
num_cnt++;
cnt=0;
if(num_cnt==10)
{
num_cnt=0;
}
}
}void DotmatrixTest()
{int i=0;
for(i=0;i<8;i++)
{DOT_YELLOW=~english[num_cnt][i]; //Orange LED 셋팅 라인(Horizontal)
LCD_DATABUS=vertical[i]; // 공통 라인(Vertical)
_delay_ms(6); //1ms간격 다이내믹 디스플레이
}
}int stm1_cw_flag;
int i=0;volatile int ntc_data; //Thermistor Data
volatile int cds_data; //CDS Data
volatile int vr_data; //Variable Resistor Data
volatile int i_ray; //infrared radiation Data//==================Printf init================
volatile static volatile int uart_putchar( char c, FILE *stream);
volatile static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
volatile static int uart_putchar( char c, FILE *stream){
if (c == '\n')
uart_putchar('\r', stream);
loop_until_bit_is_set(UCSR0A, UDRE);
UDR0 = c;
return 0;
}
/*초기화해준 포트에 따라서 -----------
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
UART0를 사용한다면 UCSR0A/ UDR0
UART1를 사용한다면 UCSR1A/ UDR1로만 변경해주면 된다.
===========================================*/
#define ADC_VREF_TYPE 0x40
volatile unsigned int read_adc(volatile unsigned char adc_input) //AD 컨버팅 함수
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
_delay_us(10);
ADCSRA|=0x40; //AVCC PIN으로 ADC 기준전압 설정
while ((ADCSRA & 0x10)==0); //ADC 폴링상태로 대기
ADCSRA|=0x10; //ADCSRA 초기화
return ADCW; //ADCL , ADCH 각각 8비트를 합산하여 16비트로 사용 (헤더파일 참조)
}
ISR(TIMER0_OVF_vect) // Timer 0 overflow interrupt service routine
{volatile static unsigned int cnt=0;
ad_buff[cnt]= read_adc(cnt);
cnt++;
if(cnt==4)
{
cnt=0;
}
Dotmatrix_Timer();
TCNT0+=0X06;
}ISR(INT0_vect)
{
DCSERVO=0x01;
DotmatrixTest();
}
void main(void)
{
DDRB=0x00; //PORTB INPUTPORT Set
DDRD=0X20; //Photo Sensor PE7 Input Select
PORTD=000;
DDRF=0X00; //EL-7L PF3 Output Select
PORTF=0X00; //EL-7L ON!//---AVR ATmega128-F Board initialization
MCUCR=0X80; //enable External memory and I/O control
EICRA=0x00;
EICRB=0x00;
EIMSK=0x01;
EIFR=0x01;
TCCR0=0X04; //64Prescale, Overflow Interrupt Select
TCNT0=0X06; //Timer Counter Register Init Value
TIMSK=0X01; //timer0 Timer Overflow Interrupt Enable//---ADC initialization------------------
ADMUX=ADC_VREF_TYPE & 0xff; //ADMUX = 0X40 (define선언 참조)
ADCSRA=0x84; //AD 컨버팅 허용, 16분주비 사용
//---UART 통신 initialization-----------
UCSR0A=0x00;
UCSR0B=0x08; //송신 허용
UCSR0C=0x06; //비동기 통신 모드, 데이터 사이즈 8bit
UBRR0H=0x00;
UBRR0L=0x67; //boul rate : 9600 pbs
//---AVR ATmega128-F Board initialization
MCUCR=0X80;
//---External I/O initialization
LED_CON=0X00; // LED GLCD Control bus
SET_CON=0X00; // FND, Buzzer, RELAY Control bus
LCD_CON=0X00; // TLCD, GLCD Control bus
LCD_DATABUS=0X00; // TLCD, GLCD, FND, Dotmatrix Data bus
DOT_YELLOW=0X00; // Dotmatrix Yellow LED
DOT_RED=0X00; // Dotmatrix Yellow RED
STEPMOR=0X00; // Stepping Motor Control bus
DCSERVO=0X00; // DC, Servo Motor Control bus
//----------------------------------------
stdout = &mystdout; // printf 문자열
sei();//Global Interrupt Enable bit Setwhile (1) //Endless Loop
{
i_ray=ad_buff[3]; //ifrared ray Data
//UART통신 포트로 출력(시리얼컴을 통해 확인)
if(ad_buff[3]>500 )
{
DCSERVO=0x01;
DotmatrixTest();
}
else
{
DCSERVO=0x00;
}
}}
댓글 1
조회수 6,681asdf님의 댓글
asdf 작성일이렇게돌리니까 저희가구현하는 도트매트릭스가 화살표모양으로 왼쪽으로지나가는것인데 i ray조건에서는 잘돌아가는데 포토인터럽트조건에서는 화살표 도트매트릭스가뜨긴뜨는데 옆으로 이동을하질않네요..