16F84A skall ha koll på tid

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

16F84A skall ha koll på tid

Inlägg av mrhedin »

PIC16F84A, C.

Jag skulle vilja ha lite hjälp med kodexempel i C. Jag skall bygga en varvräknare till en bil och har en idé om att få fram varvtalet genom att räkna tiden mellan pulserna från brytarspetsarna.

Vi utgår från att timern är nollställd. Timern går nu och brytarspetsen slår ihop och en puls kommer till PIC:en. På dess positiva flank skall timerns värde sparas i en variabel.

Med det värdet kan jag sedan få fram varvtalet ganska enkelt och skicka det vidare.

Hur skall jag lösa detta? Jag är grön på programmering.
Användarvisningsbild
Icecap
Inlägg: 26221
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Inlägg av Icecap »

Om du är helt grön på programmering tror jag faktisk att du ska börja med en lite mindre projekt.

Men OK, vi kör:
* Välj en processor med det som i PIC-världen heter CCP-enhet.
* Strunta i 16x84, den kan inte det du behöver!

Jag använder 16F873 en del och den har CCP (Capture/Compare/PWM), det finns andra med sånt inbyggd.

1: Fånga varje stigande eller fallande flanka. (Capture)
2: Spara tiden som dessa flanker kommer i.
3: Se till att fånga overflow från tidsräknaren (det blir en interrupt).
4: Tdiff = Tnow - Tbefore
5: Tbefore = Tnow
6: Nu vet du vad Tdiff är (tiden mellan 2 pulser), då kan du räkna ut RPM med en simpel division, RPM = Konstant / Tdiff, Konstant är en funktion av tidsräknarklockan osv.
7: Använd resultatet bäst du vill.

En Capture-enhet består av en räknare som har en flank-detektering inbyggd. Den klockas av en "fast"(programmerbar) frekvens och för varje flanka som detekteras sparas räknarens värde i ett register och ett interrupt utförs (om önskat). När räknaren går från max. till 0 kan den ge ett interrupt, därmed kan man räkna upp ytterligare ett antal bytes som kan ge en mycket lång och noga upplösning, hur långt man ska gå beror på fallet.
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Tänkte också såga valet av 16f84 - den är ute som komponent, finns inget som inte någon annan pic gör bättre och den saknar många roliga nyttiga funktioner samt är onödigt dyr.

__________
| |
| Vila i frid |
| 16F84 |
| |
--------------------------------
SlotH
Inlägg: 52
Blev medlem: 27 februari 2005, 18:58:04

Inlägg av SlotH »

Icecap skrev:Om du är helt grön på programmering tror jag faktisk att du ska börja med en lite mindre projekt.

Men OK, vi kör:
* Välj en processor med det som i PIC-världen heter CCP-enhet.
* Strunta i 16x84, den kan inte det du behöver!

Jag använder 16F873 en del och den har CCP (Capture/Compare/PWM), det finns andra med sånt inbyggd.

1: Fånga varje stigande eller fallande flanka. (Capture)
2: Spara tiden som dessa flanker kommer i.
3: Se till att fånga overflow från tidsräknaren (det blir en interrupt).
4: Tdiff = Tnow - Tbefore
5: Tbefore = Tnow
6: Nu vet du vad Tdiff är (tiden mellan 2 pulser), då kan du räkna ut RPM med en simpel division, RPM = Konstant / Tdiff, Konstant är en funktion av tidsräknarklockan osv.
7: Använd resultatet bäst du vill.

En Capture-enhet består av en räknare som har en flank-detektering inbyggd. Den klockas av en "fast"(programmerbar) frekvens och för varje flanka som detekteras sparas räknarens värde i ett register och ett interrupt utförs (om önskat). När räknaren går från max. till 0 kan den ge ett interrupt, därmed kan man räkna upp ytterligare ett antal bytes som kan ge en mycket lång och noga upplösning, hur långt man ska gå beror på fallet.
Hur löser man detta med capture i picbasic ? finns det någon sådan funktion eller är det bara att hoppa till C?
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Om du tvunget ska köra basic så måste du ladda de aktuella registerna via basic-kommandon för att få igång CCP-modulen. Vilka register som är aktuella hittar du i databladet för PICen.
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Funkar utmärkt att köra med basicen också, bara att läsa manualen och kolla vad man skall stoppa i registrerna.
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

Jag bakåtsträvar...

Inlägg av mrhedin »

Hej och tack för alla svar!

Med risk att låta bakåtsträvande skulle jag ändå vilja använda 16F84A. Den har ju även den en timer i sig så jag vill tro att detta skulle gå att lösa även med denna processor.

Det är just kodexempel i C jag är nyfiken på, hur man lyfter ut värden ifrån timern osv. Förloppet jag tänkt är som sådant:

X.Timern är nollstäld.
X. Tiden går.
1. Detektera en puls på en ingång.
2. Lyfta ut tiden ur timern och sedan nollställa den.
3. Göra beräkningar för att få fram RPM med timervärdet.
4. Skicka ut det på mina LED:ar tills dess att nästa flank kommer och allt repeteras från steg 1.

Detta måste väl vara praktiskt genomförbart med en 16F84A och C?

Är jättetacksam för alla svar!
Användarvisningsbild
Forsgren
EF Sponsor
Inlägg: 1210
Blev medlem: 24 oktober 2003, 13:45:48
Ort: Orsa

Inlägg av Forsgren »

I PICBasic finns det väl något som heter pulsin för att mäta längden på pulser...
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

"pulsin" har inget med timern att göra, det är ren polling av I/O-pinnen.

>> mrhedin

Utan CCP-modul måste du fortfarande polla I/O-pinnen för att starta/stoppa timern, om du nu inte synkar det med ett interrupt på RB0. Fördelen med CCP är att den kan mäta pulstiden helt automatiskt i bakgrunden medans ditt program hittar på något helt annat.
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

Inlägg av mrhedin »

Tjena $tiff.

Det är lugnt om jag måste polla pinnen.
Har du nån kod i C eller PicBasic som jag skulle kunna få kika på som visar hur man gör för att polla och plocka värden från timern?
Användarvisningsbild
Forsgren
EF Sponsor
Inlägg: 1210
Blev medlem: 24 oktober 2003, 13:45:48
Ort: Orsa

Inlägg av Forsgren »

Om du ska polla funkar pulsin i picbasic fint, ta en titt i manualen till picbasic...
Ex:
PULSIN PORTB.4,1,WORD1
Användarvisningsbild
Icecap
Inlägg: 26221
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Inlägg av Icecap »

Kolla upplösningen på PULSIN, jag tror att du blir besviken med mätnoggranheten.

Jag har tidigare byggt en "rally-dator" som klarade av bla. detta med att mäta RPM och det var absolut en mätmässig fördel att använda Capture-enheten.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

>> mrhedin

Principen är enkel. Gör en tight loop med en if-sats som kollar om I/O-pinnen förändrats. Om den har det ska den starta timern, sedan fortsätter samma loop tills den hittar en fölrändring igen, och stänger då av timern, sparar värdet och nollställer den till nästa runda. Här har du inte tid att göra något annat, ska du göra andra beräkningar måste du hoppa över någon puls.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43202
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Inlägg av sodjan »

"Med risk att låta bakåtsträvande skulle jag ändå vilja använda 16F84A."

Varför ???
Ta en 16F88 eller 16F688 så får du mycket "på köpet".
Dessutom, vad skall hända med mätvärdet ? Vad betyder att det skall "skickas vidare" ?? Kanske över ett serieinterface ? Även det saknas F84'an...

Slutligen, om det är ditt första PIC projekt så skulle du ha mycket "nytta" av att köra ditt första projekt (och kanske ett par till) i assembler. Du lär dig mycket om PIC arkitekturen som underlättar i framtiden när du kanske vill prova C eller Basic.
Användarvisningsbild
Hedis
Inlägg: 2489
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

[offtopic]
Sodjan> Skoj att du hittat hit!
Välkommen.

Har allt en Norritake-display som kommer ifrån dig liggandes i lådan.
Nu finns ju chansen att visa vad man åstakommer med den oxå. :)

[back on track]
Skriv svar