Beste CO'er,
Na veel proberen, zoeken, lezen en nog eens proberen blijk ik nu toch muurvast te zitten. Vandaar dat ik wil vragen of één van jullie misschien een oplossing weet.
Ik ben bezig met een frequentiemeter welke zijn waarde weergeeft op een display (LCD 2x40). Ik maak daarbij gebruik van een 16f877a.
Op zich werkt het geheel goed. Alleen wanneer de puls stop gezet wordt blijft de laatst gemeten waarde staan en blijft het programma wachten tot er weer een opgaande flank komt. Omdat er geen opgaande flank komt blijft het programma netjes wachten, maar kan ik er ook niks meer mee doen.
Ik wil dus dat het programma de frequentie van het signaal meet, maar wanneer er geen signaal meer is de waarde keurig op 0 (nul) gaat staan.
Herkent iemand dit probleem?
Ik programmeer met JAL EDIT.
Bij deze ook even het stukje programma waar het om gaat.
Hopelijk kunnen jullie helpen.
Alvast bedankt,
groeten,
Arnold
forever loop
-- clear the counter
tmr1h = 0
tmr1l = 0
-- reset the capture flag
ccp1if = 0
-- wait for the first capture to take place
while !ccp1if loop end loop
-- now start the timer and clear the capture flag
ccp1if = 0
tmr1on = 1
-- wait for the next capture
while !ccp1if loop end loop
-- stop the timer and record the values
tmr1on = 0
lowbyte = ccpr1l
highbyte = ccpr1h
a = (e / ((lowbyte + (highbyte * 256)) * 2))
a = a / 360 -- 8 x 45 = 360
a = a * set_speed
if tmr1if == 1 then
a = 0
tmr1if = 0
end if
LCD_num_line_pos_1dec (a,1,31)
Wat is de laagste frequentie die je wil meten? Dan kun je toch een timer nemen die iets langer is dan een periode van die laagste frequentie. Als die de kans krijgt af te lopen zet je je meter op nul.....bijvoorbeeld.
Ik weet geen bal van jal, dus de bijbehorende code kan ik je niet mee helpen.
Roelken
Succes kent vele vaders, doch falen is immer een weeskind.
Je zou inderdaad een soort van time-out counter kunnen inbouwen die begint te tellen op het moment dat capture interrupt flag laag is en blijft. Als de teller een bepaalde waarde bereikt (=time-out waarde), dan is de time-out bereikt en kan je de frequentie-waarde terug op 0 zetten. Moest er tijdens het tellen toch een interrupt komen, dan zet je die teller op 0 en staat deze weer klaar om te beginnen.
De time-out waarde die je nodig hebt kan je desnoods experimenteel bepalen zodat de frekwentie op nul gezet wordt als er een halve seconde geen signaal wordt gezien. Waarschinjnlijk heb je een short int of een long nodig om een halve seconde lang te kunnen tellen.
Als je het echt goed wil doen, dan zou je het met een timer moeten doen en tel je de timer-interrupts tot je aan je time-out waarde zit.
De laagste frequentie die gemeten moet worden ligt rond de 10Hz. Maar omdat het programma blijft wachten totdat er een verandering komt op de ingang (-- wait for the first capture to take place[while !ccp1if loop end loop]) kan ik helaas geen gebruik meer maken van counters.
Weten jullie misschien of de interne timer0 wel door blijft lopen wanneer het programma staat te wachten. Als deze timer0 door telt kan ik zijn overflow bit misschien gebruiken om programma over zijn wachtpunt heen te tillen.
Interrupts gebruiken, het is handiger je code niet te laten blokkeren door lussen, delays en wachten op flanken.
Je zou een interrupt op overflow van een teller kunnen nemen en die de waarde van je frequentie op 0 laten zetten.
Bedankt voor jullie reacties. Ik ga straks eens verder stoeien en kijken of het met interrupts wel wil werken. Ik houd jullie op de hoogte.