2013-06-12 41 views
0

我想寫一個簡單的程序,以通過hterm從用戶輸入輸入,當用戶輸入「電機」&「25」電機將旋轉25順時針和逆時針25方向Atmega 32,程序驅動電機,如何從用戶輸入整數

//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(); 
} 

現在的問題是,當我將刪除主)這些行(

items_read = scanf ("%d", &numbers[i]); 
    scanf ("%d",&i); 

&使items_read在move_clockwise(items_read);爲:

move_clockwise(25); 
move_anticlockwise(25); 

然後,當用戶輸入「汽車」,那麼電機運行move_clockwise(25);move_anticlockwise(25);沒有運行,我想是採取既爲順時針和逆時針爲數字「馬達」,數....

如果有人能幫助我,我會很感激! 在此先感謝!

+0

程序的某些部分,如收集字符串似乎缺少。但是,也許你應該先做一個更簡單的測試用例,並且除了兩個移動命令外,還要去掉所有的東西。如果您以其他順序發放它們,逆時針首先發生,或者自行發起,會發生什麼?或者你可以做一個初步的測試程序,在收到每個連續字符後前進一步。 –

+0

我試圖只使用scanf和printf,scanf正在工作,但printf或puts都不能用於我!,任何人都可以告訴我我在做什麼錯在這裏我想要一個int也從用戶 –

回答

0

首先,我認爲你只是清除loeschen()中的「cmd」,但你永遠不會確定任何值。 第二個「cmd」不是任何類型的UART dataregister。

DDRD是DataDirectionRegister D,這意味着您可以將某些引腳設置爲輸入或輸出模式。 使用PORTD將引腳設置爲高電平或低電平,例如PORTD |= 1<<PD0;將端口D引腳0設置爲高電平。

我想你更喜歡德國文檔,因爲你命名了一個函數「loeschen()」;-),那麼你爲什麼不訪問mikrocontroller.net AVR GCC Tutorial (UART)

如果您想了解更多TECHNIC詳細的YouTube-東西,等瞧:Introduction to UART

RXT(ATMEGA16) - 例如:

////////////////////////////////////////////////////////////////////////// 
// 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 
    } 
} 

瞭解UART是如何工作後,你應該檢查你codeparts 如「scanf(」%s「,& cmd);」在控制檯應用程序中 - 更容易發現一些錯誤。

我希望這可以幫助你一點,但我想最好的解決方案是當你知道你在做什麼。

-Crazy

+0

謝謝它真的幫助,並且我發現我的'uart_init()'不能正常工作,所以我也糾正了它 'void USARTInit uint16_t ubrr_value) { \t UBRRL = ubrr_value; \t UBRRH =(ubrr_value >> 8); UCSRC =(1 << URSEL)|(3 << UCSZ0); UCSRB =(1 << RXEN)|(1 << TXEN); }'當我連接txd到串行端口的txd和atmega32的rxd到串行端口的rxd,它現在工作正常時,我也檢查了Atmega32的連接。而且,我認爲這不是相反的順序! –

相關問題