R8C13 TimerC Input Capture und Output Compare simultran mögl

Postby sepp2gl » Sat Jan 02, 2010 12:00 am

Hallo Forum,
ich habe da ein Problem mit der gleichzeitigen Anwendung der Input-Capture UND der Output-Compare Funktionen des R8C-TimerC.
Voran schicken möchte ich, dass ich das R8C-Hardware-Manual kenne und intensiv benutze. Die Fehlersuche dauert nun schon einige Zeit. Dabei sind natürlich auch einige eigene Fehler zutage getreten. Ich denke aber, dass ich den TimerC und seine Funktionen soweit verstanden habe (Irrtümer nicht ausgeschlossen).

Die Aufgabenstellung:
es soll mit dem R8C ein Multifunktions-Generator erstellt werden, der auf Basis eines Eingangs-Rechtecksignals mit variabler Frequenz und Tastverhältnis mehrere Signale erzeugt, die mit dem Eingangssignal in einer definerten Phasenbeziehung stehen. Diese Phasenbeziehung kann sich von Periode zu Periode ändern. Man kann von einem "Position-synchronized Pulse"-Generator sprechen. Mache Zeitgenossen sprechen auch von einer Kennfeld-Zündung für Verbrennungsmotoren. Der R8C schien mir hierfür gut geeignet, da er über genau die Anzahl I/O verfügt die ich benötige. Er ist halt so schön klein.

Der Lösungsansatz:
Das Rechtecksignal soll über den TCin-Eingang für jede Flanke einen Capture-Interrupt auslösen, der die Pulsdauer misst. Mögliche Überläufe des TimerC werden über den TimerC-Interrupt erfasst und berücksichtigt.
Die synchronisierten Ausgabesignale werden nicht direkt über die Compare 1 Hardware gesteuert (dazu sind es zu viele) sondern über die entsprechende Compare-Interraupt Routine "zu Fuss" gesteuert.
Da die Compare Funktion leider nur einen Interrupt pro Timerdurchlauf erzeugt, muss der TimerC bei jeden Compare-Ereignis automatisch zurückgesetzt werden (TCC12=1), was natürlich in der Capture_Routine berücksichtigt werden muss. Außerdem soll der nächste Compare-Event in der aktuell laufenden Compare Routine eingeleitet werden.
Einen Registerdump des R8C kann ich bei Bedarf schicken; von der Übersendung der C-Quellen möchte ich absehen, da zu kompliziert.

Das Problem:
Obwohl alle Interrupt-Routinen korrekt zu laufen scheinen (diverse semantischen Unschärfen habe ich bereits behoben), werden die Pulse nicht wie gewünscht ausgegeben. Das Tracen von Interrupt-Programmen für harte Echtzeit ist auch mit der HEW relativ schwierig, das Problem sehr schwer einzukreisen. Ich habe nur ein 2-kanal Oszilloskop ohne Speicher. Ich zweifle langsam, ob der R8C die richtige Wahl für diese Aufgabe war.

Die Fragen:
1. Kann ich die Capture-Funktion überhaupt gemeinsam mit der Compare1-Funktion nutzen?
2. Zu welchen Zeitpunkten werden neue Compare-Werte im TM1-Register verwendet? Ich trage während jeder Compare Interrupt Routine einen neuen Zielwert für den nächsten Compare-Interrupt in das TM1 ein. Geht das so?
3. Wie würde es grundsätzlich funktionieren? Eine Prosabeschreibung würde mir reichen.

Ich weiss, die Problembeschreibung ist relativ aufwendig und möglicherweise schwer zu verstehen. Ich bitte trotzdem um eine kompetente Beantwortung. Vielleicht hat ja schon jemand ähnliche Erfahrungen gesammelt oder besser schon gelöst.

Vielen Dank im Voraus,
sepp2gl
sepp2gl
 
Posts: 31
Joined: Fri Jan 03, 2014 1:50 pm

Postby frankl » Mon Jan 18, 2010 12:00 am

Es ist möglich Input Capture und Output Compare parallel zu benutzen. Aber wenn Du TC mit automatischem Reset durchlaufen lässt wird der neue Compare-Wert nicht direkt übernommen. Der Compare-Wert wird erst beim nächsten Compare 1 Match übernommen. Du bekommst also eine Verzögerung von 1 Periode in Dein Ausgangssignal.
frankl
 
Posts: 125
Joined: Thu Jan 02, 2014 10:42 am

Postby sepp2gl » Mon Jan 18, 2010 12:00 am

Hallo FrankL,
Eine Verzögerung von einer (TimerC-)Periode ist nicht akzeptabel. Das würde mein Vorhaben zumindest mit dem R8C beenden, da das erzeugte Signal einen falsdchen zeitlichen Bezug zum "gecapturten" Signal hätte.
Du schreibst: "Aber wenn Du TC mit automatischem Reset durchlaufen lässt, wird der neue Compare-Wert nicht direkt übernommen. Der Compare-Wert wird erst beim nächsten Compare 1 Match übernommen."
Wo steht das im Hardware-Manual vom R8C? Ich habe das nirgends so deutlich gelesen.
Interpretiere ich Deine Aussage richtig, dass neue Compare-Werte SOFORT übernommen werden, wenn ich KEINEN Auto-Reset verwende?
Gruß, sepp2gl
sepp2gl
 
Posts: 31
Joined: Fri Jan 03, 2014 1:50 pm

Postby frankl » Tue Jan 19, 2010 12:00 am

Man kann es aus der Tabelle 12.14 in der zeile "Write to timer" herauslesen. Da steht wenn TCC00=1 und TCC12=1 (was bei dir der Fall ist) wird der Compare-Wert geschrieben wenn ein Compare Match auftritt.

.....
Values written to TM0 register and TM1 register are stored in compare register at the
following timings:
- When TM0 and TM1 registers are written if TCC00 bit is “0” (count stop)
- When counter overflows if TCC00 bit is “1” (in counting) and TCC12 bit in TCC1 register is “0” (free-run)
- When compare 1 matches counter if TCC00 bit is “1” and TCC12 bit is “1” (set TC register to “000016” at compare 1 match)


Wenn Du also nacheinander auf 2 unterschiedliche Werte einen CompareMatch generieren willst muss der zweite Wert geschrieben sein bevor der erste Compare Match aufgetreten ist.
Die Alternative ist den TC kurz anzuhalten und neu zu starten.
frankl
 
Posts: 125
Joined: Thu Jan 02, 2014 10:42 am

Postby sepp2gl » Sun Apr 11, 2010 12:00 am

Hallo FrankL,
Es hat etwas gedauert, bis ich wieder Zeit und Elan auf dieses Problem verwenden konnte.
Dein Tip war gut: Mit einem Stoppen des TimerC lassen sich die Signale zumindest soweit wie gewünscht generieren, dass ich auch noch ein paar weitere "Software-Unschärfen" erkennen und beheben konnte. Dafür vielen Dank.
Dennoch habe ich bei einigen Frequenzen einen teilweise großen Jitter, den ich zum Teil auf das Stoppen des TimerC zurückführe. Ich werde daher als nächstes Deinen zweiten Vorschlag realisieren.
Schema:
1. TimerC stoppen
2. 1. Comparewert schreiben
3. TimerC starten
4. Sofort 2. Comparewert schreiben (natürlich bevor der erste Wert mit TimerC übereinstimmt)
5. alle folgenden Comparewerte werden in den Compare-Interrupt Routinen "nachgeladen".

Nochmals Danke, sepp2gl
sepp2gl
 
Posts: 31
Joined: Fri Jan 03, 2014 1:50 pm


Return to Das R8C-Projekt

Who is online

Users browsing this forum: No registered users and 2 guests