|
글쓴이 :
관리자
작성일 : 18-05-04 09:34
조회 : 4,173
|
안녕하세요? 고객님.
저희 뉴티씨 제품을 이용하여주셔서 감사합니다.
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;
> > > }
> > >
> >
>
|
|