mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer beim LPC2132


Autor: znil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
hab mal eine Frage zu Timern. Arbeite mit einem LPC2132 und programmiere 
in C.Ich lege ein 512Hz Rechtecksignal mit einem Signalgenerator an den 
CAP 1.0 PIN des Prozessors an. Ich will jetzt einfach nachmessen ob 
tatsächlich 512Hz anliegen. Wie mache ich das am besten? Ist es möglich 
den timer bei der ersten steigenden Flanke zu starten und bei der 
nächsten steigenden Flanke anzuhalten und anschließend die Differenz zu 
bilden?Wenn ja, wie mache ich das?
danke schonmal für die Antworten...

Autor: Jansus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe sowas mal folgendermaßen realisiert.
Bei der steigenden Flanke, die Du mit einem external Interrupt erkennst, 
startest Du einen Timer, den Du beim nächsten Interrupt (nächste 
steigende Flanke) wieder abstellst. Dann rechnest Du in µs, ms oder s um 
und nimmst den Kehrwert.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timer-Interrupt ist möglich, aber etwas ungenau weil die unbekannte 
Interrupt-Latenz mitmischt. Dank umfangreicher Capture-Möglichkeiten der 
LPC2000 unnötig.

Dabei wird der Timer nicht durch das Signal gestartet, sondern läuft 
dauerhaft durch. Bei eine wählbaren Flanke am Eingang wird vom Timer 
selbst (!) der aktuelle Wert im Capture-Register gespeichert und ein 
Interrupt ausgelöst. Die Differenz zweier solcherart erfassten Werte ist 
die Zeit zwischen den Flanken. Exakt, quarzgenau, Auflösung bis 17ns.

Autor: znil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
irgendwie will das bei mir nicht klappen...hier mal der quellcode. 
findet jemand einen fehler?

  PINSEL0 |= 0x200000;
  TIMER1_TCR = 0x01;  // aktiviert Timer counter
  TIMER1_TC = 00;
  TIMER1_CCR = 0x01;  // rising edge on CAP 1.0 ladet CRO Register
  printf("Registerinhalt CR0 %lx\n\r", TIMER1_CR0);

das ist jetzt nur die aktivierung des timers und der erste wert soll 
ausgegeben werden. der timer läuft also los und bei einer steigenden 
flanke an CAP1.0 soll der wert ausgegeben werden...ist das so korrekt?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, zaubern kann er (noch) nicht, Glaskugelraten ist Forenmitgliedern 
vorbehalten. Wirst schon auf das Capture-Event warten müssen bevor im 
entsprechenden Register was dazu drinsteht.

Autor: znil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry wenn ich mich bisschen blöd anstelle aber ich vertehs grad 
nicht...wie kann ich auf das event warten?
...TIMER1_CCR = 0x01;  ...sagt mir doch, dass sobald ein event an CAP1.0 
auftaucht der wert des TC Registers in das CR0 Register geschrieben 
wird?!vielleicht hat ja auch jemand ein Beispiel dazu?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
znil wrote:

> ...TIMER1_CCR = 0x01;  ...sagt mir doch, dass sobald ein event an CAP1.0
> auftaucht der wert des TC Registers in das CR0 Register geschrieben
> wird?!

Ja. Aber wenn du es wie oben unmittelbar nach dem Einstellen des Timers 
ausliest, steht da noch nichts drin.

Autor: znil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja schon...das ist mir klar...wenn ich nun eine printf() Anweisung 
dazwischen setze steht etwas im Register drin...aber das ist doch nicht 
Sinn der Sache?! Wie mache ich das besser?

Autor: znil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mein nächstes problem wäre dann:
Wie weiß ich, dass ich beim zweiten mal genau die zweite flanke treffe 
und nicht die dritte oder irgendeine andere?daher weiß ich dann ja nicht 
welche differenz ich bilde und daher auch nicht wie lange ein Takt 
dauert...
wäre um sinnvolle antworten sehr dankbar...;)

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob es eine kluge Wahl war, den Einstieg in die Programmierung von 
Microcontrollern ausgerechnet mit LPC2000 zu machen? Für AVRs gibts hier 
recht gute Einführungstexte, bei LPC2000 wird i.A. eine gewisse 
Grundkenntnis vorausgesetzt.

Jedenfalls ist der sinnvollste Ansatz, das Cature-Event als Interrupt zu 
nutzen und den Capture-Wert folglich im Interrupt auszulesen. Da geht 
normalerweise nichts verloren.

Dass Interrupts auf LPC2000 je nach Programmierumgebung nicht unbedingt 
trivial sind, steh auf einem anderen Blatt. Es sollte jedoch auch 
möglich sein, dass Interrupt-Flag vom Capture-Event direkt abzufragen.

Autor: znil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte keine andere Wahl...;)okey dann versuche ich das jetzt mal so 
zu realiseren...dürfte ja eigentlich nicht so schwer sein...aber doch 
nochmal eine frage:
Muss ich denn das Capture event unbedingt als interrupt nutzen?soweit 
ich im datenblatt gelesen habe gibt es doch auch die möglichkeit bei 
einem event einfach den TC Wert in das CR0 Register zu laden...damit 
hätte ich doch meinen wert bei der ersten Flanke. was ich dann eben nur 
nicht verstehe ist, wie ich den wert bei der zweiten flanke erhalte?das 
müsste doch eigentlich recht simpel funktionieren..., oder?!
vielen dank nochmal für die antworten

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
znil wrote:

> ich im datenblatt gelesen habe gibt es doch auch die möglichkeit bei
> einem event einfach den TC Wert in das CR0 Register zu laden...

Nein, so funktioniert das nicht. Das machst nicht du, sondern der Timer. 
Deine Aufgabe ist es, den Wert aus CR0 wieder rauszuholen.

Ohne Interrupts, per Abfrage:
  t0 = CR0;
  while (CR0 == t0)
     ;
  t1 = CR0;
  t = t1 - t0;

Autor: znil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okey das ist mir jetzt soweit klar. ich vertehe aber immer noch nicht, 
wie ich den zweiten wert bei der nächsten flanke erhalte?wie macht man 
das?hier mal noch der quellcode, vielleicht entdeckt noch jemand einen 
Fehler...danke schonmal

 TIMER1_TCR = 0x01;  // aktiviert Timer counter
 PINSEL0 |= 0x200000;  // P0.10 as CAP 1.0
 TIMER1_CCR = 0x01;  // rising edge on CAP 1.0 ladet CRO Register
  start_value = TIMER1_CR0;
  while(TIMER1_CR0 == start_value);
  end_value = TIMER1_CR0;
  difference = end_value - start_value;
  printf("Zeitdifferenz %li\n\r", difference);

Autor: znil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat niemand eine idee? ich komme einfach nicht weiter....

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.