Problemen met programma voor het meten van pulsbreedte

P

pete

Guest
Hoi,
Hier is een programma om 500usec maatregel twee sets van pulsen, elk gescheiden door.
Voor elke set van impulsen, het begint met een header 2.4ms puls breedte gevolgd door ofwel 0.6ms te vertegenwoordigen "0" of 1.2ms te vertegenwoordigen "1".Interval van een puls wordt 500usec.
Wanneer de juiste combinatie is ontvangen, zal de PIC brandt een LED.Input doorgaans hoog met geen signaal.Twee sets van pulsen nodig zijn om de overbrenging te controleren van de juistheid van de bron.Mijn probleem is, zijn niet actief, dat wil zeggen overeenkomend zou LED brandt niet.Elk probleem met dit programma en uw opmerkingen wordt zeer gewaardeerd.Dank je.

# Include <16f628a.h>
# Zekeringen NOMCLR, INTRC, NOWDT, NOLVP, NOBROWNOUT, PUT, NOPROTECT
# Gebruik vertraging (klok = 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), status [4] = (0,0,0,0);
lang c;
void hier (lang);
void decoderen (void);
getpulsewidth void (void);
nietig te analyseren (void);
delay_ms (10); / / te stabiliseren op power-up

# INT_EXT
getpulsewidth void (void)
(
setup_timer_1 (T1_DISABLED);
set_timer1 (0);
while (! ingang (PIN_B0));
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
while (ingang (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);
hier (c);
decode ();
te analyseren ();
)
)

void hier (lang c)
(
if (c <200 | | c == 0)
(
bit_clear (porta, 0);
bit_clear (porta, 1);
bit_clear (porta, 2);
)
)

void decoderen (void)
(
int i;
for (i = 0; i <= 3; i )
(
getpulsewidth ();
status = c;
)
for (i = 0; i <= 3; i )
(
if (status <100)
abyte = 0;
anders
abyte = 1;
)

lus lus = 1;
)

te analyseren ()
(
if (lus> 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);

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

 
Hi Pete!
Ik heb je code gekopieerd en ik zal zeker bestuderen en proberen uw probleem op te lossen.Het lijkt alsof u decoderen pulsen van een TV / VCR afstandsbediening.Een advies is dat altijd stadia controleer je code in en nooit verwachten dat alles tot tijd worden de eerste rechts.Ik heb gedaan someting soortgelijke voor een van mijn projecten, maar wat ik heb gedaan is dat

1.Ik trgger de externe interrupt op de stijgende flank.

2.Zodra de externe interrupt wordt geactiveerd kan ik de volgende twee dingen in
de externe interrupt service routine

i.Configureer de Timer1 voor 100usec onderbreken.
ii.Configureer de externe onderbreken voor dalende flank en uitgang onderbreken.

3.Aangezien de Timer1 interrupt vindt elke 100usec.Op elke Timer1 onderbreken
increment een variabele in de interrupt routine voor serivice Timer1 en wacht tot de
externe onderbreken.

4.Zodra de externe interrupt optreedt (dit keer op dalende flank) het volgende doen
twee dingen

i.Stop Timer1.
ii.Nogmaals het configureren van de externe interrupt plaatsvindt op stijgende flank.

De variabele die je in het verhogen van Timer1 interruptroutine geeft je de pulsbreedte bv als het vervolgens geteld 6 Timer1 onderbreekt betekent dit dat de pulsbreedte 600usec was (0.6msec) en indien er 12 geteld dan betekent dit dat de pulsbreedte was 1200usec (1.2msec).
Als het klinkt ingewikkelder dan het mij vraagt zal ik proberen om het code voor je.
Groeten.

 
Bedankt voor uw snelle antwoord.Ik zal bestuderen uw advies.Ik kan dit gemakkelijk doen met behulp van puls in commando in PicBasic Pro.Ben nog nieuw voor CCSC .. Wil je feedback op.

Pete

 
Hi Waseem:

Kan niet overheen te komen met uw advies-codes.Kunt u dit naar in dit forum?Zorg ervoor dat u het in twee versies, een met behulp van onderbreken en de andere niet gebruikmakend van onderbreking, zodat ik kon het verschil te vergelijken.Ik ben decoderen 2 sets van peulvruchten, elke puls met een 2.4ms header gevolgd door 4 pulsen hetzij 0.6ms voor Lo of 1.2ms voor Hi.Interval van alle pulsen is 500usec.
Bedankt en wat ..

Pete

 

Welcome to EDABoard.com

Sponsor

Back
Top