#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“) он должен сказать мне, где произошла ошибка ...
Этот вопрос действительно непонятен. –
Я не знаю, в чем вопрос, но вы имели в виду поставить полуколоны на концах whiles, например «while (! (UCSR0A & (1 << RXC0))); или после кодового блока? – doctorlove
@doctorlove Я удалил их, потому что они явно неуместны (и предназначены для выделения кода). – Mario