Forum: Mikrocontroller und Digitale Elektronik Mega8 Timer1 Config in eigener ISR umstellen


von Jasson J. (jasson)


Lesenswert?

Hallo,

ich wollte mal hören, ob folgendes einer von euch schon mal versuch hat:

ich messe von einem Puls-Pausen-Signal die aktiven Level, sinngemäß mit 
dem ICP-Interrupt. Dieses Signal hat die Konvention, dass nach der Serie 
eine lange Pause für den Lock On kommt. In dieser Pause muss ich selbst 
einen Puls über den Timer1 ausgeben.
Da noch andere Dinge laufen, muss ich  am Ende der Serie den Timer noch 
in der ICP ISR auf "Ausgang" schalten, weil ich nicht deterministisch 
weiß, wann ich wieder wo im Main bin.

Und das klappt absolut nicht. Was geht ist, den Timer auf 
Match-Interrupte zu setzten und einen Pin per Software zu 
setzten/löschen. Dabei ist das setzten nicht dramatisch, aber das 
löschen MUSS per Hardware gehen.

Ich habe so ziemlich alles versucht:

1.) Sämtliche Register des Timer löschen und das 2 mal hintereinander 
um eventuell zwingende Reihenfolgen abzudecken. Dann komplett neu 
initialisiert.

2.) Ich habe auch versucht entweder TCNT1 direkt auf "0" zu setzten oder 
auf TOP - 1 um ihn den Überlauf machen zu lassen und eventuell damit 
verbundene Register Updates.

3.) Ich habe alle sinnvollen Modi versucht, um irgendwie an einen 
Compare Match zu kommen.  Fast PWM mit Top = OCR1A/ICR; Phase Correct, 
Phase and Frequency correct.

Mir gehts vor allem um die Frage, ob jemand schon mal so ein Problem 
hatte,am Ausgang einer ISR keinen Output Modi definieren zu können.


Um es noch zu spezifizieren:
Ich messe ein RC Summensignal mit dem ICP aus. In der langen inaktiven 
Phase muss ich noch einen Puls für das Lenkservo erzeugen.
ch muss das Lenksignal durch den Controller schleifen, weil mein Buggy 
auch wahlweise nach GPS fährt und ich das am Sender umschalten kann.

viele Grüße,
Jasson

von Stefan E. (sternst)


Lesenswert?

Vermutlich hast du nicht daran gedacht, dass beim "Verbinden" des Pins 
mit dem Timer der Timer interne Zustand auf den Pin geschaltet wird, und 
nicht etwa ein per PORT-Register eingestellter Zustand übernommen wird.

von Jasson J. (jasson)


Lesenswert?

Hatte ich auch "abgedeckt". Eine Variante, war den Timer in Fast PWM 
Mode zu seztzen, TCNT1 auf "kurz vor Überlauf" damit dann am Bottom der 
Pin high geschltet wird.

Aber da ist auch etwas, das ich ehrlicherweise nicht richtig verstehe. 
Manche Modi machen das Update der OCR Reister bei Bottom und andere bei 
Top. Aber Top und Bottom sind ja im grunde nur wenige Ticks von einander 
entfernt (außer bei den Frequency corrct Modi). Ich habe irgendwie 
Probleme, bei dem, was mir mache Diagramme sagen - eben zum Beispiel bei 
Fast PWM.

von Stefan E. (sternst)


Lesenswert?

Pin nicht auf Ausgang geschaltet?

von Jasson J. (jasson)


Lesenswert?

Ja habe ich auch gemacht...
mal schauen, was ich noch mache^^

von STK500-Besitzer (Gast)


Lesenswert?

Das Servo hängt mit am IC-Pin?

von Jasson J. (jasson)


Lesenswert?

Ne ne, der ICP Pin und die Pins für den Outputcompare sind ja nicht die 
selben.

von STK500-Besitzer (Gast)


Angehängte Dateien:

Lesenswert?

Jasson JFK schrieb:
> Ne ne, der ICP Pin und die Pins für den Outputcompare sind ja nicht die
> selben.

Dachte ich mir schon.
Ich häng mal ein Programm an, das ich vor ein paar Jahren an einem 
schönen Tag zusammengekloppt habe.
Es ist zwar für den ATmega162, aber es funktioniert.
Den Timer-Modus sollte man noch in den FastPWM-Mode änderen, da der 
Controller sich auch um die OCR-Ausgänge kümmert.

von Jasson J. (jasson)


Lesenswert?

Hi Besitzer,

du hast das ja wie ich im Moment auch darüber gelöst in den Match ISR 
die Pins zurückzusetzten. Das Ding ist, ich muss es per Hardware machen 
weil:

Ich habe wie irgendwo oben steht auf nem alten Buggy eine GPS Sache 
laufen, um einfach Punkte anzufahren. Dazu wird aus der Fahrtrichtung 
und deren Kurs über Grund eine Differenz zum Zielkurs ausgerechnet, ein 
bisschen dran rum skaliert und auf den Servo gegeben. In anderen Threads 
bin ich dabei einen Scheduler einzurichten - soll heißen, ich versuche 
es^^ - um die RC Sachen und GPS Sachen zu trennen. Außerdem will ich 
nicht mehr einfach die eben genannte Differenz an den Servo geben (was 
ja im Grunde ein P Regler ist) sondern über einen I - Regler gehen. Für 
den brauch ich eine stabile Timedomain, z.B. die ISR des Schedulers. 
Wenn also alles andere nur noch abhängig von Flags durch den Scheduler 
zum Zug kommt, hänge ich an dessen zeitlicher Granularität, was ich mir 
für den Servo nicht leisten kann. Daher muss der Pin per Hardware 
zurückgesetzt werden.

Aber natürlich dennoch danke, für die Posts :-)

von STK500-Besitzer (Gast)


Lesenswert?

Wie gesagt, das Programm habe ich aus einer Laune heraus gebastelt. 
Optimal ist es nicht nicht (ging um die Auswertung von Multiprop-Modulen 
von Robbe/Futaba mit dem Ergebnis, dass es Unterschiede zwischen der F14 
und der FC16 gibt...)
Welchen Timer-Modus benutzt du denn?

von Jasson J. (jasson)


Lesenswert?

tja, villeicht muss ich dann damit leben und neben dem scheduler noch 
den match interrupt zulassen...

von Peter D. (peda)


Lesenswert?

Für sowas läßt man den Timer einfach nur durchlaufen, PWM-Modies sind 
nicht geeignet.
Für die Pulsmesssung bildet man einfach die Differenz von 2 
Zeitstempeln.
Und für die Pulserzeugung setzt man einfach den nächsten Compare auf 
Compare + Pulsdauer.
Du kannst also gleichzeitig einen Puls messen (ICP1) und 2 Pulse 
erzeugen (OCR1A, OCR1B).


Peter

von Jasson J. (jasson)


Lesenswert?

... so überscheiden sich manchmal die posts.

ich habe alles was sinn macht versucht. Fast PWM mit OCR1A/ICR, 
Frequency correct und Frequency and Phase Correct. Ich habe sogar 
entgegen der Datenblattanweisung versucht den Matchoutput im Normal Mode 
zu nutzten.

jaja die F14 - die Eierlergende Wollmilchsau^^Wie viele freie Plätz hat 
die noch für schalter und so - 24? Das sind so 2er Reihen auf beiden 
Seiten oder? Ich hab noch ne MC 10 und an der hab ich auch schon kräftig 
"rum-ge-AVR´t.

von Jasson J. (jasson)


Lesenswert?

Hallo Peter,

das ist natürlich ne Idee. Da mach ich mich morgen mal dran, das zu 
durchdenken. Das schaft mein Kopf heut nicht mehr.

Firme dankt.

von Peter D. (peda)


Lesenswert?

Jasson JFK schrieb:
> Ich habe sogar
> entgegen der Datenblattanweisung versucht den Matchoutput im Normal Mode
> zu nutzten.

Wo steht das denn?
Der Normalmode ist doch dafür der einzig sinnvolle.


Peter

von Jasson J. (jasson)


Lesenswert?

Datenblatt v.Mega8 S.88 Abschnitt "Normal Mode", lezter Absatz, letzter 
Satz:
"Using the Output Compare to generate waveforms in Normal mode is not 
recommended,
since this will occupy too much of the CPU time."

Wobei es stimmt, das steht nur man sollte es nicht tun, nicht, dass es 
nicht geht.

von Peter D. (peda)


Lesenswert?

Prinzip:
1
Compareinterrupt_A:
2
if( TCCR1A.COM1A0 ){
3
  TCCR1A.COM1A0 = 0;      // clear pin on next compare
4
  OCR1A += Pulse_time;
5
}else{
6
  TCCR1A.COM1A0 = 1;      // set pin on next compare
7
  OCR1A += Pause_time;
8
}


Peter

von Jasson J. (jasson)


Lesenswert?

Hallo [@Peter]

ich habe es jetzt so gemacht, dass der Timer einfach läuft. Ich toggle 
in der ISR nur ob der nächste Interrupt durch eine fallende oder 
steigende Flanke kommt. Das Umsetzten der Pulslängen für den PWM von 
Timer2 geht auch.

Für der Servo habe ich TCCR1A auf 0b00100000 eingestellt, also clear 
OCR1B on compare match.
Müsste es so gehen? Setzte ich den Pin OCR1B händisch mittels
PORTB |= 0b00000100;?

von Peter D. (peda)


Lesenswert?

Warum willst Du es nicht so machen, wie ich es oben beschrieben habe?
Dazu ist doch die Output-Funktion des Timers da.

Den Pin in Software zu setzen, ist immer ungenau. Man kriegt einen 
Jitter duch die Interruptlatenz. Besonders, wenn gerade ein anderer 
Interrupt behandelt wird.


Peter

von Jasson J. (jasson)


Lesenswert?

Aso... ich hatte deinen Vorschlag so verstanden - alle WGM Bits auf 0 - 
weil ja für jeden anderen Modus der TOP des Timers auf eine andere Art 
bestimmt wird, sei ICR1, OCR1A oder n-Bit.

von Jasson J. (jasson)


Lesenswert?

irgendwie geht sie edit funktion gerade nicht. ich habs fast.
Danke!

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.