Timer Interrupt spackt rum

Hallo zusammen,

ich habe mir aus der TimerOne library einer Timer genommen, der dafür sorgen soll Analogwerte mit zugehörenden micros() zu speichern/auszugeben. Das ganze hab ich in 2 Varianten getestet: 1. die Daten werden intern gespeichert und anschließend ausgegeben 2. die Daten werden Direkt ausgegeben

Der Programmcode ist fast identisch nur das einmal in der Interruptschleife direkt die serial.print Befehle stehen und beim anderen erst am Schluss der Messung und in Variablen zwischengespeichert werden.

Mein Problem: bei interner speicher funktioniert alles super, bei direkter Ausgabe sind die intervalle partiell teilweise verschieden

Ausgabe nach der Messung Zeit A1 A2 .. . .. . 6520000 -219 -135 0 0 6530000 -218 -134 0 0 6540000 -219 -135 0 0 6550000 -218 -134 0 0 6560004 -219 -136 0 0 6570000 -218 -135 0 0 6580000 -220 -136 0 0 6590000 -219 -135 0 0 6600000 -220 -136 0 0 6610000 -219 -135 0 0 6620000 -220 -136 0 0 6630000 -219 -135 0 0 6640000 -220 -136 0 0 6650000 -218 -135 0 0 6660000 -219 -136 0 0 6670000 -218 -135 0 0 6680000 -219 -135 0 0 6690000 -218 -134 0 0 6700000 -219 -135 0 0 6710000 -218 -134 0 0 6720000 -219 -135 0 0 6730000 -218 -134 0 0 6740000 -220 -136 0 0 6750000 -218 -135 0 0 6760000 -220 -136 0 0 6770000 -219 -135 0 0 6780000 -220 -136 0 0 6790000 -219 -135 0 0

direkte Ausgabe: Zeit A1 A2 .. . .. . 103872 -124 -32 0 0 113872 -128 -36 0 0 123872 -127 -35 0 0 133872 -131 -39 0 0 143872 -130 -38 0 0 153872 -134 -41 0 0 163872 -132 -40 0 0 172848 -136 -44 0 0 182848 -135 -43 0 0 192848 -139 -47 0 0 202848 -138 -46 0 0 212848 -142 -49 0 0 222848 -140 -48 0 0 232848 -144 -51 0 0 242848 -142 -50 0 0 252848 -146 -54 0 0 262848 -145 -53 0 0 272848 -149 -56 0 0 282848 -147 -55 0 0 292848 -151 -58 0 0 301824 -149 -57 0 0 311824 -153 -60 0 0 321824 -151 -59 0 0 331824 -155 -62 0 0 341824 -153 -61 0 0

Warum ist das so? (und ich meine jetzt nicht, dass die Werte nicht sauber ..00 sind wie bei der indirekten Messung, sonder einfach immer ein gleiches intervall haben)

Ich hab schon gedacht es liegt daran das die seriellen Ausgabe zu langsam ist, aber selbst wenn ich den Timer auf 2 Sekunde Stelle sind die Zeitwerte/intervalle ebenfalls verschieden.

Ich hab schon gedacht es liegt daran das die seriellen Ausgabe zu langsam ist, aber selbst wenn ich den Timer auf 2 Sekunde Stelle sind die Zeitwerte/intervalle ebenfalls verschieden.

Du hast richtig erkannt. Bei langen Zeiten werden mehrere Zeiten ders Timer zusammengezählt. Eine lange Ausgabe bremst da auch den Timer aus.

Grüße Uwe

naja aber die Ausgabe von ca 30 Zeichen(eine Zeile) je Tackt müsste doch wenigstens alle paar Sekunden ohne Probleme gut ablaufen können. Aber selbst da hakt es. Und warum geht es immer eine Zeitlang ohne Probleme und dann springt er?

Ohne Sketch und Bibliothek fische ich im trüben. Grüße Uwe

Innerhalb einer ISR sollte man keinen Code haben der viel Zeit verbraucht. Längere serial.print ausgaben z.b sind dort nicht so gut.

Die Atmels können kein multitasking

#include <TimerOne.h>


//Messparameter
long Baudrate = 115200;   //9600 Standart, 115200 max Arduino Serial Monitor, 256000 max RS232Logger


//Pinbelegung
int ButtonGreen = 24;      // no. of the Inputpin 
int ButtonRed = 34;        // no. of the Inputpin 
int Channel1 =  38;        // no. of the Outputpin for the first pulse (Standart=38)
int Channel2 =  40;        // no. of the Outputpin for the second pulse (Standart=40)



//Variablendeklaration
unsigned long Starttime = 0;
int AI1=A0;
int AI2=A3;
int Calvalue1;
int Calvalue2;

//Ausgabevariablen
unsigned long Measuretime;
int Measurevalue1;
int Measurevalue2;
boolean Pulsvalue1;
boolean Pulsvalue2;
int i=0;                          //Zählwert



void setup() 
{

  pinMode(Channel1, OUTPUT);      //initialization of Output1
  pinMode(Channel2, OUTPUT);      //initialization of Output2    
  pinMode(ButtonGreen, INPUT);    //initialization of Input
  pinMode(ButtonRed, INPUT);      //initialization of Input
  Serial.begin(Baudrate);	  //start serial connection with xx Baud                                
  Serial.println("-=-=-=< Ready to measure >=-=-=-");//output header 
  Timer1.initialize(100000);      //100000~0,1s(10Hz) - 10000~0,01s(100Hz) - 1000~0,001s(1KHz) - 500~0,0005s(2KHz)
  Timer1.detachInterrupt();
}


void loop()
{
          if(digitalRead(ButtonRed)==HIGH)
          {
            Timer1.detachInterrupt();
            digitalWrite(Channel1, LOW);
            digitalWrite(Channel2, LOW);
            Serial.println("STOPED"); 
            Calvalue1 = (analogRead(AI1));
            Calvalue2 = (analogRead(AI2));
            Serial.println("Calibration done successful"); 
            delay(500);
          }
          
          if(digitalRead(ButtonGreen)==HIGH)
          {
            delay(500);
            i=0;
           
            Starttime=micros();
            Timer1.attachInterrupt(ISRT1);
          } 

    if(i==10)
    {
      digitalWrite(Channel1, HIGH);
    }
    if(i==30)
    {
      digitalWrite(Channel1, LOW);
    }
    if(i==50)
    {
      digitalWrite(Channel2, HIGH);
    }
    if(i==75)
    {
      digitalWrite(Channel2, LOW);
    }
    
    
    
//---------------------------------------------------------------  
//---------------------------------------------------------------


}
//---------------------------------------------------------------
//---------------------------------------------------------------
//Interrupt Service Routine
void ISRT1()
{
  Measuretime=micros();
  Measurevalue1=analogRead(AI1);
  Measurevalue2=analogRead(AI2);
  Pulsvalue1=digitalRead(Channel1);
  Pulsvalue2=digitalRead(Channel2);
  
      Serial.print(Measuretime-Starttime);
      Serial.print("\t");
      Serial.print(Measurevalue1-Calvalue1);
      Serial.print("\t");
      Serial.print(Pulsvalue1);
      Serial.print("\t");
      Serial.print(Measurevalue2-Calvalue2);
      Serial.print("\t");
      Serial.println(Pulsvalue2);

  i=i+1;
}

Ergebniss der Ausgabe:
-=-=-=< Ready to measure >=-=-=-
STOPED
Calibration done successful
8 -85 0 -25 0
800932 -62 0 -7 0
1800932 -77 0 -15 0
2799908 -121 0 -28 0
3799908 -260 0 -142 0
4799908 -169 0 -80 0
5799908 -106 0 -33 0
6799908 -317 0 -210 0
7799908 -283 0 -172 0
8799908 310 0 135 0
9798884 114 1 90 0
10798884 77 1 58 0
11798884 18 1 33 0
12798884 -18 1 14 0
13798884 -38 1 3 0
14798884 -52 1 -6 0
15798884 -58 1 -8 0
16798884 -63 1 -10 0
17798884 -66 1 -12 0
18797860 -70 1 -15 0
19797860 -75 1 -18 0
20797860 -75 1 -17 0
21797860 -75 1 -16 0
22797860 -75 1 -16 0
23797860 -76 1 -17 0
24797860 -78 1 -18 0
25796836 -79 1 -18 0
26796836 -78 1 -18 0
STOPED
Calibration done successful