16F84A skall ha koll på tid
16F84A skall ha koll på tid
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.
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.
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.
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?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.
Jag bakåtsträvar...
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!
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!
"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
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
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.
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.
"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.
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.