Problem med UART på AVR

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Malm
Inlägg: 215
Blev medlem: 22 februari 2004, 12:55:06
Ort: Borås

Problem med UART på AVR

Inlägg 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?
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Re: Problem med UART på AVR

Inlägg 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);" ?
Malm
Inlägg: 215
Blev medlem: 22 februari 2004, 12:55:06
Ort: Borås

Re: Problem med UART på AVR

Inlägg 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);
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med UART på AVR

Inlägg 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...
eqlazer
Inlägg: 923
Blev medlem: 22 september 2007, 13:53:45
Ort: Göteborg

Re: Problem med UART på AVR

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med UART på AVR

Inlägg 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.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Problem med UART på AVR

Inlägg 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.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Re: Problem med UART på AVR

Inlägg av PaNiC »

Kom ihåg vad TXC står för. Transmit complete, dvs 1 är fullständigt logiskt.
Skriv svar