/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Programmering af UART 16550
Fra : Preben Holm


Dato : 09-12-04 21:26

Hej gruppe,


jeg forstår ikke helt funktionsmodellen af transmit FIFO'en i 16550
UART'en. Jeg har prøvet flere forskellige metoder, men ingen af dem
fungerer.

Jeg ønsker at anvende UART'en i polled mode, men desværre giver dette
nogle problemer når jeg samtidig ønsker at anvende FIFO'en for
transmittering?
Kan det passe at man kun kan tjekke om FIFO'en faktisk er tom eller at
der er overflow?
Det jeg ønsker er, at tjekke om der er plads i FIFO'en inden jeg skriver
- altså, at undgå et overflow (for hvilke data slettes så?), men stadig
anvende UART'en uden at skulle anvende interrupts!

Indtil videre har jeg prøvet med bit 5 og 6 i LSR (Line Status
Registeret), men intet virker!


På forhånd tak for hjælpen!

Med venlig hilsen
Preben Holm

 
 
Bertel Brander (09-12-2004)
Kommentar
Fra : Bertel Brander


Dato : 09-12-04 23:07

Preben Holm wrote:

> Indtil videre har jeg prøvet med bit 5 og 6 i LSR (Line Status
> Registeret), men intet virker!
>

På: http://byterunner.com/16550.html står der netop:

LSR BIT 5:
0 = transmit holding register is full. 16550 will not accept any
data for transmission.
1 = transmitter hold register (or FIFO) is empty. CPU can load the
next character.

Så du burde blot kunne bruge bit 5 til at checke om du kan skrive
den næste karakter til FIFO'en

--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen

Preben Holm (10-12-2004)
Kommentar
Fra : Preben Holm


Dato : 10-12-04 22:10

>> Indtil videre har jeg prøvet med bit 5 og 6 i LSR (Line Status
>> Registeret), men intet virker!
>>
>
> På: http://byterunner.com/16550.html står der netop:
>
> LSR BIT 5:
> 0 = transmit holding register is full. 16550 will not accept any
> data for transmission.
> 1 = transmitter hold register (or FIFO) is empty. CPU can load the
> next character.

Synes ikke rigtig det virker! Nå, jeg vil prøve igen!


Mvh / Preben Holm

Preben Holm (11-12-2004)
Kommentar
Fra : Preben Holm


Dato : 11-12-04 11:51

Preben Holm wrote:
>>> Indtil videre har jeg prøvet med bit 5 og 6 i LSR (Line Status
>>> Registeret), men intet virker!
>>>
>>
>> På: http://byterunner.com/16550.html står der netop:
>>
>> LSR BIT 5:
>> 0 = transmit holding register is full. 16550 will not accept any
>> data for transmission.
>> 1 = transmitter hold register (or FIFO) is empty. CPU can load the
>> next character.
>
>
> Synes ikke rigtig det virker! Nå, jeg vil prøve igen!

Problemet er, at bare der er en byte overført til UART'en vil registeret
ændre sig og overflow bitten er den eneste ændring der sker, når man
overfylder FIFO'en. Det virker som om, at "transmitter hold register" er
fuldt så snart der ligger noget i FIFO'en. Test viser, at vi sagtens kan
overføre de der 16byte til FIFO'en uden problemer, men vi kan bare ikke
teste på om der faktisk ligger 'X' eller 16 byte i FIFO'en.

Bertel Brander (11-12-2004)
Kommentar
Fra : Bertel Brander


Dato : 11-12-04 20:58

Preben Holm wrote:
> Problemet er, at bare der er en byte overført til UART'en vil registeret
> ændre sig og overflow bitten er den eneste ændring der sker, når man
> overfylder FIFO'en. Det virker som om, at "transmitter hold register" er
> fuldt så snart der ligger noget i FIFO'en. Test viser, at vi sagtens kan
> overføre de der 16byte til FIFO'en uden problemer, men vi kan bare ikke
> teste på om der faktisk ligger 'X' eller 16 byte i FIFO'en.

Jeg er ikke sikker på at jeg forstår ovenstående.

Jeg tror ikke at man kan teste hvor mange bytes der
ligger i FIFO bufferen, man burde kunne fylde på
så længe transmit holding register er sat.

--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen

Preben Holm (12-12-2004)
Kommentar
Fra : Preben Holm


Dato : 12-12-04 00:25

> Jeg er ikke sikker på at jeg forstår ovenstående.
>
> Jeg tror ikke at man kan teste hvor mange bytes der
> ligger i FIFO bufferen, man burde kunne fylde på
> så længe transmit holding register er sat.

Ja, jeg er enig i, at man _burde_ kunne.

Preben Holm (12-12-2004)
Kommentar
Fra : Preben Holm


Dato : 12-12-04 00:36

> Jeg tror ikke at man kan teste hvor mange bytes der
> ligger i FIFO bufferen, man burde kunne fylde på
> så længe transmit holding register er sat.


void write_uart(char val)
{
char i;


while (!(inportb(UART_LSR) & 0x10)) {
syscall(S_OUT, NULL, NULL); // vent på plads i fifo
}


outportb(UART_DATA, val);
}


hvis ovenstående kode anvendes går det galt.

de data der skrives til UART foregår enkeltvis - afsendelse foregår
meget langsommere når der scheduleres væk (syscall(S_OUT, NULL, NULL))
mellem afsendelse.

Der burde komme pulser af data, hvis det skyldtes, at der var for mange
processer, som optager for meget CPU-tid indtil de næste data kunne
sendes. Desværre viser det sig, at data sendes meget langsommere i
forhold til koden:

void write_uart(char val)
{
char i;


while (!(inportb(UART_LSR) & 0x10));

outportb(UART_DATA, val);
}

Første kode sender hver byte langsomt, mens anden kode sender alle byte
utrolig hurtigt. Der kommer ingen pulser pga. FIFO-størrelse i nogen af
tilfældende.

Desuden har vi læst LSR registeret - det ændrer sig ikke efter 1 byte
skrevet til 14 byte skrevet. Først når der kommer overflow ved den
17'ende byte.
Desuden angiver bit 5 kun når FIFO er helt tom - alternativt kunne man
jo skrive i pulser, men det er ikke så praktisk!


Mvh / Preben Holm

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste