pulsen inlezen in PIC

Hallo

ik moet een programma schrijven in C waarbij pulsen van een reedcontact moeten geteld worden gedurende een paar seconden. en vervolgens moet een uitgang aangestuurd worden.

ik heb al wat geschreven maar de eerste uitgang wordt steeds gestuurd. Hij geeft dus altijd aan dat er 0 pulsen geteld worden.

hier mijn programma :

void main()
{
int i;

while(TRUE)
{

while ( delay_ms(3000) )
{

if ( input(PIN_A4) == TRUE )
{
i++;//als ingang A4 hoog wordt, integer i verhogen met 1

}

}

if (i == 0)
{
output_high(PIN_B0); //maak pin B0 hoog
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);
delay_ms(2000);
}

if( i > 0 && i <= 2 )//als i een waarde heeft tussen 0en2
{
output_high(PIN_B0); //maak pin B0 hoog
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);
delay_ms(2000);
}

if( i > 2 && i <= 4 )//als i een waarde heeft tussen 2en4
{

output_low(PIN_B0);
output_high(PIN_B1);//maak pin B1 hoog
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7); delay_ms(2000);
}
else output_b(0x00);
}
}

Enzovoort alle uitgangen af.
Echt al veel tijd ingestoken en er niet aan uitkomen

Misschien een beginwaarde geven aan i
Bij de declaratie van de variablele i is de beginwaarde in uw geval willekeurig.
En onmiddelijk daarop test je i al op 0

[Bericht gewijzigd door MGP op dinsdag 9 mei 2006 05:51:39

LDmicro user.

Je bent vergeten om in te stellen of het pinnetje een in- of uitgang is.

Kijk eens naar set_tris_..(...);
(bijv set_tris_a(0xFF); set_tris_b(0); )

Een mooie oplossing is om het input pinnetje aan een pootje te hangen die op interrupt basis werkt. Dus als het pinnetje veranderd je in een interrupt routine komt en dan automatisch de boel checked.

Hoe je die i gebruikt klopt idd niets van. Je stelt geen begin waarde in en je laat hem eindeloos optellen.

Btw:

code:


if( i > 0 && i <= 2 )//als i een waarde heeft tussen 0en2

betekent: als i 1 of 2 is doe: ....
en niet alleen als i 1 is.

[Bericht gewijzigd door JuuL op dinsdag 9 mei 2006 07:49:13

> while ( delay_ms(3000) )

wat is dit voor een delay routine? de meeste delay routines die ik ken keren na de gespecificeerde tijd terug. als dat met deze ook zo is dan gaat dit dus niet werken.

> if ( input(PIN_A4) == TRUE )
> i++;//als ingang A4 hoog wordt, integer i verhogen met 1

het commentaar klopt, maar de code is
'als A4 hoog *is*, ....'
en dat is heel wat anders!

Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog

i heb ik aangepast zodat het vanaf 0 telt en de rest ook.
nu nog dit

Kijk eens naar set_tris_..(...);
(bijv set_tris_a(0xFF); set_tris_b(0); )

Een mooie oplossing is om het input pinnetje aan een pootje te hangen die op interrupt basis werkt. Dus als het pinnetje veranderd je in een interrupt routine komt en dan automatisch de boel checked.

hoe geef je aan dat RB0 (interruptingang) een ingang is en de rest van de B poorten uitgang zijn?

wat is dit voor een delay routine? de meeste delay routines die ik ken keren na de gespecificeerde tijd terug. als dat met deze ook zo is dan gaat dit dus niet werken.

hoe geef jij jouw manier van delay in?

Op 9 mei 2006 10:29:28 schreef trektronics:
hoe geef jij jouw manier van delay in?

Ik weet niet wat je bedoeld. Ik gebruik delay routines, en hou er rekening mee dat die pas terugkeren na de aangegeven tijd.

Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog