Pulzen blijven tellen terwijl je uitleest

Ontwerpen en programmeren

Postby henko » Mon Jan 30, 2012 12:00 am

Hallo Allen,

Hoe kun je nu pulzen van 0,1 sec die op de ingang RA1 binnen komen van een Pic 16f blijven tellen terwijl je ze wil uitlezen.
Naar mijn gevoel mis je dan enkele 0,1 secondes op het moment dat je uitleest.

Is het wel mogelijk om uit te lezen terwijl het tellen dan doorgaat?

Groet Henk.
henko
 
Posts: 529
Joined: Thu Jan 02, 2014 3:27 pm

Postby jippie » Mon Jan 30, 2012 12:00 am

Ik ken geen PIC'jes, maar je zou eens kunnen google'en op 'interrupt routine'.

Het tellen doe je in de interrupt routine en het uitlezen in de hoofdlus. De interrupt routine draait op de achtergrond, wordt gestart als er een puls op een bepaalde ingang binnen komt. Als de interrupt routine klaar is gaat het ding weer precies verder waar het gebleven was.
jippie
 
Posts: 342
Joined: Thu Jan 02, 2014 3:28 pm

Postby petrus bitbyter » Mon Jan 30, 2012 12:00 am

Het hangt van de schakeling en van het programma af. Veel PICs hebben meer dan één timer/counter aan boord die elk hun eigen instelling en behandeling nodig hebben, ook weer afhankelijk van wat je ermee wilt doen. In het algemeen blijft een PIC doortellen tijdens het uitlezen maar dat is dus niet onder alle omstandigheden zo. Je zult dus eerst goed moeten weten wat je wilt en daarna de datasheet raadplegen om na te gaan of dat met de PIC die je voor ogen staat ook kan.

petrus bitbyter
petrus bitbyter
 
Posts: 663
Joined: Thu Jan 02, 2014 3:27 pm

Postby arjen h. » Tue Jan 31, 2012 12:00 am

Interrupt routine is normaal gesproken meest voor de hand liggend. Maar als de frequentie van de pulsen niet te snel is, of anders gezegd als de hoofdlus van het programma snel genoeg is dan kun je ook het volgende overwegen.

int counter = 0;bool pulshigh = false;while(1)  // hoofdlus van programma{  // doe hier wat het hoofdprogramma allemaal moet doen  // maar dit mag niet te lang duren    if (pulshigh == true) && (RA1 == low)  // neergaande flank  {    pulshigh = false;  }  if (pulshigh == false) && (RA1 == high)  // opgaande flank  {    counter = counter + 1;    pulshigh = true;  }}


N.B. Let bij het tellen er wel op dat je niet over de bovengrens van de variabele gaat want dan krijg je rare dingen. Bij een integer ga je bijvoorbeeld van 32767 naar -32768.
Het Elektor forum is voor de lezers; voor een vraag aan de redactie kun je het beste Elektor een email sturen.
arjen h.
Moderator
 
Posts: 1287
Joined: Thu Jan 02, 2014 10:40 am

Postby henko » Sat Feb 04, 2012 12:00 am

Ok,

Dank,

Achteraf had ik dat zelf ook kunnen bedenken.
Maar soms moet ik wakker geschud worden.
Ik ben soms met te veel dingen bezig.

Henk.
henko
 
Posts: 529
Joined: Thu Jan 02, 2014 3:27 pm

Re: Pulzen blijven tellen terwijl je uitleest

Postby cba01 » Fri Mar 28, 2014 3:09 am

Hi

Mischien kan hier een propeller van pas komen, een of meer cog's doen de input,tellen dus, terwijl 1 designated cog de data uitleest en displayed van alle input cog.

cba
cba01
 
Posts: 3
Joined: Thu Mar 27, 2014 8:39 pm

Re: Pulzen blijven tellen terwijl je uitleest

Postby eriksl » Fri May 30, 2014 9:56 am

Het is niet zo'n actuele vraag meer, maar ik zie het probleem niet zo? Die paar instructies die het kost om een teller op te hogen duren echt geen 0,1 seconde, zelfs niet als je 'm op 128 kHz zou draaien (ik ben niet zo bekend met pic's, maar 1 of 8 MHz is gebruikelijk?). De pic heeft vast wel een pin change interrupt waar je een isr van een paar instructies achter kunt hangen.
eriksl
 
Posts: 515
Joined: Thu Jan 02, 2014 3:28 pm


Return to Microcontrollers

Who is online

Users browsing this forum: No registered users and 1 guest