2013-07-09 4 views
-7
#include <avr/io.h> 
#include <stdint.h> 

// Ceramic Resonator 
#ifndef F_CPU 
#define F_CPU 3686400 // 4MHz 
#endif 

// UART 
#define UART_BAUD_RATE 9600 
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_CPU)/((UART_BAUD_RATE)*16L)-1) 

int main(void) 
{ 
    // USART 
    UBRR0H =(uint8_t) (UART_BAUD_CALC(UART_BAUD_RATE,F_CPU) >>8); 
    UBRR0L =(uint8_t) UART_BAUD_CALC(UART_BAUD_RATE,F_CPU); 

    UCSR0B = (1<<RXEN0) | (1<<TXEN0); // enable receiver and transmitter, 
    UCSR0C = (3<<UCSZ00); // 8 bit (default: asynchronous, no parity, 1 stop-bit) 

    DDRC = (1<<5); // set data direction register bit 5 to one, this means PC5 is configured as output 
    PORTC = (1<<5); // set output value of PC5 to High-Level (Source Current, 5V to ground) 
    // VARIABLES 
    //uint8_t get; 
    // PROGRAM 

    unsigned char code[3] = {'x','y','z'}; // Here you need to write your code 
    unsigned char rcv[3]={'0','0','0'}; // received data 

    int i = 0; 

    while(1) 
    { 
     i = 0; 
     for(i=0;i<=2;i++) 
     { 
      // wait for empty transmit buffer 
      //while (!(UCSR0A & (1<<UDRE0))); 
      // wait for data to be received 
      while (!(UCSR0A & (1<<RXC0))); 
      /* put data into buffer, sends the data*/ 
      { 
       code[i]= UDR0 ; 
      } 

      PORTC ^= (1<<5); //this is for LED 

      // get received data from buffer 
      rcv[i] = code[i]; 
     } 
     // wait for empty transmit buffer 
     while (!(UCSR0A & (1<<UDRE0))); 
     // put data into buffer, sends the data 
     if ((rcv[0] == rcv[1]) && (rcv[0] == rcv[2]) && (rcv[1] == rcv[2])) 
     UDR0 = 00;    
     else UDR0 = 01; 
    } 
} 

Это моя программа, где я отправляю данные с ПК на микроконтроллер (Atmega 168PA от Docklight). Я посылаю три одинаковых байта. Затем микроконтроллер должен сравнить их и отправить мне логическое значение, указав, равны ли они (например, 00) или нет (например, 01).Поиск ошибок при определении

Следующая задача - проверить, где происходит ошибка или какой байт является ошибкой.

Также, когда микроконтроллер получает данные, он хранит три байта как один из данных (data[i]), он просто повторяется три раза.

Так что, если я отправить данные каким-то образом ('18' „19“ „18“) он должен сказать мне, где произошла ошибка ...

+5

Этот вопрос действительно непонятен. –

+2

Я не знаю, в чем вопрос, но вы имели в виду поставить полуколоны на концах whiles, например «while (! (UCSR0A & (1 << RXC0))); или после кодового блока? – doctorlove

+0

@doctorlove Я удалил их, потому что они явно неуместны (и предназначены для выделения кода). – Mario

ответ

0

выглядит, как вы настроили USART на usart0, установите скорость передачи данных и включить tx и rx без контроля четности и 1 стопового бита. Внутри цикла вы берете данные из буфера чтения usart, используя механизм прерываний и проверяя некоторые условия и выдавая 01 или 00 в качестве вывода. Вы должны скорее попробовать UDR0 = 0x00 else UDR0 = 0x01;

Смежные вопросы