Hallo,
folgendes Problem:
Ich habe ein Array mit 10 Einträgen in dem Bitmuster stehen z.B.:
00010011, etc. Diese entsprechen zu einem Zeitpunkt dem Zustand eines
Ports der als Ausgang geschaltet ist. Es soll ein Impulsgeber
realisiert werden, wobei es vorkommen kann, dass mehrere Pins
gleichzeitig den Zustand ändern. Weiterhin habe ich ein Array, ebenfalls
10 Werte, in dem ich die Abstände zwischen den Zeitpunkten als Anzahl
der "NOPs" festhalte.
"Abgespult" wird die Sequenz dann mittels einem CTC Timer, der die
Grundfrequenz der Sequenz regelt und dann mittels Interrupt alle X Herz
folgenden Code der Sequenz durchläuft:
1 | while(1){
|
2 | if (interrupt = 1){
|
3 | interrupt=0;
|
4 | for (i=0; i<10; i++){
|
5 | PORTX=Bitmuster[i];
|
6 | for (n=1; n<=Abstand[i];n++){
|
7 | asm volatile("NOP");
|
8 | }
|
9 | }
|
10 | }
|
11 | }
|
Erstellt werden die Arrays in einer eigenen Funktion auf Anfrage und vor
der Endlosschleife. Ich verwende einen ATMega8 mit externem Quarz,
FuseBits sind gesetzt, Optimierung ist aktiviert, F_CPU ist angegeben.
Ich habe Zugang zu einem Digitalen Speicheroszi und ich habe
festgestellt, dass ich um meine angestrebten Abstände zwischen den
Portzuständen eine Varianz von bis zu 2 us habe, was bei teilweise
angestrebten Pulsdistanzen runter bis auf 5 us ein inakzeptabler Wert
ist.
Beim Gegenmessen eines komerziellen Impulsgebers stehen die
Pulsdistanzen starr ohne Varianz auf dem eingestellten Wert.
Selbst, wenn ich den eingestellten Abstand aufgrund einer Taktzeit von
62,5 ns bei 16MHz und internen Offsets durch die Programmabarbeitung
zwischen den Zeitpunkten noch nicht 100% treffe, so sollte ich doch
wenigstens stabil danebenliegen. Momentan ist es z.B. so, dass ich eine
Pulsdistanz von 15 us anstrebe und effektiv einen Mittelwert von 16,x
mit einer Standardabweichung von 1,9x us messe. Mit dem etwas
danebenliegen komme ich zurecht. Das lässt sich bestimmt noch
kompensieren, wenn ich alles Zeitkritische komplett in Assembler
schreibe oder auch noch einen Quarztakt mit anderer Taktfrequenz
verwende (gerader Teiler z.B. 10 MHz = 50ns), aber die Schwankungen
betreffend ...? Den Temperaturdrift schließe ich aus, da die
Schwankungen sehr schnell und statistisch verteilt sind und der
Mittelwert sich nicht ändert.
Wie kann ich diese Schwankungen "abschalten"?
Danke und viele Grüße