Shock Media

Navigatie

picbasic, periode tijd meten

Forum > Digitaal > picbasic, periode tijd meten
Naam Bericht
Fernandez

Ik wil zo nauwkeurig mogelijk periode tijd meten tussen twee op een volgende pulsen. De periode tijd varieert van 1sec tot 2,9ms.

De pic gaat vervolgens een pulse genereren die verschoven is tov de ingangs puls, de delay wordt afhankelijk van de gemeten periode tijd.

Hoe kan ik het beste nauwkerig de periode tijd meten?
Hoe kan ik zorgen dat de pic periode tijd, blijft meten terwijl ik de output puls genereer.
SparkyGSX

hardware timer/counter met input capture gebruiken, alles met interrupt routines afhandelen.

De input capture geeft je een interrupt op beide flanken, waarbij de waarde van een vrij lopende timer wordt opgeslagen. In de interrupt routine kijk je vervolgens welke flank het was, en bereken je de tijd sinds de vorige flank.
Vervolgens stel je een andere timer in op de gewenste vertraging, waarbij deze een uitgang actief zet, en eveneens een interrupt genereert. In deze interrupt stel je de timer opnieuw in voor de neergaande flank van de gegenereerde puls.
Fernandez

Kan dit met PIC Basic? En met welk commando?

COUNTER, telt het aantal pulsen op een input.
SparkyGSX

dit ga je niet redden met een paar "standaard" commando's in PIC basic, je zult je moeten verdiepen in de datasheet van die PIC, denk ik. Ik ken PIC basic zelf niet, ik gebruik altijd de AVR serie met C / ASM.
Fernandez

Als je een interrupt start, dan stopt het hoofd programma toch?

Betekend dit dan dat of de periode tijd meting een deel mist? Omdat de pic bezig is met het pulsout commando?
ojeke

Ik denk dat ze het volgende bedoelen:

Je µC heeft wellicht een aantal timers, deze moet je op het begin instellen. Deze hebben verder weinig invloed op je verdere programma, dus wanneer zo een timer loopt kun je gewoon door gaan in je programma.

een interrupt is iets wat het programma onderbreekt, maakt niet uit wat er in het hoofdprogramma staat.

je moet het denk ik als volgt programmeren:

1) Het programma moet zich volledig concentreren op de uitgang puls. Dus het programma berekent hoe lang deze moet zijn, duty cycle e.d.

2) Waneer de ingangs puls van status verandert moet er een interrupt worden geactiveerd. Deze activeert op zijn tijd een timer. Na interrupt gewoon terug naar hoofdprogramma.

3) wanneer ingang puls opnieuw veranderd zal je weer een interrupt krijgen, maar deze moet niets afhandelen.

4 wanneer je een 3de keer een interrupt krijgt dan moet je de timer stoppen. De waarde moet je ergens opslaan in een variabele. Deze waarde geeft de tijd weer van de puls. Dan de timer resetten, en terug keren naar je programma.

5) ga naar stap 1




Ik ben zelf niet thuis op timers en interupts, maar zou zou ik het in grote lijnen doen.

Hopelijk heb je er iets aan

MVG

Ojeke
High-Voltage

quote:
Op 18 augustus 2008 22:43:02 schreef Fernandez:
Als je een interrupt start, dan stopt het hoofd programma toch?

Betekend dit dan dat of de periode tijd meting een deel mist? Omdat de pic bezig is met het pulsout commando?

Je hoofdprogramma steekt toch niets uit zolang er geen puls is geweest??

Je hoofdprogramma laat je constant scannen op een vlagje. Dat vlagje is in het begin laag. Je stelt je registers in dat er een interrupt moet plaatsvinden bij een PORTB change event. De eerste keer dat de interrupt plaatsvindt activeer je timer0 of timer1 (afhankelijk van de nauwkeurigheid die je wil bereiken). Dit activeren komt neer op de timer resetten, hij blijft constant lopen. Bij de volgende interrupt lees je de timer uit én zet je je vlagje op hoog. (Vergeet niet op het einde van je interruptroutine een bitje te resetten in je INTCON reg, anders gaat hij niet meer interrupten). Vervolgens ziet je hoofdprogramma dat het vlagje hoog staat, deze voert dan een deel uit een if routine uit en gaat de lengte van de uitgangspuls berekenen. Vervolgens wordt de uitgang hoog gemaakt, je stelt een delay in van de berekende tijd en daarna maak je je uitgang weer laag. Ten slotte zet je je vlagje trug op laag en tada het systeem is weer "geladen" voor de volgende puls.

Concrete registers:
OPTION --> Timer0 source + prescaler instellen
INTCON --> Global, peripheral en PortB interrupts inschakelen


Edit:
Kies je prescaler van Timer0 zodanig dat hij niet overloopt, want als hij overloopt ga je natuurlijk verkeerde waardes interpreteren. Dan lees je bv 32 uit, terwijl het eigenlijk 287 had moeten zijn.
Je zou eventueel ook een interrupt op Timer0 kunnen zetten en dan softwarematig een postscaler programmeren, want een tijd van 1 sec is best lang!!

Edit2:
Een andere manier om de tijd te meten is een blokgolf insturen met een periode van 100µs, op de Timer1 counter ingang. Zo kan je tot 6.5 seconden meten.
[Bericht gewijzigd door High-Voltage op 19 augustus 2008 16:47:16]
Het probleem bij een maatschappelijke samenleving is dat je geen "normale" uitzondering kan zijn...
Fernandez

@ high voltage dat is precies zoals ik in mijn hoofd heb!

Er zitten dus timers in de pic, die doorblijven lopen als de pic ergens anders mee bezig is.

Heb jij nog een tip, waar ik info kan vinden liefst met wat (probeer) voorbeelden, waarin wordt uitgelegd hoe de Option en Intconn registers zijn aan te sturen met picbasic? Het blijkt vrij lastig om iets te vinden hierover.
[Bericht gewijzigd door Fernandez op 20 augustus 2008 09:59:53]
High-Voltage

Je schrijft gewoon rechtstreeks naar de registers.
Bv:
code:
option_reg = %11001001
intcon = %00000000

Als ik me nog goed herinner is dat Timer0 die ingesteld staat om te interrupten met een préscaler van 1:4 of geen prescaler. Weet het niet meer van buiten.
De juiste betekenis van iedere bit zoek je op in de datasheet!
Zoeken, lezen, proberen, evalueren en bijsturen
Zo kom je er het snelste achter en begrijp je er uiteindelijk het meeste van!! Het heeft ook een tijdje geduurd eer ik timers en interrupts door had, maar als je één keer het systeem begrijpt dan kan je zonder veel problemen gebruik maken van alle andere peripheral modules zoals PWM en UART... Gewoon registers instellen en de rest gebeurt normaal gezien vanzelf... Natuurlijk wel je interrupts afvangen!
Het probleem bij een maatschappelijke samenleving is dat je geen "normale" uitzondering kan zijn...
Zoeken in topic