Field Robot 2025
-
Field Robot Event 2025 (FRE2025) will take place in Milano, Italy, from
June 9 to June 12, 2025, at Agriturismo da Pippo. This competition is open
to unive...
před 2 měsíci
while (1) {
// vytvoření a inicializace pole dat
uint8_t data[30], i;
for(i=0; i<30;i++) data[i] = i*2;
// vytvoření paketu
makePacket(&comm_state.op,&data,30,P_ECHO,10);
// zakázání příjmu
CLEARBIT(UCSR1B,RXEN1);
// přepnutí na vysílání
C_SETBIT(RS485_SEND);
// poslání prvního bytu - ostatní se vysílají automaticky
sendFirstByte(&UDR1,&comm_state);
// čekání na odeslání paketu
while(comm_state.send_state != PS_READY);
// přepnutí na příjem
C_CLEARBIT(RS485_SEND);
// povolení příjmu
SETBIT(UCSR1B,RXEN1);
comm_state.send_state=PS_READY;
// čekání na odpověď
while(comm_state.receive_state != PR_PACKET_RECEIVED && comm_state.receive_state!=PR_TIMEOUT);
comm_state.receive_state = PR_READY;
}
while(1) {
// přepnutí na příjem
C_CLEARBIT(RS485_SEND);
// čekání na příjem paketu
while(comm_state.receive_state != PR_PACKET_RECEIVED);
// rozhodnutí podle typu paketu
switch(comm_state.ip.packet_type) {
case P_ECHO: {
C_FLIPBIT(LED);
// vytvoření ECHO paketu
makePacket(&comm_state.op,&comm_state.ip.data,comm_state.ip.len,P_ECHO,0);
// zakázání příjmu
CLEARBIT(UCSRB,RXEN);
// přepnutí na odesílání
C_SETBIT(RS485_SEND);
// odeslání prvního bytu
sendFirstByte(&UDR,&comm_state);
// čekání na odeslání paketu
while(comm_state.send_state != PS_READY);
// přepnutí na příjem
C_CLEARBIT(RS485_SEND);
// povolení příjmu
SETBIT(UCSRB,RXEN);
comm_state.send_state = PS_READY;
} break;
} // switch
comm_state.receive_state = PR_READY;
}
rychlost přenosu | úspěšnost echa [%] | Chybovost příjmu [%] |
9600 | 75 | 14 |
14400 | 79 | 13 |
38400 | 89 | 5 |
76800 | 97 | 2 |
250000 | 98 | 0 |
The UBRRH Register shares the same I/O location as the UCSRC Register. Therefore some special consideration must be taken when accessing this I/O location.Takže jak má správně vypadat nastavení USARTu?
When doing a write access of this I/O location, the high bit of the value written, the USART Register Select (URSEL) bit, controls which one of the two registers that will be written. If URSEL is zero during a write operation, the UBRRH value will be updated. If URSEL is one, the UCSRC setting will be updated.
// 9600bd, 8n2
UBRRL = 103;
UBRRH = 0;
UCSRA = (0<<U2X)|(0<<MPCM);
UCSRB = (0<<UCSZ2)|(1<<TXCIE)|(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
UCSRC = (1<<URSEL)|(1<<USBS)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(1<<UCSZ1)|(1<<UCSZ0);