Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Embedded Atmega 32,驱动电机的程序,如何从用户处获取输入整数_Embedded_Atmega - Fatal编程技术网

Embedded Atmega 32,驱动电机的程序,如何从用户处获取输入整数

Embedded Atmega 32,驱动电机的程序,如何从用户处获取输入整数,embedded,atmega,Embedded,Atmega,我试图编写一个简单的程序,通过hterm从用户那里获取输入,当用户输入“motor”和“25”时,电机将顺时针旋转25,逆时针旋转25 //Define clock-speed and include necessary headers #define F_CPU 1000000 #include <avr/io.h> #include <util/delay.h> #include <inttypes.h> #

我试图编写一个简单的程序,通过hterm从用户那里获取输入,当用户输入“motor”和“25”时,电机将顺时针旋转25,逆时针旋转25

    //Define clock-speed and include necessary headers
    #define F_CPU 1000000
    #include <avr/io.h>
    #include <util/delay.h>
    #include <inttypes.h>
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include <stdio.h>
    #include <stdint.h>
    #include <util/delay.h>
    #include <ctype.h>

    #define F_CPU 16000000UL
    #define BAUD 9600UL

    char cmd[40];

    void uart_init(void)                            // initializing UART
    {
        UBRRH = 0;
        UBRRL = ((F_CPU+BAUD*8)/(BAUD*16)-1);

        UCSRC |= 0x86;                              // 8N1 Data
        UCSRB  = 0x18;                              // Receiving and Transmitting
    }

    int uart_putch(char ch, FILE *stream)           // Function for sending Data to PC
    {
        if (ch == '\n')
        uart_putch('\r', stream);
        while (!(UCSRA & (1<<UDRE)));
        UDR=ch;
        return 0;
    }

    int uart_getch(FILE *stream)                    // Function for receiving Data from PC
    {
        unsigned char ch;   while (!(UCSRA & (1<<RXC)));
        ch=UDR;

        uart_putch(ch,stream);                      // Echo the output back to the terminal

        return (tolower(ch));

    }

    FILE uart_str = FDEV_SETUP_STREAM(uart_putch, uart_getch, _FDEV_SETUP_RW);  // Important, not deleting

    void loeschen()                     // Delete the String
    {
        int strnglen = 0;
        while (strnglen < 41 && cmd[strnglen] != 0)
        {
            cmd[strnglen]= 0;
            strnglen++;
        }
    }

    // Define the stepping angle
    // Note: Divide by 2 if you are doing half-stepping. for filter test 1.8 defult
    #define MIN_STEP 1.8

    /* Define an array containing values to be sent at the required Port - for Full-stepping

      <first four bits> - <last four bits> = <decimal equivalent>

       00000001 = 1 ; 01000000 = 4
       00000100 = 4 ; 00010000 = 16
       00000010 = 2 ; 00001000 = 8
       00001000 = 8 ; 00100000 = 32
    */
    unsigned short control_array_full[4] = {4,16,8,32};

    /* Define an array containing values to be sent at the required Port - for Half-stepping

    <first four bits> - <last four bits> = <decimal equivalent>

    0000-1001 = 8 + 1 = 9  ; 0010-0100 = 32 + 4 =36
    0000-0001 = 1     ;      0000-0100 = 4
    0000-0101 = 4 + 1 = 5 ;  00010100 = 16 + 4 = 20
    00000100 = 4        ;   00010000  = 16

    00000110 = 4 + 2 = 6  ; 00011000  = 16+8=24
    0000-0010 =          ;  00-001000 = 8
    0000-1010 = 8 + 2 = 10  ; 00-101000 = 40
    0000-1000 = 8            ; 00-100000 = 32
    */
    unsigned short control_array_half[8] = {36,4,20,16,24,8,40,32};


    // Adjust this delay to control effective RPM
    // Do not make it very small as rotor will not be able to move so fast
    // Currently set at 100ms
    void delay()
    {
    _delay_ms(100);
    }

    void move_clockwise(unsigned short revolutions){
      int i=0;
      for (i=0; i < (revolutions* 360 /MIN_STEP) ; i++)

      {

      //Note: Take modulo (%) with 8 when half-stepping and change array too
      PORTD = control_array_half[i % 4];
      delay();
     }

    }

    void move_anticlockwise(unsigned short revolutions){
     int i;
      for (i = (revolutions* 360 /MIN_STEP); i > 0 ; i--){

      //Note: Take modulo (%) with 8 when half-stepping and change array too
      PORTD = control_array_half[i % 4];
      delay();
     }
    }

    int main()
    {

     // Enter infinte loop
     // Make changes here to suit your requirements

     uart_init();                   // initializing UART

     stdout = stdin = &uart_str;        // Necessary to compare whole Strings

      while(1){


          scanf("%s",&cmd);         // Read String from Data Register
    printf ("Please enter number of motor rotation for clockwise and anticlockwise");
          items_read = scanf ("%d", &numbers[i]); // Read integer for motor revolution


          if(strcmp(cmd, "motor") == 0)
          {
              DDRD = 0b00111110; //Set PORTD  4 bits for output
       //Enter number of revolutions required in brackets
            move_clockwise(items_read);

            move_anticlockwise(items_read);
          }   
      DDRD = 0b00000000;
  }
        loeschen();
}
&使读取的项目顺时针移动(读取的项目)作为:

move_clockwise(25);
move_anticlockwise(25);
然后,当用户输入“电机”时,电机运行
move_顺时针(25)
逆时针移动(25)没有运行,我想要的是同时取“电机”,顺时针方向的数字和逆时针方向的数字

如果有人能帮我,我将不胜感激!
提前谢谢

首先,在我看来,您只清除了loeschen()中的“cmd”,但从未分配任何值。 第二个“cmd”不是任何类型的UART数据寄存器

DDRD是DataDirectionRegister D,这意味着您可以将一些引脚设置为输入或输出模式。
使用PORTD将pin设置为高或低,例如
PORTD |=1程序的某些部分(例如用于收集字符串的部分)似乎缺失。但是也许你应该先做一个更简单的测试用例,去掉除了两个move命令之外的所有东西。如果您以相反的顺序(先逆时针)发出它们,或者自己调用,会发生什么?或者你可以做一个初步的测试程序,在收到每个序列字符后进行一步。我试着只使用scanf和printf,scanf可以工作,但printf和put对我都不起作用!!,有人能告诉我我做错了什么吗?我还想从用户那里得到一个int谢谢它真的很有帮助,我发现我的
uart\u init()
没有正常工作,所以我也纠正了它
void USARTInit(uint16\u t ubrr\u value){UBRRL=ubrr\u value;UBRRH=(ubrr\u value>>8);UCSRC=(1
move_clockwise(25);
move_anticlockwise(25);
//////////////////////////////////////////////////////////////////////////
// Definitions
//////////////////////////////////////////////////////////////////////////
#define BAUD 9600UL                             
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)      

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Baud to high
#endif

#define UART_MAX_STRING_LENGHT 20               // Max lenght


//////////////////////////////////////////////////////////////////////////
// UART-Receive-Variables
//////////////////////////////////////////////////////////////////////////
volatile uint8_t uart_str_complete = 0;                         // FLAG - String received
volatile uint8_t uart_str_count = 0;                            // Current position
volatile char uart_string[UART_MAX_STRING_LENGHT + 1] = "";     // received string


//////////////////////////////////////////////////////////////////////////
// ISR-UART 
//////////////////////////////////////////////////////////////////////////
ISR(USART_RXC_vect)
{
    unsigned char nextChar;
    nextChar = UDR;         // read data from buffer

    if(uart_str_complete == 0)  // UART-String is currently usen
    {
        if(nextChar != '\n' && nextChar != '\r' && uart_str_count < UART_MAX_STRING_LENGHT)
        {
            uart_string[uart_str_count] = nextChar; 
            uart_str_count++;                       
        }
        else
        {
            uart_string[uart_str_count] = '\0'; 
            uart_str_count = 0;                 
            uart_str_complete = 1;
        }
    }
}


//////////////////////////////////////////////////////////////////////////
// Init UART
//////////////////////////////////////////////////////////////////////////
void Init_UART_Async()
{
    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;

    UCSRB |= (1<<TXEN);                         // UART TX high
    UCSRB |= (1<<RXEN);                         // UART RX high
    UCSRB |= (1<<RXCIE);                        // UART RX Interrupt enable
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);   // Asynchron 8N1

    sei();                                      // Enable interrups
}


//////////////////////////////////////////////////////////////////////////
// Main
//////////////////////////////////////////////////////////////////////////
int main(void)
{

    Init_UART_Async();

    while(1)
    {       
        HandleCommunication();      // <-- Handle your communication ;-)

        // and to some other cool stuff here
    }
}


//////////////////////////////////////////////////////////////////////////
// Handle Communication
//////////////////////////////////////////////////////////////////////////
void HandleCommunication()
{
    if(uart_str_complete == 1)
    {
        strcpy(received_string, uart_string);   // copy received string
        strcpy(uart_string, "");                // empty uart-string
        uart_str_complete = 0;                  // set flag to 0

        // handle your communication
    }
}