Forum: Mikrocontroller und Digitale Elektronik Counter Bascom


von Kederer (Gast)


Lesenswert?

Hallo

ich brauch mal eurere hilfe - ja ich hab hier schon viele themen zu 
meiner frage gelesen - nein ich hab leider noch keine passende 
information hier gefunden. - weshalb ich auch hier mein problem 
schildern möchte

es geht um drehzahlmessung

ich hab eine i2c platine mit der ich signale von einem reedkontakt 
abhole und dann eben sauber in meinem i2c-byte habe - klappt - passt.

zur ermittlung der drehzahl habe ich dann bislang die uhrzeit-funktionen 
verwendet und nach jeder sekunde bearbeitet - alls blödsinn (war ja 
meine idee) - so jetzt die erleuchtung - ich mache das mit den Timern - 
nächste erkenntnis - für Timer kommt das Signal viel zu selten um 
halbwegs was vernünftiges zu berechnen (vielleicht so 1 x / sek) - also 
dann brauchen wir einen counter -her mit dem ding - aber ich komme 
einfach nicht weiter.

im prinzip möchte ich die zeit (ich meine da jetzt tatsächlich zeit) 
zwischen zwei fallenden flanken ermitteln - und ich hab keinen blassen 
schimmer..

$regfile = "m2561def.dat"
$crystal = 16000000

Dim I2C_Eingabe as Byte

Config Timer1 = Counter , Edge = Falling
Enable Timer1 ????
On Timer1 Isr_timer1
Enable Interrupts ODER Enable Timer1 ?????

Do
    lesen i2c
    irgendwas ausgeben usw
loop

isr_timer1:
????? - da ist dann die nicht vorhandene weisheit im ganzen weg

Das einzige was ich halbwegs überrissen habe - der oder die timer laufen 
parallel zur eigentlichen loop und irgendwann (keine ahnung wann - kann 
mir das vielleicht jemand erklären) geht das ganze in die On Timer - 
Routine - und daten die dort erzeugt wurden kann ich wiederum in meiner 
loop ganz normal verarbeiten .... stimmt wenigstens das????

Frage 1 - wie bringe ich dem Dinges bei den Counter hochzuzählen wenn 
I2C_Eingabe.3 da war
Frage 2 - wo steht jetzt dann wieviel zeit vergangen ist

verwenden würde ich gerne die Timer2 und höher (16Bit) - laut Datenblatt 
hat das Teil 2 x 8bit-Timer (0 und 1) und 4 x 16Bit
toll wäre wenn jemand vielleicht das ganze sowohl für 8 und 16 bit 
versucht mir nahezubringen.

ich hoffe jetzt mal das ich keine relevanten informationen für euch 
weggelassen (schlicht - vergessen) habe und ihr mir weiterhelfen könnt -

Für euere unterstützung sag ich gleich mal jetzt DANKE

... hoffe ich langweile euch nun nicht zu sehr

von Tee (Gast)


Lesenswert?

Häng das Signal an den Int Pin (ext. Interrupt) und messe die Zeit 
zwischwen zwei Ereignissen mit einem Timer. Das ist der einzige saubere 
Weg.

von Timer (Gast)


Lesenswert?

Genau!

von hermel (Gast)


Lesenswert?

Quatsch! Timer-Compare ansehen (ICP)

Bascom...*würg*

von Weingut P. (weinbauer)


Lesenswert?

> Enable Interrupts ODER Enable Timer1

DU brauchst Beides, einmal generell Interrupts aktivieren, einmal den 
Timer selber.

Du brauchst folgendes, den Timer als Timer und nen externen Interrupt 
auf falling.
Der Timer am Besten der Auflösung wegen mit 16 Bit laufen lassen, 
Prescaller musst Du schaun wie schnell Deine Flanken kommen ...
Dann gehst Du nur noch hin und liest beim externen Interrupt-Event den 
Timer-x aus und setzt ihn wieder auf null.
Timerwert, Taktfrequenz des µC und Prescaller ergeben den Messwert in Hz 
-> nur noch umrechnen in RPM

von Peter D. (peda)


Lesenswert?

Kederer schrieb:
> für Timer kommt das Signal viel zu selten um
> halbwegs was vernünftiges zu berechnen (vielleicht so 1 x / sek)

"Vielleicht so" interessiert niemanden!
Du mußt konkrete Zahlen ermitteln (min/max), sonst ist alles Quatsch.

Kederer schrieb:
> also
> dann brauchen wir einen counter -her mit dem ding - aber ich komme
> einfach nicht weiter.

Dann nimm ne Variable als Counter.

Setze den Timerinterrupt so, daß Du für die gewünschte Auflösung 
(welche?) eine genügende Anzahl Counts erhältst.
Für 1% also >=100 Counts bei der höchsten Geschwindigkeit.


Peter

von Peter (Gast)


Lesenswert?

erstmal danke für euere antworten

ich möchte es mit einem counter machen

mein atmel2561 verfügt da über eine ganze reihe von Timern - jedoch 
können davon nur 4 als Counter verwendet werden (wenn ich das alles 
richtig verstanden habe)

so einem counter ist ja dann ein pin zugewiesen. z.B. Timer3/Counter3 
ist der pin PE7.

ich kann das signal jedoch leider nicht direkt auf den pin legen (oder 
weis zumindest nicht wie) da ich den reedkontakt über eine 
i2c-eingabekarte auslese. gibt es irgendeine möglichkeit entweder den 
counter3 direkt auf ein bit aus dem i2c-byte zu legen oder irgendeine 
elegante lösung den pin PE7 mit dem bit aus dem i2c-byte zu verbinden?

danke

von Peter D. (peda)


Lesenswert?

Peter schrieb:
> da ich den reedkontakt über eine
> i2c-eingabekarte auslese.

Wenn Du eh Software brauchst, um das Signal zu lesen, dann ist das 
zusätzliche INC Variable nur Pillepalle. Ein HW-Counter wäre Blödsinn.


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.