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
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.
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
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
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.
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.
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?
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.
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....
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.
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.
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.
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.
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 :-)
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
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