뉴티씨



  • HOME
  • 고객지원
  • 질문답변


 
소스간단질문
 글쓴이 : 관리자
작성일 : 18-05-04 09:34
조회 : 217  
안녕하세요? 고객님.
저희 뉴티씨 제품을 이용하여주셔서 감사합니다.

cli(); 는 AVR의 기능으로
인터럽트 호출을 강제로 막는 기능을 합니다.
cli()가 말씀하신 두 소스의 작동을 하지는 않습니다.


cli(); 가 하는 역할은 SREG 이라는 레지스터의 global interrupt enable을 관장하는 비트를 OFF합니다.
Status Register인데요. 상태 레지스터라고 마이크로 컨트롤러마다 하나씩 있습니다.
즉, SREG = SREG & 0x7F; 입니다.
이 비트를  disable 하면, 전체 인터럽트가 일어나지 않습니다.

어떤 인터럽트든 인터럽트를 enable하려면 이 비트도 1로 되어야 하고,
일으키려고 하는 개별 인터럽트도 걸어야 합니다. 두 가지가 다 되어 있어야 인터럽트가 발생합니다.

그리고, 컴파일러마다 인터럽트 발생시 수행하는 벡터값에 대응하는 인터럽트 핸들러 함수가 있는데,
그 함수 내부에 인터럽트 발생시 수행하기를 원하는 내용을 적어주어야 합니다.

괜찮으니 이곳으로 언제든 질문 주세요.


감사합니다.

>
>
> 계속 질문드려서 죄송합니다.
>
> 아래 while문에서
> cli();가 일어나면
>
> > >  ENABLE1_ON;
> > >  PWM1_ON;
> > >  BREAK1_OFF;
> > >  ENABLE2_ON;
> > >  PWM2_ON;
> > >  BREAK2_OFF;
>
> +
> > >
> > >    DIR1_OFF;
> > > DIR2_OFF;
> > > PORTG = 0x02;
> > > delay(2000);//반시계
>
>
> 이렇게 두소스가 작동을 하는것인가요??
>
> ---
>
> > > // S/W Environment : AVR Studio + WINAVR Compiler
> > > // Target : M128
> > > // Crystal: 16MHz
> > > //
> > > // Made by NEWTC Co., Ltd. in Korea.
> > > // DAEWOO RYU 
> > > // Email : davidryu@newtc.co.kr
> > > // +82-2-704-4774(TEL), +82-2-704-4733(FAX)
> > > // http://www.newtc.co.kr
> > > // example : AM-DCx-xx DC motor controller test
> > >
> > > #include <avr/io.h>
> > > #include <avr/interrupt.h>
> > >
> > > #define MOTOR_PORT PORTC
> > > #define PWM1_ON (MOTOR_PORT|=0x01)
> > > #define PWM1_OFF (MOTOR_PORT&=0xFE)
> > > #define DIR1_ON (MOTOR_PORT|=0x02)
> > > #define DIR1_OFF (MOTOR_PORT&=0xFD)
> > > #define ENABLE1_OFF (MOTOR_PORT|=0x04)
> > > #define ENABLE1_ON (MOTOR_PORT&=0xFB)
> > > #define BREAK1_ON (MOTOR_PORT|=0x08)
> > > #define BREAK1_OFF (MOTOR_PORT&=0xF7)
> > >
> > > #define PWM2_ON (MOTOR_PORT|=0x10)
> > > #define PWM2_OFF (MOTOR_PORT&=~0x10)
> > > #define DIR2_ON (MOTOR_PORT|=0x20)
> > > #define DIR2_OFF (MOTOR_PORT&=~0x20)
> > > #define ENABLE2_OFF (MOTOR_PORT|=0x40)
> > > #define ENABLE2_ON (MOTOR_PORT&=~0x40)
> > > #define BREAK2_ON (MOTOR_PORT|=0x80)
> > > #define BREAK2_OFF (MOTOR_PORT&=~0x80)
> > >
> > >
> > >
> > > void port_init(void)
> > > {
> > >  PORTA = 0x00;
> > >  DDRA  = 0x00;
> > >  PORTB = 0x00;
> > >  DDRB  = 0x00;
> > >  PORTC = 0x00; //m103 output only
> > >  DDRC  = 0xff;
> > >  PORTD = 0x00;
> > >  DDRD  = 0x00;
> > >  PORTE = 0x00;
> > >  DDRE  = 0x00;
> > >  PORTF = 0x00;
> > >  DDRF  = 0x00;
> > >  PORTG = 0x00;
> > >  DDRG  = 0xff;
> > > }
> > >
> > > //call this routine to initialize all peripherals
> > > void init_devices(void)
> > > {
> > >  //stop errant interrupts until set up
> > >  cli(); //disable all interrupts
> > >  XMCRA = 0x00; //external memory
> > >  XMCRB = 0x00; //external memory
> > >  port_init();
> > >
> > >  MCUCR = 0x00;
> > >  EICRA = 0x00; //extended ext ints
> > >  EICRB = 0x00; //extended ext ints
> > >  EIMSK = 0x00;
> > >  TIMSK = 0x00; //timer interrupt sources
> > >  ETIMSK = 0x00; //extended timer interrupt sources
> > >  sei(); //re-enable interrupts
> > >  //all peripherals are now initialized
> > > }
> > >
> > > void delay(int delaytime){
> > > int i,j;
> > > for(i=0;i<1000;i++){
> > > for(j=0;j<delaytime;j++){
> > > }
> > > }
> > > }
> > >
> > > int main(void)
> > > {
> > >  init_devices();
> > > 
> > >  ENABLE1_ON;
> > >  PWM1_ON;
> > >  BREAK1_OFF;
> > >  ENABLE2_ON;
> > >  PWM2_ON;
> > >  BREAK2_OFF;
> > > 
> > >  while(1){
> > >  DIR1_ON;
> > > DIR2_ON;
> > > PORTG = 0x01;
> > > delay(2000);//시계
> > > cli();
> > >
> > >
> > >    DIR1_OFF;
> > > DIR2_OFF;
> > > PORTG = 0x02;
> > > delay(2000);//반시계
> > >  }
> > >  return 0;
> > > }
> > >
> >
>