sitter och klinkar med en GPS modul (NAVMAN TU35-D410-021) och en ATMEGA 328pu och har ett problem med USART (UART), jag har inga problem att ta emot och läsa vad GPS modulen spottar ut i default läge men av någon anledning kan jag inte få min input via UART att fungera och försökt allt möjligt så om någon har några idéer så vore jag tacksam.
Aktuell kod för UART
Init koden
Kod: Markera allt
void UART_Init( unsigned int ubrr)
{
/*Set baud rate */
UBRR0H = (ubrr>>8);
UBRR0L = ubrr;
/* Enable receiver and transmitter and interrupts*/
UCSR0B = (1<<RXEN0)|(1 << RXCIE0)|(1<<TXEN0);
/* Set frame format: 8data, 2stop bit */
}
Kod: Markera allt
void set_send_buffer(int i, int word){
GPS_Data_Send_Buffer[i] |= word; //SET 8 LSB
GPS_Data_Send_Buffer[i+1] |= word>>8;
}
void send_test(void){
// Values set as specified in Zodiac GPS Receiver Family Designer’s Guide
ID_1300.header_init = 0x81FF; //ALL BINARY MSG START WITH 0x81FF
ID_1300.msg_id = 1300; //MSG_ID (1300 = trigger system test ID 1100 respons
ID_1300.size = 0; //HEADER = 5 WORDS, this sets DATA MSG WORD size, 0 = no DATA MSG CHECK SUM
ID_1300.res1 = 0x4800; //SET DCL0 QRAN 00XX XXXX WORD 4 (connected and query request)
ID_1300.header_chksum = 0; // temp checksum (modulo 2^16)
//for (int i=0; i<5; i++){
// FIXA SEDAN
//}
//Check sum as calculated for recivied
/*ID_1300.header_chksum = ID_1300.header_chksum +(ID_1300.header_init%65563);
ID_1300.header_chksum = ID_1300.header_chksum +(ID_1300.msg_id%65563);
ID_1300.header_chksum = ID_1300.header_chksum +(ID_1300.size%65563);
ID_1300.header_chksum = ID_1300.header_chksum +(ID_1300.res1%65563);*/
if (flipped > 1){
count_chksum++;
flipped = 0;
}
ID_1300.header_chksum = count_chksum;
if (flip){
ID_1300.header_chksum = ID_1300.header_chksum*-1;
flipped++;
flip=false;}
else {flip = true;}
if (count_chksum == 32760){
while(1){
}
}
goto_loc(1,1);
send_string_LCD(value_to_string(ID_1300.header_chksum));
send_char_LCD(' ');
set_send_buffer(0, ID_1300.header_init);
set_send_buffer(2, ID_1300.msg_id);
set_send_buffer(4, ID_1300.size);
set_send_buffer(6, ID_1300.res1);
set_send_buffer(8, ID_1300.header_chksum);
send_index = 0;
for (int i = 0; i < 10 ; i++){
if (!(GPS_Data_Send_Buffer[0] == 0xFF && GPS_Data_Send_Buffer[1] == 0x81)){
clear_scr();
goto_loc(1,1);
send_string_LCD("ERROR!!!!");
goto_loc(2,1);
send_string_LCD(value_to_hex(GPS_Data_Send_Buffer[0]));
goto_loc(3,1);
send_string_LCD(value_to_hex(GPS_Data_Send_Buffer[1]));
_delay_ms(5000);
}
send(i);
}
}
void send(int i){
/* Make sure transmite buffer is ready */
while ( !( UCSR0A & (1<<UDRE0)) )
;
/* Put data into buffer, sends the data */
UDR0 = GPS_Data_Send_Buffer[i];
}
Jag försökt alla möjliga check sum varianter genom att bokstavligen gå igenom alla möjliga alternativ.
Jag har försökt sätta bits i motsatt ordning i buffern. (MSB->LSB)
Jag har försökt med att sätta request (WORD 4) till noll.
Jag har testat variera UBRR för olika BAUD.
Jag får en output på TX PIN på min ATMEGA men har just nu ingen data logger, har dock sett, om än väldigt snabbt förbipasserande, på oscilloskopet (analogt) att något kommer ut samt kört en freq. räknare som verkar ge liknande utfall som den får på RX.
Det känns som att något i min kod måste vara fel men jag kan inte komma på vad som eventuella tips vore tacksamt, funderar på om det kan vara något med WORD 4 som spökar, sidan 49-51 (5 - 5-2) i Zodiac GPS Receiver Family Designer’s Guide hanterar headers och uppbyggnad av meddelanden.
Dokumentation:
Jupiter NAVMAN datasheet
Zodiac GPS Receiver Family Designer’s Guide
Datasheep ATMEGA 328p(u)
CHECK SUM FÖR RX som fungerar som den ska
Kod: Markera allt
ool CHECK_SUM(int index, unsigned char words){
int chkSUM = 0;
int chkSUM2 = GET_BUFFER_DATA(index+WORD*(words-1),I) ;
//START at 5 to remove header, -1 word for check sum data
for (int k=5; k < (words-1); k++){
chkSUM = chkSUM + (GET_BUFFER_DATA(index+WORD*k,I)%65563);
}
chkSUM=abs(chkSUM);
chkSUM2=abs(chkSUM2);
if (chkSUM==chkSUM2)
return true;
else
return false;
}
Kod: Markera allt
ISR(USART_RX_vect)
{
/* make sure data is ready*/
while ( !(UCSR0A & (1<<RXC0)) )
;
//receive_index is a unsigned char counter
GPS_Data_Receive_Buffer[receive_index] = UDR0;
if (receive_index < GPS_DRBL)
receive_index++;
else
receive_index = 0;
}