Měření Pulse Width

P

pete

Guest
Nazdar,
Zde je program pro měření dvou sad impulsů, z nichž každý oddělený 500usec.
Pro každý soubor impulsů, začíná hlavičkou 2.4ms šířka pulsu, po nichž následuje 0.6ms reprezentovat "0", nebo 1.2ms reprezentovat "1".Interval jakéhokoliv impulsu je 500usec.
Když obdrží správné kombinace, bude PIC svítí LED.Vstupní obvykle vysoká bez signálu.Dvě sady pulsy jsou potřebné k ověření správnosti přenosu od zdroje.Můj problém je, jeho neběží, by tedy odpovídající LED dioda nesvítí.Žádný problém s tímto programem a vaše komentáře je vysoce ceněn.Díky.

# include <16f628a.h>
# pojistky NOMCLR, INTRC, NOWDT, NOLVP, NOBROWNOUT, PUT, NOPROTECT
# use zpoždění (hodiny = 4000000)
# byte CMCON = 0x1F
# byte VRCON = 0x9F
# define CMCON 7
# define VRCON 0
# byte portb = 0x06
# byte porta = 0x05int loop = 0, abyte [4] = (1,1,1,1), abyte1 [4] = (0,0,0,0), stav [4] = (0,0,0,0);
dlouhé c;
void zde (long);
void decode (void);
void getpulsewidth (void);
void analyzovat (void);
delay_ms (10); / / stabilizovat o power-up

# INT_EXT
void getpulsewidth (void)
(
setup_timer_1 (T1_DISABLED);
set_timer1 (0);
while (! vstup (PIN_B0));
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
while (vstup (PIN_B0));
setup_timer_1 (T1_DISABLED);
c = get_timer1 ();
)

main ()
(

while (true)
(

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);
zde (c);
decode ();
analyzovat ();
)
)

void zde (long c)
(
if (c <200 | | c == 0)
(
bit_clear (porta, 0);
bit_clear (Porta, 1);
bit_clear (Porta, 2);
)
)

void decode (void)
(
int i;
for (i = 0; i <= 3; i )
(
getpulsewidth ();
stav = c;
)
for (i = 0; i <= 3; i )
(
if (stav <100)
abyte = 0;
jiné
abyte = 1;
)

smyčky loop = 1;
)

analyzovat ()
(
if (loop> 1)
(
if ((abyte [0] == abyte1 [0 ])&&( abyte [1] == abyte1 [1 ])&&( abyte [2] == abyte1 [2]) & &
(abyte [3] == abyte1 [3]))
(
if (! abyte [0] & & abyte [1] & & abyte [2] & & abyte [3])
output_high (PIN_A0);
else if (abyte [0] & &! abyte [1] & &! abyte [2] & &! abyte [3])
output_low (PIN_A0);
else if (abyte [0] & &! abyte [1] & & abyte [2] & & abyte [3])
output_high (PIN_A1);
else if (! abyte [0] & & abyte [1] & &! abyte [2] & &! abyte [3])
output_low (PIN_A1);
else if (abyte [0] & & abyte [1] & &! abyte [2] & & abyte [3])
output_high (PIN_A2);
else if (! abyte [0] & &! abyte [1] & & abyte [2] & &! abyte [3])
output_low (PIN_A2);

)
)
jiné
(
int i;
for (i = 0; i <= 3; i )
abyte1 = abyte ;
decode ();
)
)

 
Ahoj Pete!
Já si zkopírovali kód a já určitě studovat a snažit se vyřešit váš problém.Zdá se, jako kdyby jste dekódování impulsy z TV / VCR dálkové ovládání.Jedním z doporučení je, že vždy zkontrolovat váš kód v etapách a nikdy se očekávat, že všechno musí být hned na poprvé.Udělal jsem podobnou someting pro jeden z mých projektů, ale to, co jsem udělal, je, že

1.I trgger vnějšího přerušení na náběžnou hranu.

2.Jakmile vnější přerušení se spouští i do následující dvě věci
externí přerušení provozu rutinní

i.Konfigurace timer1 pro 100usec přerušení.
ii.Konfigurace externích přerušení pro klesající hrany a ukončení přerušení.

3.Vzhledem k tomu, timer1 přerušení dojde každý 100usec.Na každém přerušení timer1
přírůstek proměnné v přerušení serivice rutina pro timer1 a čekat na
externí přerušení.

4.Jakmile dojde k přerušení externí (tentokrát na sestupná hrana) do následujících
dvě věci

i.Stop timer1.
ii.Znovu nastavit externí přerušení nastat na náběžnou hranu.

Proměnné, které jste ve zvyšování timer1 přerušení rutinní vám šířka pulsu, např. pokud se počítají 6 timer1 přeruší tak to znamená, že šířka pulsu byl 600usec (0.6msec) a pokud se započítává 12 pak to znamená, že šířka pulsu byl 1200usec (1.2msec).
Zní to složitě, pokud pak zeptá, jestli mě bude snažit kód je pro vás.
Pozdravy.

 
Díky za vaše rychlá odpověď.Budu studovat tvé rady.Zvládnu to jednoduše pomocí pulzní velení v PicBasic Pro.Jsem stále noví CCSC .. Wil vám zpětnou vazbu na to.

Pete

 
Hi Waseem:

Nemůže dostat nad svými radami kódy.Můžete to poslat na tomto fóru?Prosím, to ve dvou verzích, jedna s použitím přerušit a druhý ne pomocí přerušení, takže jsem mohl porovnat rozdíl.Jsem dekódování 2 sady impulsů, z nichž každý puls s 2.4ms hlavičku, za kterou 4 impulsy buď 0.6ms pro lo nebo 1.2ms pro hi.Interval všechny pulsy je 500usec.
Thanks a jde ..

Pete

 

Welcome to EDABoard.com

Sponsor

Back
Top