Tæller og Tachometer med PIC16F84

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Danish to

Threaded View
En omskifter lægger et input til nul eller plus og bestemmer hermed
om systemet virker som TÆLLER eller OMDR/MIN.

Reset mener jeg er nødvendigt ved hver omskiftning for at konfigurere
interupt
til enten TÆLLER eller OMDR/MIN.

Hvordan sikrer jeg, at der med omskiftning fra tæller til omdr/min (eller
omvendt)
SAMTIDIG sker et reset af systemet ?

Mvh KS



Re: Tæller og Tachometer med PIC16F84
Hej Keld,


Quoted text here. Click to load it

Kan du ikke bare bruge samme interrupthandler til begge dele ?
(Hvad den så skal gøre ud af det, kan fx. afhænge af dit "mode selection"
input).


Quoted text here. Click to load it

Hvis du insisterer på at resette, kan du bruge samtidig bruge /MCLR, nappe
strømmen til den et øjeblik eller lade interrupthandleren aflive
watchdog'en, men det vil jeg nu mene er at overdrive :)

Er der en grund til ikke at lade den virke som både omdrejnings- og alm.
tæller _samtidigt_ og så bare skifte mellem hvad der bliver udlæst ?


--
Venlig hilsen,
Søren
We've slightly trimmed the long signature. Click to see the full one.
Re: Tæller og Tachometer med PIC16F84
Quoted text here. Click to load it
.... mmhm det er der måske noget om, men ....

ved TÆLLING forestiller jeg mig at hver puls skal interrupte systemet - for
at være sikker på at få dem alle med

ved OMDR/MIN forestillede jeg mig ......... ja, hvad forestillede jeg mig
egentlig her .....  ?

jeg skal selvfølgelig stadig sikre, at alle pulser tælles med (så skal de
hver for sig interrupte systemet - ikke ?), men der skal jo også være en
tidskonstanst med her - hvor får jeg så den fra ?
Kan man have flere interrupts konfigureret samtidigt - ét til at fange
pulserne (for at tælle og huske omdrejningerne) og ét andet interrupt til
f.eks. hvert sekund at vise 'optalte omdrejninger' og nulstille registret,
hvorefter dette register igen tælles op af det første interrupt ? Kan dette
lade sig gøre, skal omskifteren TÆLLER / OMDR pr. MIN som du siger blot
bestemme, hvilket register, der skal vises i displayet.

Men er der ikke et problem med de pulser, der måtte komme IMENS
visning/nulstilling af "OMDRprMIN"-registret foretages - hvordan sikrer jeg,
at disse tælles med også ?

Mvh KS



Re: Tæller og Tachometer med PIC16F84


Quoted text here. Click to load it

Kan du bruge samme indgang til begge dele?

Quoted text here. Click to load it

En timer i MPU'en.


Quoted text here. Click to load it

Sagtens.

jeg,

Ved at disable interrupt mens du nulstiller (det behøver ikke at tage mere
en nogle få usec at nulstille).









Re: Tæller og Tachometer med PIC16F84
Quoted text here. Click to load it

Jamen sker så NETOP ikke det, at jeg mister de pulser, der kommer medens
interruptet er disabled ?

Mvh KS



Re: Tæller og Tachometer med PIC16F84

Quoted text here. Click to load it
mere

Ikke så lang tid at interrupt er disabled mindre tid, end der er imellem
interrupts. En MPU kan normalt huske et interrupt (fordi intr flaget bliver
sat og først bliver slettet igen i intr rutinen).





Re: Tæller og Tachometer med PIC16F84
Quoted text here. Click to load it
bliver

Selvfølgelig !

Der må så vel foretages en prioritering af interruptene

Mvh KS



Re: Tæller og Tachometer med PIC16F84


Quoted text here. Click to load it

På de fleste små MPU'er er der en fast prioritet på interrupt og der udføres
normalt også kun et af gangen (dvs. intr af intr bruges sjældent).



Re: Tæller og Tachometer med PIC16F84
Hej Keld,


Quoted text here. Click to load it

Det er vist her jeg bør spørge om max.frekvensen af tællesignalet - og
max.RPM for den sags skyld.
Hvad er det egentligt til ?


Quoted text here. Click to load it

Beats me ;)
Det er bedst at måle tiden mellem to pulser og så omregne det til RPM,
evt. med løbende midling af de nn sidste pulser.


Quoted text here. Click to load it

Jo.



Timeren.



Her er lidt du bør læse:
"The interrupt control register (INTCON) records individual interrupt
requests in flag bits."
[...]
When a valid edge appears on the RB0/INT pin, the INTF bit (INTCON<1>) is
set.
[...]
An overflow (FFh ® 00h) in TMR0 will set flag bit T0IF (INTCON<2>).
[...]
An input change on PORTB<7:4> sets flag bit RBIF (INTCON<0>).
 

Quoted text here. Click to load it

Selv med 1'000'000 RPM vil du have riiiigeligt tid (med mindre du
singlestepper ;)
Og jeg tror heller ikke din event-tæller klokker så højt at processoren
får sved på panden (så havde du nok kaldt det en frekvenstæller :)

Det er nok en af de fælder de fleste falder i med begge ben, i starten af
deres processoreksperimenter. Hvis du prøver at sammenholde frekvensen af
dine ydre begivenheder med processorens instruktionstid får du nok en aha-
oplevelse :)


--
Venlig hilsen,
Søren
We've slightly trimmed the long signature. Click to see the full one.
Re: Tæller og Tachometer med PIC16F84
Quoted text here. Click to load it

En omdrejningstæller til en drejebænk - en induktiv føler i gearkassen
aftaster et tandhjul med 80 tænder - så disse pulser skal danne grundlag
for dels TÆLLING af omdrejninger og måling af hastighed ved Omdr/min.

Quoted text here. Click to load it

Lige nogle stikord til hvordan jeg måler tiden mellem pulserne


Quoted text here. Click to load it

Ja, jeg må til at nærlæse dette fra manualen

Quoted text here. Click to load it

Ja, der er stor forskel på de frekvenser - men hvori består AHA-oplevelsen ?

Mvh KS




Re: Tæller og Tachometer med PIC16F84
Hej Keld,


Quoted text here. Click to load it

Du regnede med at risikere at tabe pulser, men nu kan du vel se at du har
utallige instruktioner at gøre godt med mellem hver puls ? Det vil jeg da
kalde en aha-oplevelse (det var ikke ment som en fornærmelse på nogen måde
:)

Det er vel overdrevent højt regnet med mwx. 10'000 RPM på en drejebænk ?
Du har så 80 tænder pr. omgang ? max. 80'000 pulser pr. minut hvilket er
mindst 750µs mellem hver puls.
Med en instruktionstid på 1µs er du altså garanteret tid til min. ~750
instruktioner.

Da du måler begge dele på samme input, skal du blot lave begge beregninger
løbende (jeg går ud fra du gerne vil kunne resette tallet, for det lyder
som om du vil bruge den til spolevikling eller noget i den stil ?).


I pseudokode kan det fx. se sådan ud...

main:
  læs mode_ben                                ; det ben du vælger tæl/RPM på
  if mode_ben = 0 then
    call display(tæller)                ; opdater med tælleværdien
  else
    call display(RPM)                        ; opdater med omdrejningstallet
  end if

  læs tæller_resetben                     ; hvis du vil kunne resette
  if tæller_resetben = 0 then        ; tællerværdien kan du tage
    tæller = 0                                ; denne blok med.
    tæller_resetben = 1                ; set flaget igen via software,
  end if                                        ; så virker det som var den
                                                        ; kanttrigget.
  loop main

Int_handler:
  inc tæller                                ; (tæller++ i C) så er der talt op
  tid_ny = nuværende tidstagning        ; gem timestamp
  interval = tid_ny - tid_gammel        ; beregn intervallet mellem
                                                        ;  foregående puls og denne
  RPM = 3 / (4 * interval)                ; beregn RPM ud fra fundne interval
  tid_gammel = tid_ny                        ; opdater tid_gammel til næste
                                                        ;  iteration
  Interrupt return

Så meget behøver der ikke ligge i int-rutinen, men hvis der ikke skal
laves andet end at opdatere display og læses en tast ud over tælleriet kan
det være hip som hap.

Der skal selvfølgelig også være proceduren display() der blader den
overførte parameter ud på enkeltciffre og viser dem.


--
Venlig hilsen,
Søren
We've slightly trimmed the long signature. Click to see the full one.
Re: Tæller og Tachometer med PIC16F84
Quoted text here. Click to load it
AHA-oplevelsen er nok druknet i manglende overblik og erfaring.

Quoted text here. Click to load it
Bare fint - tak for det - det vil jeg prøve at lave !

Quoted text here. Click to load it

Det har jeg til at køre, hvor hvert ciffer står i ca. 1 mS (det er vel med
at
have dette så KORT som muligt, men dog så displayet stadig synes at lyse
stabilt - ikk' ?)

Jeg har nu valgt at holde hvert ciffer i hver sin variabel - i stedet for at
skulle
til at 'bladre cifrene frem' - er det ikke det du mener med 'bladre' ?

Mvh KS



Re: Tæller og Tachometer med PIC16F84
Hej Keld,


Quoted text here. Click to load it

Velbekomme :)


Quoted text here. Click to load it

Njaaa, så længe det skifter hurtigere end øjet kan opfatte det, så skal
det helst stå så længe som muligt. Det er en balancegang der også må
inkludere hvad der ellers er af housekeeping, men der sker nok ikke noget
ved at køre langsommere.


Quoted text here. Click to load it

Jo, men på et eller andet sted skal du jo trække dem ud fra tælleren.
(Du laver vel ikke enkeltciffer tælling med mente til næste højere ciffer
?).


--
Venlig hilsen,
Søren
We've slightly trimmed the long signature. Click to see the full one.
Re: Tæller og Tachometer med PIC16F84
Quoted text here. Click to load it
Det er da lige det jeg gør - med 'vel ikke' antyder du det er galt - hvorfor
?

Mvh KS



Re: Tæller og Tachometer med PIC16F84
Hej Keld,


Quoted text here. Click to load it

Ikke ligefrem galt, men det giver en mere logisk programstruktur at have
skidt for sig og snot for sig og det giver også en rutine der tager lige
mange clockcyckles hver gang hvis du blot incrementerer en tæller og så
fordeler tallet ud i enkeltciffre i udlæsningsrutinen.

Men... Hvis det virker for dig og giver dig bedre overblik kan du da godt
bruge metoden.


--
Venlig hilsen,
Søren
We've slightly trimmed the long signature. Click to see the full one.
Re: Tæller og Tachometer med PIC16F84
Quoted text here. Click to load it

Hvordan er't liiiige man laver sådan en tidtagning i ASM !

Kan jeg lokke dig til at compilere en lille stump, så jeg kan se ASM-koden

mvh KS



Re: Tæller og Tachometer med PIC16F84
Hej Keld,


Quoted text here. Click to load it

Sæt TMR0 i gang, og reset hver gang du har læst.


Quoted text here. Click to load it

Jeg når det ikke i aften, men lad os se hvad weekenden bringer.


--
Venlig hilsen,
Søren
We've slightly trimmed the long signature. Click to see the full one.
Re: Tæller og Tachometer med PIC16F84
Quoted text here. Click to load it

Det behøver du ikke gøre - jeg opfattede din psoudekode som om
der var en milighed for at 'aflæse et ur' svarende til det interne ur
på en pc - det med TRM0 skal jeg nok få styr på.

Mvh KS



Re: Tæller og Tachometer med PIC16F84
Hej igen,


Quoted text here. Click to load it

OK, held med det så :)


--
Venlig hilsen,
Søren
We've slightly trimmed the long signature. Click to see the full one.
Re: Tæller og Tachometer med PIC16F84
Quoted text here. Click to load it

kig på http://www.piclist.com/techref/piclist/weedfreq.htm

han har en frekvenstæller som er nem at modificere til dit behov. den
findes også i versioner hvor der bruges 4-7 7segment led displays.

Men grundlæggende er det du skal gøre følgende:

Brug en intern timer/tæller som eventcounter. når den laver overflow
så tæller du manuelt et ekstra register op og sletter dit overflow
flag.

til timing bruger du en software løkke (f.eks opdater display) og en
gang for hver t-tid læser du dine tæller-registre og så kan du se hvor
mange events/tid du har (frekvens, rpm, omd/min, km/t ...)du kan så
resette alle tæller registre og starte igen eller hvad du nu måtte
have lyst til.

hele humlen er at lade hardware tælle op og timimg i software
(hardware hvis du har en ekstra  timer der kan gøre det for dig) og så
for guds og alle andres skyld undlade at bruge interrupts da de ellers
vil ødelægge din timing. du kan heller ikke være sikker på at få et
korrekt resultat hvis du bruger interrupts. hvad hvis du er i gang med
at behandle tælleinterrupt når du får timer interrupt - eller omvendt?

bare en indspark

 - patrick

Site Timeline