Forum: Mikrocontroller und Digitale Elektronik Atmega88 Zähler


von Gulliver (Gast)


Lesenswert?

Hallo

Ich habe schon viel gelesen aber hierzu noch keine eindeutige Antwort 
gefunden.

Meine Problem:
Ich möchte eine Drehzahl messen (200 1/sec) und diese auf einem LCD 
ausgeben.

Was ich weiß:
LCD ansteuerung ist klar.
Zählvorgang (Pulse pro zb. 100ms (Timerinterrupt) zählen und dann 
verrechen)

Mein Problem:
Ich habe in ein paar projekten gesehen das die Pins AIN0/1 oder auch 
T0/1 dafür genommen wurden.
Aus dem Bauch raus hätte ich es mit einem INT0/1 gemacht.

Kann mir da jemand licht ins dunkle bringen? Bis jetzt habe ich meine 
Probleme immer Software seitig gelöst. Bei der Frequenz scheint mir das 
aber falsch.

Danke schon mal.

Gruß der Rabe

von chris (Gast)


Lesenswert?

T0/1 gehört zu einem entsprechnden Zähler und der hat denn ein 8/16bit 
breites Register in Hardware wo unabhängig von der Software Signale 
ausgewertet werden können.

Bedeutet den Zähler entsprechend vorladen/löschen und mit jedem Impuls 
am T0/1 wird +1 gezählt.

Guck ins Datenblatt S.114 dort ist der Counter erklärt.

von Karl H. (kbuchegg)


Lesenswert?

Gulliver schrieb:

> Mein Problem:
> Ich habe in ein paar projekten gesehen das die Pins AIN0/1

also den Analog-Comperator

> oder auch
> T0/1 dafür genommen wurden.

Also die Zähleingänge für die Timer

> Aus dem Bauch raus hätte ich es mit einem INT0/1 gemacht.

Auch das geht.

> Kann mir da jemand licht ins dunkle bringen? Bis jetzt habe ich meine
> Probleme immer Software seitig gelöst. Bei der Frequenz scheint mir das
> aber falsch.

Hat mit Frequenz ja/nein nichts zu tun, sondern damit, welche Pegel an 
den Pins von der eigentlichen Messschaltung ankommen

 * eignen sich die Pegel um als digitale 0/1 Pegel angesehen
   werden zu können

 * oder muss man mit dem Analogkomperator selber eine Schwelle fest-
   legen unter bzw. über der der Pegel als 0 bzw. 1 gilt

bzw. der persönlichen Vorliebe

* ist man faul und lässt das Inkrementieren eines Zahlenwertes einen
  Hardwaretimer machen (T0/T1)

* kennt man die Möglichkeiten seiner Hardware nicht bzw. ist zu
  erwarten, dass die Zahlenwerte so groß werden, dass ein 16 Bit
  Timer nicht ausreicht, dann richtet man eben einen INT0/INT1
  Interrupt ein und inkrementiert eine Variable in der ISR

von M. N. (Gast)


Lesenswert?

In die Codesammlung hattest Du schon gesehen?
Beitrag "einfache Drehzahlmessung mit ATmega88"

von Gulliver (Gast)


Lesenswert?

Ja hatte ich. daher hatte ich das mit dem AIN1 und das hatte mich 
verunsichert, da ich vorher Projekte mit T0/1 gesehen habe...

Der einfachheit halber hatte ich mich das so gedacht:
Über den INT1 Zählen und mit einem Timerinterupt auswerten.

Was bringt die Methode mit dem Analogkomparator für Vorteile?

Gruß der Rabe

von Karl H. (kbuchegg)


Lesenswert?

Gulliver schrieb:

> Was bringt die Methode mit dem Analogkomparator für Vorteile?


An irgendeiner Stelle müssen deine zu messenden Signale ja mal im Pegel 
festgenagelt werden.
Sind deine Signale schon 0V bzw. 5V, dann ist alles in Butter und du 
kannst sie direkt auf einen digitalen Eingang legen.

Sind sie es nicht, zb 0V und 0.8V, dann wirst du mit einem 
Digitaleingang Pech haben, denn sowohl 0V als auch 0.8V wertet der 
beides als logische 0.
Also muss man sich was einfallen lassen, wie man diese Pegel so 
aufbereitet, dass sie für den µC 'zählbar werden'. Dazu kann man die 
Signale natürlich mit einem Verstärker auf 0..5V anheben. Oder aber man 
programmiert sich den Analog-Komperator so, dass der seinen 
Umschaltpunkt genau zwischen 0V und 0.8V hat und so daraus eine saubere 
binäre 0 bzw. 1 macht.

Der Analogkomperator vergleicht 2 Spannungen und sagt dir welche die 
größere ist. Legst du eine der beiden Spannungen auf einen dir genehmen 
Pegel, dann kannst du den Analogkomperator (in seinen Grenzen) als 
Vergleicher nehmen, der dir sagt: Drüber oder Drunter. Und genau diese 
Information brauchst du ja um eine Flanke zu erkennen und daraus dann 
die Frequenz zu zählen.

von M. N. (Gast)


Lesenswert?

Gulliver schrieb:
> Was bringt die Methode mit dem Analogkomparator für Vorteile?

Der kann - und so wird es von mir gemacht - als Trigger für den 
T1-Capture programmiert werden und Signale ab ca. 100mVss auswerten. 
Alternativ kann man den ICP1-Eingang nehmen.

Nähere Erklärungen für die Funktion findest Du hier: 
http://www.mino-elektronik.de/fmeter/fmeter.htm

Eine andere Möglichkeit, Frequenzen/Drehzahlen mit hoher Auflösung zu 
messen, ist hier gezeigt: 
Beitrag "4-Kanal Drehzahlmessung mit ATmega88"
Für den Anfang ist aber etwas komplizierter zu verstehen, in der Praxis 
insofern 'schöner', als dass mit " -.- " auch angezeigt wird, wenn kein 
Signal anliegt.

von Gulliver (Gast)


Lesenswert?

Was ein Komparator macht, ist klar, aber danke für die Erklärung im 
bezug auf den Zähler. Bin ich nicht dahinter gestiegen.

Ich wollte eine Drehzahl mit einem  TLE4905L messen.Dieser gibt ja schon 
en Rechtecksignal aus.
Wenn ich das Schaltbild richig interpretiere, lege ich an Pin 3 meinen 
"Zähl"-Pin an (mit Pullup zu 5V), pin 2 kommt an die masse (gemeinsamm 
mit AVR) und Pin 1 bekommt nochmal 5V.

Richtig? und dann könnte ich mein Digitales Rechtecksignal mit den T0/1 
in den Counterschreiben und mit einem Timerinterupt auswerten?

Oder gibts da was einfacheres?

von M. N. (Gast)


Lesenswert?

Gulliver schrieb:
> und dann könnte ich mein Digitales Rechtecksignal mit den T0/1
> in den Counterschreiben und mit einem Timerinterupt auswerten?
>
> Oder gibts da was einfacheres?

Das Einfachste ist immer das, was man selber versteht.
Darum mache es so, wie Du meinst und wie Du es verstehst, und fange 
einfach an.

von Gulliver (Gast)


Lesenswert?

M. N. schrieb:
> Das Einfachste ist immer das, was man selber versteht.
> Darum mache es so, wie Du meinst und wie Du es verstehst, und fange
> einfach an.


Danke ;-) aber im Grunde hast du recht.

Ich blicke durch die Timer Register nicht ganz durch.
Habe mich für die Methode mit dem PIN "T1" entschieden.

Zuerst mal die Pulsrate:
12000/1-Min = 200/sec

Heißt ich kann Timer/counter0 verwenden und locker alle 200ms einen Wert 
berechnen&Counter "nullen".

So nur wie stelle ich den Timerregister richtig ein?
Bis jetzt habe ich den Timer immer nur für die PWM benutzt....

von Karl H. (kbuchegg)


Lesenswert?

Gulliver schrieb:

> So nur wie stelle ich den Timerregister richtig ein?

Du stellst den Prescaler des Timers so ein, dass er nicht vom CPU-Takt 
versorgt wird, sondern das der Timer seinen Takt vom T1 Pin bezieht.

Und schon zählt er, wenn am T1 Pin ein Puls ankommt

> Bis jetzt habe ich den Timer immer nur für die PWM benutzt....

Vielleicht mal einen Blick ins Datenblatt risikieren?
Der wichtigste Teil ist zb bei den Timern immer der Abschnitt Register 
Summary. Auf ein paar Seiten sind alle Register aufgeführt, alle Bits in 
den Registern und was sie bedeutet. Wenn mehrere Bits zusammenspielen, 
dann hat Atmel immer eine schöne Tabelle reingemacht, in der alle 
Möglichkeiten aufgelistet sind und aus der man ablesen kann, wie die 
Bitbelegung dann aussehen muss.

Wie gesagt: Dieser Abschnitt des Datenblattes sind nur ein paar Seiten. 
Es schadet nicht, die mal auf Verdacht zu studieren und sich zu merken, 
welche Funktionalität es gibt. Tut man das, dann merkt man sich "Hey, 
ich kann ja den Timer nicht nur vom CPU_Takt aus zählen lassen, sondern 
da gibt es auch eine Prescaler-Einstellung, mit der ich einen externen 
Takt von einem Pin auf den Timer legen kann". Man muss sich nicht die 
Details merken - aber es hilft sehr, wenn man im Hintergrund speichert: 
Timer extern takten geht, gemacht wird es über die Prescaler Bits (die 
ja im weitesten Sinne regeln, von wo der Timer seinen Zähltakt bezieht). 
Und wenn man das dann braucht, dann erinnert man sich daran und liest im 
Datenblatt die Details nach.

Auch Timer bestehen aus sowas wie funktionalen Baugruppen. Für alles was 
sich um den Themenkreis "wie schnell und warum zählt der Timer" dreht, 
ist die Baugruppe "Prescaler" zuständig.

von Gulliver (Gast)


Lesenswert?

Ja ich guck ins datenblatt, versehe es aber nicht was ich alles brauch.

Zuerstmal würde ich sagen das CS00/01/02 auf 1 gesetzt werden müssen, da 
dann der Timer auf externe steigende Flanke steht.

COM0B1 COM0B0 auf 0, da keine PWM (richtig?)

also: TCCR0 = (1<<CS00);(1<<CS01);(1<<CS02); //Extern & steigende Flanke

mehr hab ich noch nicht verstanden. Nach dem gefühl würde ich sagen es 
fehlt noch was. Die Zuordnung zum Pin T0 steht ja schon über die CS00-2 
einstellung. Ohne ein Overflow bit fängt der Counter einfach wieder bei 
0 an?

da verstehe ich die Registererklärung im Datenblatt nicht mehr...
Ich machs mir sicher nicht leicht. Bitte helft mir weiter.

von Karl H. (kbuchegg)


Lesenswert?

Gulliver schrieb:
> Ja ich guck ins datenblatt, versehe es aber nicht was ich alles brauch.
>
> Zuerstmal würde ich sagen das CS00/01/02 auf 1 gesetzt werden müssen, da
> dann der Timer auf externe steigende Flanke steht.

Bingo

>
> COM0B1 COM0B0 auf 0, da keine PWM (richtig?)

Die COM Bits regeln, wie der Timer eine AUSGANGSLEITUNG behandelt!
Was also der Timer, wenn überhaupt, mit einem Pin tun soll, der auf 
Ausgang geschaltet ist.
Hast du den Fall?

Nein.
Also lässt du das alles auf 0 bzw. auf dem, auf dem buchstäblich nichts 
passiert.

Brauchst du einen PWM Modus?
Sprich: Soll der Timer mit einem Ausgangspin wackeln?
Nein. Du willst einfach nur dass der Zähler vor sich hinzählt. Also 
stink normaler Zählmodus.

> also: TCCR0 = (1<<CS00);(1<<CS01);(1<<CS02); //Extern & steigende Flanke

Was sollen die ; da drinnen?


> mehr hab ich noch nicht verstanden. Nach dem gefühl würde ich sagen es
> fehlt noch was.

Was soll da noch fehlen?
Du willst das der Timer Pulse zählt. Und anstatt, dass er die über den 
Quarz vom CPU-Takt bekommt, speist du ihm die extern ein.
Machs doch nicht so kompliziert.


> Die Zuordnung zum Pin T0 steht ja schon über die CS00-2
> einstellung. Ohne ein Overflow bit fängt der Counter einfach wieder bei
> 0 an?

Was für ein Overflow Bit?
Wenn der Timer hochgezählt hat, dass ihm die Bits ausgehen, dann gibt es 
einen Overflow. So wie immer.

Mit beispielsweise 8 Bit kann man nun mal nur bis 255 zählen. Noch 1 
dazu und es setzt einen Overflow. Das hat doch nichts damit zu tun WARUM 
der Timer 1 zu seinem Timerregister dazuzählt. Dem 8-Bit Zählregister 
ist es doch völlig piep-schnurz-egal, wo dieser eine Puls herkommt. Ob 
der vom Quarztakt (CPU-Takt) abgeleitet ist, oder ob an einem externen 
Pin ein Puls eingetrudelt ist, oder ob grade Hochwasser ist interessiert 
das 8-Bit Zählregister nicht.


  CPU-Takt   +------------+  Zählpuls   +---------------------+
    -------> | Prescaler  |------------>|  8 Bit Zählregister |
             |            |             +---------------------+
  T0-Pin     |            |               |             |
    -------> |            |               V             v
             +------------+            Overflow     Compare Matches

Der Prescaler wählt eine der Quellen aus, die er aufs Zählregister 
aufschaltet. Im Falle des CPU-Taktes kann er da noch diverse 
Teilerstufen zwischenschalten, so dass dieser Takt heruntergeteilt wird. 
Im Falle des T0 Pins kann er das nicht. Mit den CS-Bits wählt man aus, 
was genau die Prescaler-Komponente machen soll. Welcher Eingang und wenn 
möglich - wie weit runtergeteilt werden soll.

Mehr ist das doch nicht!
Mach nicht mehr draus, als es ist.


Natürlich stehen dir dann selbstverständlich wieder alle Modi zur 
Verfügung, die der Timer beherrscht. Denn die hängen ja nicht davon ab, 
wie der Timer getaktet wird. Diese Modi werten diverse Vergleiche mit 
den Compare Match Registern, COM-Flags, etc. aus und leiten dann davon 
ab, was mit Pins passieren soll.
Aber all das willst du ja gar nicht. Du willst doch einfach nur den 
einfachsten, banalsten, primitivsten Timer-Modus, den es gibt: Mit jedem 
Taktpuls den das Zählregister an seinem Eingang sieht, zählt es 1 
weiter. Den Timer Modus 0, um genau zu sein.


> Ich machs mir sicher nicht leicht. Bitte helft mir weiter.

Du denkst zu kompliziert. Das ganze ist viel einfacher und primitiver 
als du annimmst.

von Route_66 H. (route_66)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Aber all das willst du ja gar nicht. Du willst doch einfach nur den
>
> einfachsten, banalsten, primitivsten Timer-Modus, den es gibt: Mit jedem
>
> Taktpuls den das Zählregister an seinem Eingang sieht, zählt es 1
>
> weiter. Den Timer Modus 0, um genau zu sein.

Hallo!
Ich persönlich würde Ihm aber das Kennenlernen der Capture-Funktion 
empfehlen. Bei niedrigen Frequenzen, wie es Drehzahlen meist sind, ist 
die Messung der Impulsabstände oft der bessere Weg.

von M. N. (Gast)


Lesenswert?

Route 66 schrieb:
> Ich persönlich würde Ihm aber das Kennenlernen der Capture-Funktion
> empfehlen.

Das hatte ich ja insgeheim versucht, aber dazu scheint es noch viel zu 
früh.

> Bei niedrigen Frequenzen, wie es Drehzahlen meist sind, ist
> die Messung der Impulsabstände oft der bessere Weg.

Das ist IMMER der bessere Weg, wenn man erst einmal weiß, wo es lang 
geht :-)

von Karl H. (kbuchegg)


Lesenswert?

Route 66 schrieb:

> Ich persönlich würde Ihm aber das Kennenlernen der Capture-Funktion
> empfehlen.

Lass ihn erst mal verstehen, wie primtiv so ein Timer eigentlich ist.

Bisher hat er ja einfach nur irgendwoher einen PWM Modus in sein 
Programm einkopiert, ohne zu wissen was er da eigentlich tut oder wie 
das funktioniert.

Nicht falsch verstehen: Ich geb dir ja grundsätzlich recht. Aber der TO 
muss jetzt erst mal gehen lernen, ehe man sich über die Vor und 
Nachteile diverser Laufschuhe unterhält.
Im Moment ist für ihn das alles noch 'schwarze Magie'. Er muss jetzt 
erst mal begreifen, dass ein Timer einfach nur eine Hardware-Einheit 
ist, die vor sich hinzählt UND die mit angeflanschten Zusatzmodulen ein 
paar Dinge autonom erledigen kann. Aber prinzipiell zählt die einfach 
nur vor sich hin. Solange er das nicht hat, hat alles weitere keinen 
Sinn.

FAQ: Timer

von Gulliver (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Route 66 schrieb:
>
>> Ich persönlich würde Ihm aber das Kennenlernen der Capture-Funktion
>> empfehlen.
>
> Lass ihn erst mal verstehen, wie primtiv so ein Timer eigentlich ist.
>
> Bisher hat er ja einfach nur irgendwoher einen PWM Modus in sein
> Programm einkopiert, ohne zu wissen was er da eigentlich tut oder wie
> das funktioniert.

So ungefähr, ja.

>
> Nicht falsch verstehen: Ich geb dir ja grundsätzlich recht. Aber der TO
> muss jetzt erst mal gehen lernen, ehe man sich über die Vor und
> Nachteile diverser Laufschuhe unterhält.
> Im Moment ist für ihn das alles noch 'schwarze Magie'. Er muss jetzt
> erst mal begreifen, dass ein Timer einfach nur eine Hardware-Einheit
> ist, die vor sich hinzählt UND die mit angeflanschten Zusatzmodulen ein
> paar Dinge autonom erledigen kann. Aber prinzipiell zählt die einfach
> nur vor sich hin. Solange er das nicht hat, hat alles weitere keinen
> Sinn.
>


Zuerst einmal vielen Dank für die ausführliche Erklärung und die damit 
verbundene Zeit. Und ja du hast recht, ich habe viel zu kompliziert 
gedacht.

Ich fasse banal zusammen: Ein Counter ist ein Timer mit externem Takt.
Und als Zusatz habe ich jetzt auch die Anderen Einstellungen verstanden.
klar da wirds ggf noch Probleme geben in der Praxsis, bzw Stolpersteine 
aber das wird dann schon.

> FAQ: Timer
Super!!! Kannte ich nicht

Das wissen werde ich jetzt zuerst mal anwenden.


Kann jetzt noch wer ein kurzes Wort zur Capture Funktion sagen?

Gruß der Rabe

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.