Aide au décodage 2 séries d'impulsions

P

Pete

Guest
Salut tout le monde!
J'ai essayé d'écrire le programme ci-dessous pour décoder les 2 séries d'impulsions et une fois décodé, correspondant s'allume.L'entrée est normalement Salut.Il existe 2 types d'impulsions d'entrée.Objet de 2 jeux est d'assurer légitimes de la transmission de la source.Ces 2 jeux identiques d'impulsions doivent être décodées et allumer une LED en fonction de la combinaison des 4 impulsions après l'en-tête.

- - - - - - - - - - -----------
|____| | __ | | __ | | _ | | _ | |____| | __ | | __ | | _ | | _ |Header = 2,4 ms
"One" = 1,2 ms
«Faible» = 0.6ms
Intervalle de toutes les impulsions est 500usec.
Sans signal, entrée normalement élevée.Lorsque le signal arrive, il passe au niveau bas, avec durée de l'impulsion donnée ci-dessus.
Exemple ci-dessus est un signe de tête 1100 tête de 1100.

Ci-dessous le code mais ne fonctionne pas.S'il vous plaît aider!!Merci ....

# Include <> 16f628a.h
# Fusibles NOMCLR, INTRC, NOWDT, NOLVP, NOBROWNOUT, PUT, NOPROTECT
retarder la consommation de # (horloge = 4000000)
# CMCON octet = 0x1F
# VRCON octet = 0x9F
# Define CMCON 7
# Define VRCON 0
# PORTB = 0x06 octets
# Porta octet = 0x05boucle int = 0, abyte [5] = (1,1,1,1,1), abyte1 [5] = (0,0,0,0,0);
c long, l'état [5] = (0,0,0,0,0);
nul ici (long);
décoder (void);
getpulsewidth long (void);
void analyser (void);
delay_ms (10); / / stabiliser la mise sous tension# INT_EXT
getpulsewidth long (void)
(
disable_interrupts (GLOBAL);
setup_timer_1 (T1_DISABLED);
set_timer1 (0);
while (! entrée (PIN_B0));
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
while (entrée (PIN_B0));
setup_timer_1 (T1_DISABLED);
retour get_timer1 ();
enable_interrupts (GLOBAL);
)

main ()
(

while (true)
(

set_tris_a (0b11110000);
port_b_pullups (TRUE);
set_tris_b (0b11111101);
ext_int_edge (H_TO_L);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
enable_interrupts (INT_EXT);
enable_interrupts (GLOBAL);
c = getpulsewidth ();
ici (c);
decode ();
analyser ();

)
)

nul ici (à long c)
(
if (c <200 | | c == 0)
(
bit_clear (Porta, 0);
bit_clear (Porta, 1);
bit_clear (Porta, 2);
)
)

décoder (void)
(
int i;
for (i = 0; i <= 4; i )
(
c = getpulsewidth ();
statut = c;
)
for (i = 0; i <= 4; i )
(
if (status <100)
abyte = 0;
d'autre
abyte = 1;
)

boucle la boucle = 1;
)

analyser ()
(
if (boucle> 1)
(
if (([abyte 1] == abyte1 [1 ])&&( abyte [2] == abyte1 [2 ])&&( abyte [3] == abyte1 [3]) & &
([Abyte 4] == abyte1 [4]))
(
if (! abyte [1] & & [abyte 2] & & [abyte 3] & & [abyte 4])
output_high (PIN_A0);
else if (abyte [1] & &! [abyte 2] & &! [abyte 3] & &! [abyte 4])
output_low (PIN_A0);
else if (abyte [1] & &! [abyte 2] & & [abyte 3] & & [abyte 4])
output_high (PIN_A1);
else if (! abyte [1] & & [abyte 2] & &! [abyte 3] & &! abyte [4])
output_low (PIN_A1);
else if (abyte [1] & & [abyte 2] & &! [abyte 3] & & [abyte 4])
output_high (PIN_A2);
else if (! abyte [1] & &! [abyte 2] & & [abyte 3] & &! [abyte 4])
output_low (PIN_A2);

)
)
d'autre
(
(
int i;
for (i = 0; i <= 4; i )
abyte1 = abyte ;
)
decode ();
)
)Code:

 
Votre message est difficile à lire.Essayez d'éditer (en appuyant sur le bouton Edit), sélectionnez la section importante, et appuyez sur le "code".

 
Salut Echoe47!
J'ai déjà édité mon explication.Ignorer les points et les traits au-dessus des impulsions car elle ne peut être modifié la façon dont il devrait être.Mais, le signal est normalement élevée lorsque aucun signal.Les impulsions que vous voyez vont tous impulsions négatives.Pls le programme ci-dessous il.Merci ...

Pete

 
Il ya quelque chose à ce sujet "code" que certaines personnes ne peuvent tout simplement pas à comprendre.<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Clin d'œil" border="0" />
Voici une version reformatée du message d'origine de Pete:Code:

- - - - - - - - - - -----------

|____| | __ | | __ | | _ | | _ | |____| | __ | | __ | | _ | | _ |
 
Code:/ Retour de la fonction /

/ / -1 Si impulsion plus courte que 300 usec

/ / 0 si ZERO

/ / 1 si l'une

/ / 2 durée de l'impulsion d'erreur est inférieure à en-tête, mais plus d'un

/ / 3 en-tête

/ / 4 d'erreur, durée d'impulsion est plus longue de 2400 usec

/ / Note: ces codes d'erreur peuvent être combinées en une seule erreur, 0 1 et des cas d'en-tête - il est à vous.

/ / Fonction supposer que les limites d'impulsion ont été correctement restauré à la réception fin

/ / Sinon, il peut manquer cas d'erreur pour les impulsions de haut niveau avec une durée de moins de 600 usecdecode_bit char (void)

(

tmp char;while (inport () == 1) / / sondage sur le port alors qu'il est de commencer

;wait (TIME_300_USEC); / / wait for Middle base d'impulsions standardpour (tmp =- 1; (inport () == 0) & & (tmp <= 3);) / / impulsion de balayage en boucle pour trouver sa durée

(

tmp ;

wait (TIME_600_USEC);

)

tmp retour;

)
 
atferrari a écrit:

Êtes-vous essayer de décoder Sony CSARS protocole?
 
Salut.

Pourquoi êtes-vous toujours initilizing?

main ()
(
while (true)
(
set_tris_a (0b11110000);
port_b_pullups (TRUE);
set_tris_b (0b11111101);
ext_int_edge (H_TO_L);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
enable_interrupts (INT_EXT);
enable_interrupts (GLOBAL);
c = getpulsewidth ();
ici (c);
decode ();
analyser ();
)
)

peut-être comme ci-dessous?

main ()
(
set_tris_a (0b11110000);
port_b_pullups (TRUE);
set_tris_b (0b11111101);
ext_int_edge (H_TO_L);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
enable_interrupts (INT_EXT);
enable_interrupts (GLOBAL);
while (true)
(
c = getpulsewidth ();
ici (c);
decode ();
analyser ();
)
)

 

Welcome to EDABoard.com

Sponsor

Back
Top