Problem med AVR USART TX

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
BitBanger
Inlägg: 14
Blev medlem: 11 februari 2016, 01:06:56

Problem med AVR USART TX

Inlägg av BitBanger »

Hej,
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 */

}
Har en simpel char buffer för att sända ifrån är WORD som är 16-bit för modulen bryts ner och 8-LSB skickas först och sedan 8-MSB då det är så den iaf kommunicerar data ut.

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];

}

Ni kan ignorera LCD grejer m.m. det är bara för att läsa någon output och se vad som händer och ursäktar att koden är lite grötig, har mer eller mindre försökt brut-force någon form av respons från GPS modulen.
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;
}
RX interrupt som även denna fungerar som den ska

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;
}
Alla tankar och idéer som kan hjälpa tas tacksamt emot.
hummel
Inlägg: 2268
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Problem med AVR USART TX

Inlägg av hummel »

Inte att rekommendera med en fördröjning i en ISR. Den koden ska snabbt rinna igenom utan att använda while!
BitBanger
Inlägg: 14
Blev medlem: 11 februari 2016, 01:06:56

Re: Problem med AVR USART TX

Inlägg av BitBanger »

while loopen är bara för att dubbelkolla att alla flaggor är rätt, den bör alltså aldrig inträffa utan är mer bara där pga exemplet som ges av Atmel vid hantering av USART och ska inte ge någon fördröjning. Kan ta bort den men kan inte se vad den har med TX att göra då den triggar på RX och RX fungerar as intended.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Problem med AVR USART TX

Inlägg av sodjan »

Det är lite rörigt vad som är vad och vad som är i vilken riktning.
Du säger både att du har "inga problem att ta emot" men samtidigt att du
inte kan "få min input via UART att fungera". För mig är det samma sak,
d.v.s. GPS => AVR.
BitBanger
Inlägg: 14
Blev medlem: 11 februari 2016, 01:06:56

Re: Problem med AVR USART TX

Inlägg av BitBanger »

Problemet jag har är att sändningar från AVR => till GPS inte vill fungera, data ut från GPS => till AVR fungerar utan problem.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Problem med AVR USART TX

Inlägg av sodjan »

OK.
Fungerar AVR => "något annat"?
Vet du om AVR'en sänder över huvud taget?
Det går ju att hänga på en PC med serieinterface
eller liknande för att testa. Kör sen Putty eller liknande
så kan du båda sända och ta emot manuellt.

För övrigt så skulle jag rekommendera att fixa ett litet
"stripped-down" test program som enbart testar det som
du inte får att fungera. Om inte annat så hjälper det mycket
för andra som ska försöka förstå vad du gör. Ta bort allt som
har med LCD och annan som inte har med USART att göra.
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Problem med AVR USART TX

Inlägg av Icecap »

BitBanger: den while() är direkt dum och "farlig"!

Om du får en interrupt utan att hårdvaran är klar gör du något fel eller har fel på hårdvaran.
BitBanger
Inlägg: 14
Blev medlem: 11 februari 2016, 01:06:56

Re: Problem med AVR USART TX

Inlägg av BitBanger »

@sodjan jag får output utan problem till min RaspberryPi, dock verkar det som att kanske något blir galet med sändningen av check sum, tack för tipsen, återkommer.


@Icecap Dum och farlig hur? Om allt gått rätt till innan så påverkar den inte, om något går fel (vilket det då inte ska göra) så låser sig chippet där vilket gör att jag i det fall det hade varit något fel med bitsen och interrupt hade kunnat upptäcka det?
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Problem med AVR USART TX

Inlägg av sodjan »

> ...jag får output utan problem till min RaspberryPi.

Aha, då faller behovet av den typ av testprogram som jag syftade på.
Det var mest om AVR'en inte sände över huvud taget.

Men då handlar det väl mer om själva linjen och mottagningen i GPS'en?

Fungerar det med "något annat" => GPS?
Det går kanske att koppla upp GPS'en mot en PC
(eller liknande) och testskicka därifrån...

Eftersom AVR'en alltså sänder, så känns det som något på ett högre
plan. Själva protokollet eller formatet som GPSen förväntar sig...
Senast redigerad av sodjan 11 februari 2016, 16:52:25, redigerad totalt 1 gång.
BitBanger
Inlägg: 14
Blev medlem: 11 februari 2016, 01:06:56

Re: Problem med AVR USART TX

Inlägg av BitBanger »

Mjo misstänker att det är något i formatet, ska testa skriva något i Python på rpi och se om jag kan lista ut var det felar.
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Problem med AVR USART TX

Inlägg av Icecap »

BitBanger: "Om allt gått rätt till innan så påverkar den inte, om något går fel (vilket det då inte ska göra) så låser sig chippet där vilket gör att jag i det fall det hade varit något fel med bitsen och interrupt hade kunnat upptäcka det?"

Och även där går du fel... Den låser sig till villkoret uppfylls, alltså får du ingen information ur den funktion.

Men om du istället hade gjort en if(whatever) Flagga = true; kunde du läsa den flagga senare och få information om att det sket sig och då lösa problemet.
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Problem med AVR USART TX

Inlägg av Mr Andersson »

Är det inte ganska vanligt att man under utveckling avsiktligt hänger processorn om något går fel och sen ansluter en debugger för att se detaljer om felet? Jag har iaf sett många som gör så. Fast då bör man väl ha ett stumt while(1); och inte en loop som möjligtvis kan avslutas av sig själv.
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Problem med AVR USART TX

Inlägg av Icecap »

Själv brukar jag ha ett par pinnar med LED på, då kan man slå på en LED vid ett fel och se att den gjorde fel.
BitBanger
Inlägg: 14
Blev medlem: 11 februari 2016, 01:06:56

Re: Problem med AVR USART TX

Inlägg av BitBanger »

Icecap skrev:BitBanger: "Om allt gått rätt till innan så påverkar den inte, om något går fel (vilket det då inte ska göra) så låser sig chippet där vilket gör att jag i det fall det hade varit något fel med bitsen och interrupt hade kunnat upptäcka det?"

Och även där går du fel... Den låser sig till villkoret uppfylls, alltså får du ingen information ur den funktion.

Men om du istället hade gjort en if(whatever) Flagga = true; kunde du läsa den flagga senare och få information om att det sket sig och då lösa problemet.
Fel hur, det är ju exakt det som är meningen och informationen jag får initialt är att något gått fel och isf senare lägga till mer detaljerad felsökning. Detta är ful -hackad test kod, du verkar tro det är något annat.

Edit:
Jag använder led, pins, LCDs m.m. oxå för felsökning och annat när jag bygger.
BitBanger
Inlägg: 14
Blev medlem: 11 februari 2016, 01:06:56

Re: Problem med AVR USART TX

Inlägg av BitBanger »

Vill bara tacka @sodjan för tipset att testa med andra enheter, körde med en raspberry pi och har nu fått full ordning på allt *typ* och kan nu prata med GPS modulen utan problem :)
Skriv svar