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
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.
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.
Ja habe ich auch gemacht... mal schauen, was ich noch mache^^
Ne ne, der ICP Pin und die Pins für den Outputcompare sind ja nicht die selben.
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.
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 :-)
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?
tja, villeicht muss ich dann damit leben und neben dem scheduler noch den match interrupt zulassen...
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
... 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.
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.
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
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.
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
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;?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.