Измервателни Pulse Width

P

Pete

Guest
Здрасти,
Това е програма за измерване на две групи от импулси, всеки, разделени от 500usec.
За всеки набор от импулси, той започва с глава импулс 2.4ms ширина следвани от 0.6ms да представлява "0" или 1.2ms да представлява "1".Интервал на всеки импулс е 500usec.
При правилна комбинация се получава, на мира ще свети един светодиод.Вход нормално висок, без сигнал.Две групи от импулси са длъжни да проверят достоверността на преноса от източника.Моят проблем е, не си работи, т.е. съответните LED няма да свети.Какъвто и проблем с тази програма и вашите коментари е високо ценена.Благодарности.

# включват <16f628a.h>
# предпазители NOMCLR, INTRC, NOWDT, NOLVP, NOBROWNOUT, пригодени, NOPROTECT
# употреба забавяне (часовник = 4000000)
# байт CMCON = 0x1F
# байт VRCON = 0x9F
# определят CMCON 7
# определят VRCON 0
# байт portb = 0x06
# байт Porta = 0x05Int линия = 0, abyte [4] = (1,1,1,1), abyte1 [4] = (0,0,0,0), статут [4] = (0,0,0,0);
дълго C;
нищожен тук (дължина);
нищожен декодиране (Void);
нищожен getpulsewidth (Void);
нищожен анализ (Void);
delay_ms (10); / / стабилизирането на властта-горе

# INT_EXT
нищожен getpulsewidth (Void)
(
setup_timer_1 (T1_DISABLED);
set_timer1 (0);
докато (! вход (PIN_B0));
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
докато (вход (PIN_B0));
setup_timer_1 (T1_DISABLED);
C = get_timer1 ();
)

Основните ()
(

а (вярно)
(

set_tris_a (0b11110000);
port_b_pullups (TRUE);
set_tris_b (0b11111101);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
ext_int_edge (H_TO_L);
enable_interrupts (INT_EXT);
enable_interrupts (Global);
тук (в);
декодиране ();
анализ ();
)
)

нищожен тук (в дългосрочен)
(
IF (C <200 | | в == 0)
(
bit_clear (Porta, 0);
bit_clear (порта, 1);
bit_clear (порта, 2);
)
)

нищожен декодиране (Void)
(
Int I;
за (I = 0; I <= 3; I )
(
getpulsewidth ();
статут = C;
)
за (I = 0; I <= 3; I )
(
ако (статут <100)
abyte = 0;
в противен случай
abyte = 1;
)

линия = линия 1;
)

анализ ()
(
IF (линия> 1)
(
ако ((abyte [0] == abyte1 [0 ])&&( abyte [1] == abyte1 [1 ])&&( abyte [2] == abyte1 [2]) & &
(abyte [3] == abyte1 [3]))
(
ако (! abyte [0] & & abyte [1] & & abyte [2] & & abyte [3])
output_high (PIN_A0);
иначе, ако (abyte [0] & &! abyte [1] & &! abyte [2] & &! abyte [3])
output_low (PIN_A0);
иначе, ако (abyte [0] & &! abyte [1] & & abyte [2] & & abyte [3])
output_high (PIN_A1);
иначе, ако (! abyte [0] & & abyte [1] & &! abyte [2] & &! abyte [3])
output_low (PIN_A1);
иначе, ако (abyte [0] & & abyte [1] & &! abyte [2] & & abyte [3])
output_high (PIN_A2);
иначе, ако (! abyte [0] & &! abyte [1] & & abyte [2] & &! abyte [3])
output_low (PIN_A2);

)
)
в противен случай
(
Int I;
за (I = 0; I <= 3; I )
abyte1 = abyte ;
декодиране ();
)
)

 
Здравей Пит!
Имам копират кода си и аз определено ще го изучават и се опитайте да решите проблема си.Изглежда, като че ли са декодиране на импулси от една телевизия / видео дистанционно управление.Един съвет е, че винаги проверявайте кода си на етапи и никога не се очаква всичко да се прави за първи път.Аз направих someting подобен за един от моите проекти, но това, което съм направил е, че

1.Аз trgger външните прекъсват относно повишаване на ръба.

2.След като външните прекъсват се задейства аз правя следните две неща
външните прекъсват рутинна услуга

i.Конфигуриране на timer1 за 100usec прекъсвам.
II.Конфигуриране на външните прекъсване за попадащи ръб и излизане прекъсвам.

3.Тъй като timer1 прекъсне ще настъпи всеки 100usec.На всеки timer1 прекъсват
нарастване на променлива в прекъсват serivice рутинни за timer1 и изчакайте
външни прекъсвам.

4.След като външните прекъсне реда (това време на падането край) направете следното
две неща

i.Спри timer1.
II.Още веднъж конфигурирате външния прекъсват да възникнат относно повишаване на ръба.

Променливата, че сте били в увеличаване на timer1 прекъсват рутинни ще ви даде импулса например, ако тя включва 6 timer1 прекъсва след това означава, че импулса е 600usec (0.6msec) и ако тя е броят 12 след това означава, че импулса беше 1200usec (1.2msec).
Ако ви звучи сложно после питаш мен аз ще се опитам да го код за вас.
С уважение.

 
Благодаря ви за бърз отговор.Аз ще учат вашите съвети.Мога да го направя лесно използване пулс в команда в PicBasic Pro.Все още съм нов за Wil .. CCSC ви даде мнение за него.

Пит

 
Здравейте Waseem:

Не може да го преживее с вашите съвети кодове.Мога ли да го изпратите в този форум?Моля, са в два варианта, единия се използва прекъсване и други, които не използват прекъсват, така че мога да сравни разликата.Аз съм декодиране 2 комплекта на импулси, всеки импулс с глава 2.4ms, последвана от 4 импулси или 0.6ms Защото, ето или 1.2ms за здрасти.Интервал на всички импулси е 500usec.
Благодаря и отношение ..

Пит

 

Welcome to EDABoard.com

Sponsor

Back
Top