Prescaler für micros() ?

Hi,

gibt es für den Prescaler, der für micros() zuständig ist, einen genau so übersichtlichen CodeSchnipsel wie ihn Nick Gammon für den ADC veröffentlicht hat? Ich hätte gern etwas mehr Auflösung als 4µs falls das ohne größere Umstände möglich ist, so wie das Gegenstück des ADC-Prescalers.
Der Sketch misst nur die benötigte Zeit für analogRead (A0); und gibt z.Bsp. das zurück:

112 µs, 112 µs, 116 µs, 116 µs. 112 µs, 112 µs, 112 µs, 112 µs, 112 µs, 116 µs, 112 µs, 112 µs …

Gruß André

uint32_t aktMicros;
uint32_t Time;
int rawADC;       // float bei Oversampling!

void setup ()
{
  Serial.begin (115200);

  ADCSRA &= ~(bit (ADPS0) | bit (ADPS1) | bit (ADPS2)); // clear prescaler bits

  // uncomment as required

  //  ADCSRA |= bit (ADPS0);                               //   2
  //  ADCSRA |= bit (ADPS1);                               //   4
  //  ADCSRA |= bit (ADPS0) | bit (ADPS1);                 //   8
  //  ADCSRA |= bit (ADPS2);                               //  16 <== 16-20µs
  //  ADCSRA |= bit (ADPS0) | bit (ADPS2);                 //  32
  //  ADCSRA |= bit (ADPS1) | bit (ADPS2);                 //  64
      ADCSRA |= bit (ADPS0) | bit (ADPS1) | bit (ADPS2);   // 128 <== Arduino default

  rawADC = analogRead(A0); // DummyRead
}

void loop ()
{
  aktMicros = micros();

  analogRead (A0);

  Time = (micros() - aktMicros);
  Serial.print (Time);
  Serial.println(" µs ");
  delay (2000);
}

Timer0. Damit wird allerdings auch millis() gemacht. Wenn du da was änderst, ändern sich noch andere Sachen

Die 4µs kommen daher dass das ein 8 Bit Timer ist. 4µs * 256 = 1,024ms

Hi

Man könnte sich aber einen freien Timer anlachen, Der Dir die µs hoch zählt.
Auslesen direkt aus dem TimeCounter-Register.
Wenn ich Das richtig im Kopf habe - der ATtiny45 läuft mit 1MHz (1 Takt/µs) und kann einen Timer in dieser Geschwindigkeit hoch zählen - Überlauf nach 256µs.
Wenn Du den Arduino-Timer auf Prescaler 16 laufen lässt, zählt Dieser in 1/16tel System-Takt = 1 Takt/µs.

Bei entsprechend größerem Prescaler entsprechend langsamer.

MfG

Danke euch Beiden, scheint also nicht so einfach zu sein / sonderlich sinnvoll zu sein am Timer0 zu schrauben.
Da mir da eh die Kenntnisse fehlen wird das erstmal hinten anstehen. Wäre ja auch zu einfach gewesen (wie beim ADC).

Gruß André

Hi

Im Datenblatt zum verbauten µC gibt es die verschiedenen Timer, zum Arduino lässt sich herausfinden, welche Timer für was benutzt werden - wenn Da ein Timer 'frei' ist, steht dort ebenfalls drin, wie welche Register beschrieben werden müssen, daß der Timer 'so und so schnell' ist.
Wenn die reine Zahl an Ticks ausreicht und Du damit leben kannst, daß nach 256 Ticks ein Überlauf statt findet (Du also selber nachhalten musst, wie 'spät' es jetzt wirklich ist - sehe ich Darin keine größeren Probleme.
Einzig, wenn jeder der Timer in der Arduino-Welt eine spezielle Funktion hätte - da aber die PWMs einzeln (bzw. eben pro Timer) einstellbar sind, sind zumindest Diese teilweise 'frei'.

MfG

Hallo,

auf einen “freien” Timer möchte ich auch hinaus. Wenn du zum Bsp. Timer 1 im Normal- oder CTC-Mode frei laufen lässt mit Prescaler 1, dann deckt er ohne Überlaufzählung mit seinem 16Bit Zählwerk 4,096ms ab. Jetzt musst du nur davor und danach den Zählerstand vom Timer auslesen. Differenz bilden, dann haste die Takte und diese mal 62,5ns nehmen, dann haste Taktgenau die gesuchte Zeit.

Hi,

danke für die Beschreibung! Ich verstehe was ihr schreibt, aber mir fehlen die Kenntnisse dafür.
Wäre es so einfach gewesen wie oben im Beispiel für den ADC, hätte ich das einfach ausprobiert, eine 1µs - Auflösung statt 4µs zu haben. Im Moment ist es nur so ein Gedanke, einen Zeitabschnitt zu messen, von 0V bis der voreingestellte Komparatorwert erreicht ist zu messen und auszuwerten, halt mit höherer Auflösung, bei sehr kurzen Messzeiten.
Aber bis dahin habe ich andere Baustellen, siehe NickName :wink:

Gruß André

Hallo,

hier haste was zum probieren. Bedenke aber das in deinem aktuellen Sketch das analogRead wegoptimiert wird, weil es ungenutzt bleibt. Beweisen kann ich es nicht, müsste man die Kompilierung vergleichen, gehe aber fest davon aus. Die 0µs Differenz bei deinem Test lassen es wiederum stark vermuten.
Bei meinem nackten Sketch misst man 11 Takte, was 687,5ns wären.

/* 
 *  Doc_Arduino - german Arduino Forum
 *  IDE 1.8.5
 *  Arduino Mega2560
 *  29.03.2018
 *  
 *  Timer Mode 1 - Normal-Mode
 */


#include <util/atomic.h>    // für cli() und sei() mit SREG Sicherung

unsigned int start;
unsigned int ende;

void setup() {
  
  set_Timer1();   

}  

 
void loop() {
  
  start = readout_Timer1();
  
  // ... hier dein Code
  
  ende  = readout_Timer1();

  // hier Differenz bilden usw.
  // wenn start > ende, dann Korrekturrechnung, es fand ein Überlauf statt
    
}


// *** Funktionen *** //

unsigned int readout_Timer1 ()     
{  
  unsigned int count = 0;
  
  ATOMIC_BLOCK (ATOMIC_RESTORESTATE) {    
      count = TCNT1;
  }
  return count;    
}  


void set_Timer1()  // Timer 1 Normal-Mode
{ 
  cli();
  TCCR1A = 0;      // Reset Register 
  TCCR1B = 0; 
  TCCR1C = 0;    
  TIMSK1 = 0;     
  TCNT1  = 0;     
  TCCR1B = (1<<CS10);   // set Prescaler 1
  sei();
}

Hi Doc,

danke!
Zum austesten komme ich zwar erst später, da irgendwie geOstert werden will (soll), habe aber mal schnell drüber geschaut. Ich muss noch hinter das System steigen …

TCCR1B = (1<<CS11); // Teiler 8 ==> 0,5µs - ist das richtig?

https://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer#TCCR1B

… und natürlich schöne Ostern!
Gruß André

Hallo,

ja richtig. Das deckt dann einen Messbereich von 32,768ms ab.
Ebenfalls fröhliche Ostern.

Doc_Arduino:
Bedenke aber das in deinem aktuellen Sketch das analogRead wegoptimiert wird, weil es ungenutzt bleibt. Beweisen kann ich es nicht, müsste man die Kompilierung vergleichen, gehe aber fest davon aus.

Dann gehst du von was falschem aus!
Der analogRead() findet natürlich statt!
Das kann ich mit Sicherheit behaupten, ohne es im generierten Code beweisen zu müssen.

--
Wofür wohl das Wörtchen "volatile" erfunden wurde?

Hallo,

combie:
Wofür wohl das Wörtchen "volatile" erfunden wurde?

Ist hier nicht notwendig.

Offensichtlich sind einige deiner Behauptungen/Annahmen so dermaßen falsch, dass noch nicht mal das Gegenteil richtig ist.

Ein Frosch, der im Brunnen lebt, beurteilt das Ausmaß des Himmels nach dem Brunnenrand.

Der Frosch hat keine Chance!
Aber du könntest die Leiter der Erkenntnis empor steigen.

Die erste Stufe, für diesen konkreten Fall, habe ich dir schon schön bunt angemalt.

Wofür wohl das Wörtchen "volatile" erfunden wurde?

Nimm Sie!
Bitte.

Hallo,

der Funktionsaufruf ist volatile. Der Rückgabewert count wird nirgends global nackt weiterverarbeitet. Geht auch nicht weil lokal. Eine ISR gibts auch nicht. Man reiche mir bitte die Leiter wenn falsch.

combie:
Wofür wohl das Wörtchen "volatile" erfunden wurde?

Doc_Arduino:
Ist hier nicht notwendig.

Warum streitet Ihr um Sachen die ich gar nicht verstehe und schon gar nicht um diese Zeit? :wink: :wink: :wink:
Gute Nacht
Uwe

Nochmal: (mit etwas anderen Worten)
Was ist der Zweck, und die Wirkung, des Schlüsselwortes "volatile"?

Hallo,

uwe:
Ich sehe das noch nicht als Streit. Es gibt 2 verschiedene Standpunkte. Okay. Solange das sachlich bleibt kann ich damit leben. Kannst einschreiten wenn es schief läuft. :slight_smile:

zum Thema:
volatile sagt dem Compiler er soll den Wert der Variablen aus dem Speicher lesen und nicht aus einem CPU Register, worin er möglicherweise schon liegt. volatile hindert den Compiler an einer Optimierung.
Das ist die allgemeine Erklärung dafür. Desweiteren wird volatile verwendet wenn sich eine Variable außerhalb des Programmflusses ändert, weil der Compiler das nicht sehen kann. Zum Bsp. wenn sich eine Variable in einer ISR ändert.

Das trifft für meinen Sketch nicht zu. ISR gibt es keine. Die Funktion wird ausgeführt und liegt voll im sichtbaren Programmfluss. Der Rückgabewert count wird nicht gelesen, er wird beschrieben/zugewiesen mit dem Wert vom Timercounter.

Was redest du denn jetzt von irgendwelchen count!
Bitte nicht zwischen drin das Thema wechseln....

A:
Dieses ist deine Annahme/Behauptung, welche ich als falsch bezeichnet habe:

Bedenke aber das in deinem aktuellen Sketch das analogRead wegoptimiert wird, weil es ungenutzt bleibt.

B:
Ja, so kann man das sagen!

volatile sagt dem Compiler er soll den Wert der Variablen aus dem Speicher lesen und nicht aus einem CPU Register, worin er möglicherweise schon liegt. volatile hindert den Compiler an einer Optimierung.

Wenn du versuchst A und B aufeinander zu bringen, wirst du feststellen, dass eine deiner beiden Aussagen falsch sein MUSS!

Hallo,

ich weiß im Moment nicht was dein Begehren ist. Ich stelle mir die Frage was möchte er von mir wissen.

Was ich nicht leiden kann ist, wenn man mich unvollständig zitiert. Wenn du mich zitierst dann bitte komplett. Einen einzelnen Satz aus dem Zusammenhang reißen bringt nichts. Ich hatte bedenken geäußert und war mir dabei nicht sicher ob der nackte ungenutzte Funktionsaufruf analogRead(A0) wegoptimiert wird. Nicht mehr und nicht weniger. Du hast dann geantwortet das genau das nicht der Fall ist. Okay. Damit war das für mich erledigt.

Im Verlauf der restlichen Unterhaltung bezog ich mich immer auf deine letzte Randbemerkung, die etwas abfällig formuliert war. Diesen Tonfall habe ich ignoriert. Geschenkt. Der Trennstrich sagt mir das es mit dem ersten Teil der Antwort nichts zu tun hat.

combie:

Wofür wohl das Wörtchen "volatile" erfunden wurde?

Ich habe mich bis jetzt immer gefragt welche Variable meint er wohl, die ich vergessen haben soll volatile zu deklarieren. Ich habe mich im weiteren Verlauf weit und breit darüber ausgelassen und bekomme immer nur irgendwelche Sprüche und Kurzantworten im SMS Stil um die Ohren gehauen. So funktioniert keine vernünftige Unterhaltung. Wir haben nur die schriftliche Form zur Verfügung.

Weiter im Text. Jetzt lese ich heraus das es dir nicht um eine volatile Variable geht. Ich dachte du meinst count. Nun frage ich mich von was du redest? Was ist falsch am Sketch? Oder redest du gar nicht vom Sketch? Ich habe derzeit keinen blassen Schimmer um was es geht. Zur Zeit ist das nur ein Eiertanz. Nichts konkretes.

Wenn es nicht um den Sketch geht können wir das beenden. Ansonsten bitte so formulieren das ich es verstehe.

Ach....
Das macht keinen Sinn mehr...