Sida 1 av 1

Problem med UART på AVR

Postat: 30 juli 2009, 15:51:26
av Malm
Hej!

Har lite problem med att skicka data via UART på en ATmega168. Saken är den att jag vill vänta med att gå vidare i mitt program tills dess att all data gått iväg. Detta kontrollerar jag genom att polla TXC0 och gå vidare när den blivit ettställd.

Koden fungerar utmärkt första gången en frame skickas iväg, men efter det väntar inte exekveringen på att framen har gått iväg, utan fortsätter då det finns två bytes kvar att skicka. Jag tycker att detta tyder på att jag inte nollställer TXC0 ordentligt, men jag hittar inte något fel. Såhär gör jag:

Kod: Markera allt

// Vänta på plats i buffer
while ( !( UCSR0A & (1<<UDRE0)) );

//Lägg in sista byte:n i buffer
UDR0 = data;
			
// Nollställ USART Transmit Complete
UCSR0A &= ~(1<<TXC0);
		
// Vänta tills alla byte är skickade
while ( !( UCSR0A & (1<<TXC0)) );
	
// Fortsätt
Mitt problem är alltså att "Fortsätt" inträffar lite för tidigt :) Några idéer?

Re: Problem med UART på AVR

Postat: 30 juli 2009, 16:10:57
av thepirateboy
Vet inte riktigt men databladet säger

"The TXCn Flag bit is automatically
cleared when a transmit complete interrupt is executed, or it can be cleared by writing
a one to its bit location."

Vad händer om du kommenterar bort "UCSR0A &= ~(1<<TXC0);" ?

Re: Problem med UART på AVR

Postat: 30 juli 2009, 16:15:10
av Malm
Men suck :doh: "Cleared by writing a one" känns ju hyfsat icke-intuitivt... Tack för att du uppmärksammade det, det löste problemet!

Det skall alltså vara såhär:

Kod: Markera allt

UCSR0A |= (1<<TXC0);

Re: Problem med UART på AVR

Postat: 30 juli 2009, 16:18:42
av sodjan
Jag skulle också just posta det där citatet från databladet.
Min första tolkning var ett "Cleared by writing a one" var en felskrivning,
men fungerar det så så. Väldigt märklig skrivning (och funktion) i alla fall...

Re: Problem med UART på AVR

Postat: 30 juli 2009, 16:24:34
av eqlazer
Inte en helt ovanlig funktion att man nollställer genom att skriva en etta, åtminstone inte på PPC som jag sitter med just nu.

Re: Problem med UART på AVR

Postat: 30 juli 2009, 16:35:10
av sodjan
Nej, "set" resp "cleared" kan ju vara antingen 1/0 eller 0/1 beroende på hur
det är definierat. Det var inte det som var konstigt, utan formuleringarna i
resten av stycket där citetat var taget ifrån :
The Transmit Complete (TXCn) Flag bit is set one when the entire frame in the Transmit Shift
Register has been shifted out and there are no new data currently present in the transmit buffer.
The TXCn Flag bit is automatically cleared when a transmit complete interrupt is executed, or it
can be cleared by writing a one to its bit location.
Notera "is set one when the entire frame..." i första meningen.
Och "is automatically cleared when a transmit complete interrupt..." i andra meningen.
Jag tolkar definitivt detta som "1" i första meningen och "0" i den andra.
Därmed blir den avslutande delen "cleared by writing a one" lite märklig.
Det hänger så att säga inte ihop riktigt.

Re: Problem med UART på AVR

Postat: 30 juli 2009, 19:45:56
av vfr
Jag har sett liknande saker på annat håll. Uppenbarligen skiljer man på läst status och att sätta/återställa. Vid läsning så får man statusbiten som den är.

Skall man göra något aktivt med den så är det aktiva läget (som återställer) en ettställd bit. Det känns inte helt intuitivt, nej, Man skall nog i det läget hålla isär läst status och återställning.

Re: Problem med UART på AVR

Postat: 15 augusti 2009, 18:20:29
av PaNiC
Kom ihåg vad TXC står för. Transmit complete, dvs 1 är fullständigt logiskt.