Software UART řízený - bit-bouchání v C (Keil)

M

Maverickmax

Guest
Ahoj

Byl jsem usilovně snaží vyvinout bit-bouchání v C k provádění UART na straně přijímače v mém AT89C51 čipu.My kódy nepracoval v okamžiku, kdy

Pokud jste již UART software-řízený kód pro přijímač v C, dejte mi prosím vědět asap.Potřebuji to pro můj bezdrátový projekt.

Děkuji

Maverick Max

 
Philips má žádost Poznámka pro bit-Uhodil sériový port.

Dovoluji si navrhnout, že by bylo mnohem přesnější, pokud to v ASM.V C, je těžké předvídat načasování vašeho kódu.

 
Techie napsal:

Philips má žádost Poznámka pro bit-Uhodil sériový port.Dovoluji si navrhnout, že by bylo mnohem přesnější, pokud to v ASM.
V C, je těžké předvídat načasování vašeho kódu.
 
Ne nemám odkaz, ale můžete hledat semiconductor.philips.com za to.Hledat výraz software UART.Myslím, že to bylo pro jejich 87C751 řadič.Také by mohly pomoci při hledání.

 
Zde jsou dvě Aplikační poznámky od společnosti Philips pro řízené sériovou komunikaci rutiny Software.Je na 751/752/753 zařízení, ale doufám, že to platí pro 51 stejně.

http://www.semiconductors.philips.com/acrobat_download/applicationnotes/AN423.pdf

http://www.semiconductors.philips.com/acrobat_download/applicationnotes/AN446.pdf

zdrojový kód, který jsem jen starší z programátorů nebe je přiložen.

Na zdraví
Omlouváme se, ale musíte přihlásit a prohlížet tuto přílohu

 
Dobrý den, opět

Jak jistě víte, že chci vyvíjet software UART (bit-bouchání) pro mého přijímače.Vzhledem k tomu, vy jste nemohli dát mi jakýkoliv kód C, byl jsem nucen vyvíjet můj kód v C, ale já nejsem 100% jistý, že to bude fungovat.Jste vítáni k použití je

Mám v úmyslu využít 4200 Baud proto 1/baud, která poskytuje 416uS.

Když start bit nastane první zpoždění bude vznikat bitwidth / 2 (208uS).Interrupt Service Rutinní aktivuje, který se opakuje na 8 krát pro každý 416us s cílem zachytit datových bitů, protože chci zjistit data bit ve středu bit'speriod data.Nakonec zpoždění je generován na dvojnásobek času (208us 208us = 416us), zkontrolovat, zda je stop bit je 1, pak datových bitů (buffer_G) je umístěna v P1 ...

Po přečtení různých dokumentů z internetů, jsem přemýšlel o použití externího přerušení v mém kódu, ale budu ji uložit pro pozdější Cuz I třeba, aby se tento kód právo na prvním místě.

Žádnou zpětnou vazbu?

Maverick Max

Kód:# Include <AT89X52.H># Define INTERRUPT_Timer_2_Overflow 5

# Define OUTPUT P1neplatné Timer_2_Init (void);

neplatné hardware_delay_208us ();/ * ------------------------------------------------ --------------- * /char buffer_G;

int i_G = 0;

sbit DATA_RX = P3 ^ 2;void main (void)

(

Timer_2_Init (); / / Nastavení časovače 2

EA = 1, / / globálně povolit přerušeníwhile (1)

(

/ / Počkat na start bit

while (DATA_RX == 1)

(

)/ / Delay (208uS)

hardware_delay_208us ();/ / Je to logické nuly

if (DATA_RX == 0)

(/ / Aktivace Interrupt Service Rutinní

ET2 = 1;

TR2 = 1;/ / Wait for Interrupt Service Rutinní dokončil 8 krátwhile (i_G! = 8)

()/ / Nastavení i_G být nula

i_G = 0;/ / Hardware zpoždění 208 (Opakovat dvakrát dostat 416us)

hardware_delay_208us ();

hardware_delay_208us ();/ / Stop bit

if (DATA_RX! = 1)

(

/ / Odstranit obsah v buffer_G

buffer_G = buffer_G & 0x00;

)

jiný

(

OUTPUT = výstup & buffer_G;

)

))

)/ * ------------------------------------------------ --------------- * /neplatné Timer_2_Init (void)

(T2CON = 0x04; / / Load Timer 2 kontrolní registrovatTH2 = 0xFE; / / Load Timer 2 vysokorychlostní byte

RCAP2H = 0xFE; / / Load Timer 2 reload kapitán.
reg.
vysoká byte

TL2 = 0x6F; / / Load Timer 2 nízké byte

RCAP2L = 0x6F; / / Load Timer 2 reload kapitán.
reg.
nízké byteET2 = 0;

TR2 = 0;

)/ * ------------------------------------------------ --------------- * /neplatné X (void) přerušení INTERRUPT_Timer_2_Overflow

(
i_G ;

if (DATA_RX == 1)

(

buffer_G = (buffer_G & 0x80);

)

jiný

(

buffer_G = (buffer_G & 0x00);

)/ / Shift údaje přímo na sedmkrát

if (i_G <7)

(

buffer_G = buffer_G>> 1;

)if (i_G == 8)

(

/ / Vypne Interrupt Service Rutinní

ET2 = 0;

TR2 = 0;

)

)/ * ------------------------------------------------ --------------- * /neplatné hardware_delay_208us ()

(

/ / Configure Timer 0 jako 16-bit timer

TMOD & = 0xF0; / / Vymazat vše na kousky (T1 nezmění)

TMOD | = 0x01, / / Set vyžaduje, aby bity (T1 nezmění)ET0 = 0;/ / Hodnota 50ms zpoždění

TH0 = 0xFF; / / časovač 0 Počáteční hodnota (High Byte)

TL0 = 0x3F; / / časovač 0 Počáteční hodnota (LOW Byte)TF0 = 0; / / Clear přetečení vlajky

TR0 = 1; / / Start časovač 0while (TF0 == 0); / / Loop do Timer 0 přetečení (TF0 == 1)TR0 = 0; / / Stop Timer 0;

)
 
Zdá se, že jeden problém.Když zjistíte první bit, je pravděpodobné, že budete detekovat jen velmi málo času po skutečném occuance na start bit.Záleží na vašem detekce methood a software latence.Pak, pokud začnete váš algoritmus čekání půl kousek do centra start bit, budete pravděpodobně někde blízko konce start bit, ne uprostřed.

Navrhuji, abyste počkali 1 / 4 bit na start první bit.

 
Vzhledem k přerušení latence atd, místo odběru vzorků pokračuje ke konci.Snížením některých počítat pro časovač, který je přibližně roven přerušit latence a spuštění kódu, dá správné výsledky.

Jakékoliv jak je funkce zcela volebních dobu osmi bitů, může přerušit není nutné.Můžete vzorek osmi bitů v cyklu while pro osmkrát.Opět malé úpravy v časovač počítat tím, že zvažuje provedení zpoždění bude správné místo odběru vzorků.

Podívejte se na následující ukázkový kód
Kód:neplatné get_char (void)

(

unsigned char buffer_l = 0x00, 0x01 = mask_l;/ / Počkat na start bit

while (DATA_RX == 1)

(

)/ / Delay (208uS)

hardware_delay_208us ();while (mask_l! = 0)

(

hardware_delay_208us ();

hardware_delay_208us ();

if (DATA_RX == 1)

(

buffer_l | = mask_l;

)

mask_l = mask_l <<1;

)

hardware_delay_208us ();

hardware_delay_208us ();if (DATA_RX! = 1)

(

/ / Odstranit obsah v buffer_G

buffer_G = 0x00;

)

jiný

(

buffer_G = buffer_l;

)

)

 
Hi idlebrain

Wow, Váš kód je mnohem složitější než moje familing kód.

idlebrain napsal:Jakékoliv jak je funkce zcela volebních dobu osmi bitů, může přerušit není nutné.

Můžete vzorek osmi bitů v cyklu while pro osmkrát. Opět drobné úpravy v časovač počítat tím, že zvažuje provedení zpoždění bude správné místo odběru vzorků.
 
Maverickmax napsal:Říkáte, že musím snížit zpoždění způsobená provedení lantency?

 

Welcome to EDABoard.com

Sponsor

Back
Top