2017-09-04 7 views
1

私は小さな組み込みプログラムを作成しています。ここでは、uartを介してatmega328pチップにコマンドを送信します。コマンドは、$という文字で始まり、#という文字で終わります(解析するタイミングはわかります)。コマンドを受信すると、それを解析してデバイスをオンにします(COMMAND:TURN_ON_I1)またはOFF(COMMAND:TURN_OFF_I1)。アプリケーションは、現在、次のようになります。遅延uartコマンドの実行

// ------- Defines -------- // 
#define F_CPU 8000000UL 

#include <avr/io.h> 
#include <util/delay.h> 
#include <avr/power.h> 
#include <stdio.h> 
#include <string.h> 
#include "pinDefines.h" 
#include "USART.h" 

#define RECEIVE_BUFFER_SIZE 100 

// Control output value 
#define output_low(port,pin) port &= ~(1<<pin) 
#define output_high(port,pin) port |= (1<<pin) 

// Set pin mode (input or output) 
#define set_input(portdir,pin) portdir &= ~(1<<pin) 
#define set_output(portdir,pin) portdir |= (1<<pin) 

// The DDRD port contains only two pins: 
#define REL_BTN_SIM_2 PD6 // PD6 = REL_BTN_SIM_2 

void initUSART(void) {        /* requires BAUD */ 
    UBRR0H = UBRRH_VALUE;      /* defined in setbaud.h */ 
    UBRR0L = UBRRL_VALUE; 
#if USE_2X 
    UCSR0A |= (1 << U2X0); 
#else 
    UCSR0A &= ~(1 << U2X0); 
#endif 
            /* Enable USART transmitter/receiver */ 
    UCSR0B = (1 << TXEN0) | (1 << RXEN0); 
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); /* 8 data bits, 1 stop bit */ 
} 

void printString(const char myString[]) { 
    uint8_t i = 0; 
    while (myString[i]) { 
    transmitByte(myString[i]); 
    i++; 
    } 
} 

uint8_t receiveByte(void) { 
    loop_until_bit_is_set(UCSR0A, RXC0);  /* Wait for incoming data */ 
    return UDR0;        /* return register value */ 
} 

void transmitByte(uint8_t data) { 
    /* Wait for empty transmit buffer */ 
    loop_until_bit_is_set(UCSR0A, UDRE0); 
    UDR0 = data;           /* send data */ 
} 

int main(void) { 

    //$COMMAND:TURN_ON_I1# 
    //$COMMAND:TURN_OFF_I1# 

    char s[RECEIVE_BUFFER_SIZE]; 
    char readSerialCharacter; 

    // -------- Inits --------- // 
    DDRB = 0b00000111; 
    DDRC = 0b00001000; 
    DDRD = 0b11000000; 

    initUSART(); 

    // ------ Event loop ------ // 
    while (1) { 

     printString("Waiting for the start of string (char $).\r\n"); 
     do { } while (receiveByte() != '$'); // Wait for start of string. 

     // Fill the array until the end of transmission is received 
     int i=0; 

     do { 

      // If nearing end of buffer, don't fill the buffer and exit the loop 
      if(i<RECEIVE_BUFFER_SIZE-1){ 
       readSerialCharacter = receiveByte(); 
       s[i++] = readSerialCharacter; 
      }else 
       break; 
     } while (readSerialCharacter != '#'); // Wait for end of string. 

     s[i] ='\0'; // Terminate the string 

     printString("The whole received command:\r\n"); 
     printString(s); 
     printString("\r\n"); 

     // Other commands (temperature, relay control) 

     // REL_BTN_SIM_2 
     else if(strstr(s, "COMMAND:TURN_ON_I1") != NULL) 
     { 
      printString("Will set I1 on!"); 
      output_high(PORTD, REL_BTN_SIM_2); 
     } 
     else if(strstr(s, "COMMAND:TURN_OFF_I1") != NULL) 
     { 
      printString("Will set I1 off!"); 
      output_low(PORTD, REL_BTN_SIM_2); 
     } 

     else 
      printString("Unknown command.\r\n"); 

     // Clear the buffer 
     memset(s,'\0', sizeof(s)); 

     } 
     /* End event loop */ 
     return (0); 
    } 

は私が7〜8回(またはそれ以上)の周りにコマンドを送信した後、シリアル通信が中断されたことに気づいたり、コマンドが遅れて実行されていること。私はまた、デバッグ文字列が "I1をオフにするでしょう!"、 "I1をオンにします!"が出力されますが、出力の状態は変更されません(または数秒の遅延で変更されます)。

私が間違っていることを誰かが知っていると思っていたのですか?

ありがとうございました。

+0

私の経験から、組み込みFWは減速しません。どのように出力状態をチェックしますか?シリアルまたはデバッグ端末の速度が低下する可能性はありますか?あなたが送ったフレームの間にどのくらいの遅延がありますか? – Julien

+0

出力には電球が接続されています。私はまだデバッグしているので、その後のコマンド間の遅延は約1秒です。 – TheAptKid

答えて

1

いい定義はset_output(),ですが、使用していません。だから私はあなたが出力ドライバを有効にしたことはないと思う。ポートレジスタを設定することで、弱いプルアップを有効にするだけです。おそらく、あなたのリレードライバを速くスイッチするのに十分な強さではないでしょう。そのドライバ回路にコンデンサがありますか?

関連する問題