|
글쓴이 :
관리자
작성일 : 18-03-26 14:41
조회 : 9,791
|
안녕하세요? 고객님,
저희 뉴티씨 제품을 이용하여 주셔서 감사합니다.
저희가 소스를 대신 짜드리진 않습니다.
구체적으로 어떻게 안된다는 것인지를 구체적으로 적어주셔야 가능한 대책을 말씀드릴 수 있겠습니다.
다만, int a;로 선언하신 부분은 unsigned char a; 이렇게 선언하시는 것이 좋겠습니다.
키보드로 입력받는 ASCII값이 8비트니까요.
감사합니다.
>
>
> 인터럽트 방식으로 코드를 해봤는데 작동이 되지 않아서 수정방안에 조언을 부탁드립니다.
>
> 문제가 없다면 AVR AS계획도 있습니다.
>
> #include <avr/io.h>
> #include <avr/interrupt.h>
> #include <util/delay.h>
> #include <stdio.h>
>
> volatile unsigned int motor_speed = 0; // 모터속도
> volatile unsigned char dir = 0;
> volatile int count = 0;
>
> #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;
> }
>
>
> void tx0Char(char message)
> {
> while(((UCSR0A>>UDRE0)&0x01)==0);
> UDR0 = message;
> }
>
> int Putchar(char c)
> {
> tx0Char(c);
> return c;
> }
>
> int Getchar()
> {
> while((UCSR0A&0x80)==0);
> return UDR0;
> }
>
> void uart0_init()
> {
> UCSR0A = 0x00;
> UCSR0B = 0x00;
> UCSR0C = 0x06; //전송할 길이를 8비트로 설정
> UBRR0L = 0x67; //보레이트를 결정 9600
> UBRR0H = 0x00;
> UCSR0B = 0x18; // 송신부와 수신부가 동작하도록 설정
> }
>
> ISR(TIMER0_OVF_vect)
> {
> TCNT0 = 0xfb;
> count++;
> if(count>2)count=0;
> //TCNT0 = motor_speed; //reload counter value
> }
>
> void timer0_init(void)
> {
> TCCR0 = 0x00; //stop
> TCNT0 = 0xFB; //set count 5
> OCR0 = 0x00; //
> TCCR0 = 0x02; //start timer 0.0000005초
> }
>
>
> void init_devices()
> {
> port_init();
> timer0_init();
> uart0_init();
> TIMSK = 0x01; //overflow 인터럽트 사용
> sei();
> XDIV = 0x00; //XTAL 분주 제어 레지스터
> XMCRA = 0x00;
> port_init();
> }
>
> void delay(int delaytime){ //함수선언
> int i,j;
> for(i=0;i<1000;i++){
> for(j=0;j<delaytime;j++){
> }
> }
> }
>
>
> void main() //시리얼통신
> {
> int a;
>
> ENABLE1_ON;
> PWM1_ON;
> BREAK1_OFF;
> ENABLE2_ON;
> PWM2_ON;
> BREAK2_OFF;
>
> init_devices();
> fdevopen(Putchar,Getchar);
>
>
> while(1)
> {
> scanf("%d",&a);
> printf("%d",a);
>
> switch(a)
> {
> case '5':
> DIR1_ON;
> DIR2_ON;
> PORTG = 0x01;
> delay(500);//시계
>
> case '4':
> DIR1_ON;
> DIR2_ON;
> PORTG = 0x01;
> delay(250);//시계
>
> case '3':
> ENABLE1_OFF; // 정지
>
> case '2':
> DIR1_ON;
> DIR2_ON;
> PORTG = 0x02;
> delay(250);//반시계
>
> case '1':
> DIR1_ON;
> DIR2_ON;
> PORTG = 0x02;
> delay(500);//반시계
>
> default:
> ENABLE1_OFF; //정지
>
> }
>
> }
> }
>
|
|