INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Zykluszeit für einen Loop oder einzelsätze
17.03.2015, 16:04
Beitrag #1
Zykluszeit für einen Loop oder einzelsätze
Hy Zusammen,

ich glaub das ich jetzt der einzige bin der sone saudämliche Frage hier stellt aber mich Interessiert das jetzt.

Als beispiel wähle ich meinen Neo CLOCK (Code siehe unten)

Wieviel zeit benötigt der Arduino für einen Loop durchgang, kann man das irgendwie ermitteln/berechnen/rausfinden?? Mich würde es deswegen Interessieren da die UHR ja recht zeitkritisch abläuft, is zum beispiel eine längerdauernde Abfrage mit drin überspringt der Sekundenzeiger ab und zu mal ein paar Sekunden. Deshalb würde ich gern wissen ob ich noch unter 1 sek bin und wieviel Puffer mir nach obenhin bleibt.

Aber ich glaube wenn ich da richtung millis(); denke bin ich gut dabei oder?
Dann ist meine nächste Frage: Wie genau sind diese millis()?


Greez Wampo


Code:
/*
NEO PIXEL CLOCK, BlinkenClock Editet by Daniel Agocs

V1.0: Fehler in der Ausgabe des Brightnesswertes = Wurde angepasst nun werden die vom LDR gelesenen Werte 0-1024 auf 0-255 richtig aufgerechnet
*/


/*
d24.12.2013 -> date: dd.mm.yyyy
t12:10 -> time: hh:mm
c0 -> clock mode: 0,1
o0,0,0 -> off color: r,g,b
h255,0,0 -> hour color: r,g,b
m0,255,0 -> minute color: r,g,b
s0,0,255 -> second color: r,g,b
M100,100,100 -> mark color: r,g,b
b5 -> brightness min: 0...255
B255 -> brightness max: 0...255
a0 -> analog min: 0...1023
A1023 -> analog max: 0...1023
*/
#include <Adafruit_NeoPixel.h>
#include <Adafruit_BMP085.h>
#include <Wire.h>
#include <DS1307.h>
#include <avr/eeprom.h>
#define PIXEL_12OCLOCK 0 //first pixel (12 o'clock)
#define DATA_PIN 6 //data pin from stripe
#define NUM_PIXEL 60
#define LDR_READ_PIN A0

Adafruit_BMP085 bmp = Adafruit_BMP085(10085);
float druck;
float temperature;

//Verfeinerung der gelesenen Werte
const int numReadings = 10;          // wieviel LDR Werte
int       readings[numReadings];     // analog input lesen
int       index = 0;                 // index der aktuellen lesung
int       total = 0;                 // Total Runs
int sensorValue = 0;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXEL, DATA_PIN, NEO_GRB + NEO_KHZ800);
DS1307 rtc; //RTC connected via I2C (SDA+SCL)
typedef struct
{
uint8_t r;
uint8_t g;
uint8_t b;
} COLOR;
typedef struct
{
uint8_t magic; //0xAA
uint8_t clock_mode;
COLOR hour;
COLOR minute;
COLOR second;
COLOR mark;
COLOR off;
uint8_t brightness_min;
uint8_t brightness_max;
uint16_t analog_min;
uint16_t analog_max;
} SETTINGS;
SETTINGS settings;


void setup()
{
Serial.begin(57600);
Serial.println("Go!");
strip.begin();
bmp.begin();
rtc.start();
pinMode(LDR_READ_PIN, INPUT);
analogReference(EXTERNAL);

//read settings from EEPROM
eeprom_read_block((void*)&settings, 0, sizeof(SETTINGS));
if((settings.magic != 0xAA) || (settings.brightness_min >= settings.brightness_max) || (settings.analog_min >= settings.analog_max))
{
//set default settings
settings.magic = 0xAA;
settings.clock_mode = 1;
settings.hour.r = 255;
settings.hour.g = 0;
settings.hour.b = 0;
settings.minute.r = 0;
settings.minute.g = 255;
settings.minute.b = 0;
settings.second.r = 0;
settings.second.g = 0;
settings.second.b = 255;
settings.mark.r = 255;
settings.mark.g = 255;
settings.mark.b = 255;
settings.off.r = 0;
settings.off.g = 0;
settings.off.b = 0;
settings.brightness_min = 5;
settings.brightness_max = 255;
settings.analog_min = 20;
settings.analog_max = 1024;
//write settings to EEPROM
eeprom_write_block((void*)&settings, 0, sizeof(SETTINGS));

rtc.set(16, 55, 00, 16, 02, 2015); //12:00:00 24.12.2013 (sec, min, hour, day, month, year)
}

for(byte i=0; i<NUM_PIXEL; i++) {
    clearStrip();
    strip.setPixelColor(i, wheel((256 / NUM_PIXEL) * i));
    strip.show();
    delay(25);
  }
}

void set_pixel(uint8_t p, uint8_t r, uint8_t g, uint8_t b) //set pixel p (0...59) with color r,g,b
{
if(p == 255){ p = 59; }
else if(p == 60){ p = 0; }
p = p + PIXEL_12OCLOCK;
if(p >= 60)
{
p -= 60;
}
strip.setPixelColor(p, r, g, b);
}


void set_clock1(uint8_t s, uint8_t m, uint8_t h)
{
  if(h >= 12) { h -= 12; }
  clearStrip();

    
// Positionen berechnen und ausgeben...
    double doubleDisplaySeconds = s;
    setFloatPixelColor(doubleDisplaySeconds, settings.second.r, settings.second.g, settings.second.b);
  
    double doubleDisplayMinutes = (double) m + (doubleDisplaySeconds / 60.0);
    setFloatPixelColor(doubleDisplayMinutes, settings.minute.r, settings.minute.g, settings.minute.b);
  
    double doubleDisplayHours = doubleMap((double) (h * 60.0 + m), 0.0, 12.0 * 60.0, 0.0, 60.0);
    setFloatPixelColor(doubleDisplayHours,settings.hour.r, settings.hour.g, settings.hour.b);
    strip.show();
  }


/**
* Pixelfarben nicht nur auf ganze Pixel setzten, sonder auch "dazwischen".
*/
void setFloatPixelColor(float pos, byte r, byte g, byte b) {
  float anteil = 1.0 - (pos - (int) pos);
  strip.setPixelColor((byte) pos, (byte) ((float) r * anteil), (byte) ((float) g * anteil), (byte) ((float) b * anteil));
  if((byte) pos + 1 != NUM_PIXEL) {  
    strip.setPixelColor(1 + (byte) pos, (byte) ((float) r * (1.0 - anteil)), (byte) ((float) g * (1.0 - anteil)), (byte) ((float) b * (1.0 - anteil)));
  }
  else {
    strip.setPixelColor(0, (byte) ((float) r * (1.0 - anteil)), (byte) ((float) g * (1.0 - anteil)), (byte) ((float) b * (1.0 - anteil)));
  }
}


/**
* Map-Funktion fuer Double-Werte.
*/
double doubleMap(double x, double in_min, double in_max, double out_min, double out_max) {
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}


void set_clock2(uint8_t s, uint8_t m, uint8_t h)
{
uint8_t i;
if(h >= 12) { h -= 12; }

clearStrip();

//set hour
for(i=0; i<60; i++)
{
if(i == ((h*5)+(m/12)))
{
set_pixel(i-1, settings.hour.r/2, settings.hour.g/2, settings.hour.b/2);
set_pixel(i+0, settings.hour.r, settings.hour.g, settings.hour.b);
set_pixel(i+1, settings.hour.r/2, settings.hour.g/2, settings.hour.b/2);
}
}

//set second and minute
for(int i=0; i<60; i += 15) {
        strip.setPixelColor(i, settings.mark.r/4, settings.mark.g/4, settings.mark.b/4);
      }
for(i=0; i<60; i++)
{
if(i == s)
{
set_pixel(i, settings.second.r, settings.second.g, settings.second.b);
}
else if(s == m)
{
set_pixel(s, (settings.second.r+settings.minute.r), (settings.second.g+settings.minute.g), (settings.second.b+settings.minute.b));
}
else if(i == m)
{
set_pixel(i, settings.minute.r, settings.minute.g, settings.minute.b);
}
}

strip.show();
}

void loop()
{
int c, i, r, g, b;
int s, m, h, day, month, year;
unsigned long ms;
static unsigned int last_analog=0;
static unsigned long ms_clock=0, ms_ldr=0;
char tmp[32];


if (( m == 15 || m == 30 || m == 45) && s == 0)
{

  int L;
  for(int j=0;j<(4*((m+1)/2));j++) {
    for(int i=0;i<(m+1);i++) {
      L=(m+1)-i-1;
      if ( ((i+j) % ((m+1)/2)*2) <(m+1)/2)
        strip.setPixelColor(L,0,0,255);
      else
        strip.setPixelColor(L,255,255,255);
       }
    strip.show();
    delay(25);
  }
}

else if ((m == 00 && s == 00))
{
  for(byte i = 0; i < NUM_PIXEL; i++) {
    strip.setPixelColor(i, wheel(((256 / NUM_PIXEL)* i)*255)+5);
    strip.show();
    delay(25);
  }
  rainbowCycle(4,3); //durchläufe, geschwindigkeit
  
  for(int i = 0; i < NUM_PIXEL; i++) {
    strip.setPixelColor(i, 0);
    strip.show();
    delay(25);
  }
  for(byte i = 0; i < NUM_PIXEL; i++) {
    clearStrip();
    strip.setPixelColor(i, wheel(((256 / NUM_PIXEL)* i)*255)+5);
    strip.show();
    delay(25);
  }
}

//current milliseconds since power on
ms = millis();
//get time from RTC and set LEDs
if((ms - ms_clock) > 1000)
{
ms_clock = ms;
rtc.get(&s, &m, &h, &day, &month, &year);

if(settings.clock_mode == 0)
{
set_clock1(s, m, h);
}
else
{
set_clock2(s, m, h);
}
}

//check light intensity (LDR)
if((ms - ms_ldr) > 50) //every ??? msek
{
ms_ldr = ms;
total = total - readings[index];        
  readings[index] = analogRead(LDR_READ_PIN);
  // add the reading to the total:
  total = total + readings[index];      
  // advance to the next position in the array:  
  index = index + 1;                    
  // if we're at the end of the array...
  if (index >= numReadings) {            
    // ...wrap around to the beginning:
    index = 0; }                          
  // calculate the average:
  i = total / numReadings;
  
  
  
if(i < settings.analog_min)
{
i = settings.brightness_min;
}
else if(i > settings.analog_max)
{
i = settings.brightness_max;
}
else
{
i = ((i-settings.analog_min) / ((settings.analog_max-settings.analog_min)/(settings.brightness_max-settings.brightness_min))) + settings.brightness_min;
}
strip.setBrightness(i); //0...255
strip.show();
}

//check serial data
if(Serial.available() > 1)
{
//read serial data
for(i=0; (Serial.available()>0) && (i<31);)
{
tmp[i++] = Serial.read();
tmp[i] = 0;
delay(10); //wait to receive data
}
//get current time and date
rtc.get(&s, &m, &h, &day, &month, &year);
//interpret commands
c = 0;
switch(tmp[0])
{
case 'd': //date
if(sscanf(&tmp[1], "%d%*c%d%*c%d", &day, &month, &year))
{
c = 1; //set rtc

}
break;
case 't': //time
if(sscanf(&tmp[1], "%d%*c%d%*c%d", &h, &m, &s))
{
c = 1; //set rtc

}
break;
case 'o': //off color
case 'h': //hour color
case 'm': //minute color
case 's': //second color
case 'M': //mark color
if(sscanf(&tmp[1], "%d%*c%d%*c%d", &r, &g, &b))
{
switch(tmp[0])
{
case 'o':
settings.off.r = r;
settings.off.g = g;
settings.off.b = b;
break;
case 'h':
settings.hour.r = r;
settings.hour.g = g;
settings.hour.b = b;
break;
case 'm':
settings.minute.r = r;
settings.minute.g = g;
settings.minute.b = b;
break;
case 's':
settings.second.r = r;
settings.second.g = g;
settings.second.b = b;
break;
case 'M':
settings.mark.r = r;
settings.mark.g = g;
settings.mark.b = b;
break;
}
c = 2; //save settings
}

break;
case 'c': //clock mode
case 'b': //brightness min
case 'B': //brightness max
case 'a': //analog min
case 'A': //analog max
if(sscanf(&tmp[1], "%d", &i))
{
switch(tmp[0])
{
case 'c': settings.clock_mode = i; break;
case 'b': settings.brightness_min = i; break;
case 'B': settings.brightness_max = i; break;
case 'a': settings.analog_min = i; break;
case 'A': settings.analog_max = i; break;
}
c = 2; //save settings
}

break;
}

if(c == 1) //set RTC/clock
{
rtc.set(s, m, h, day, month, year);
}
else if(c == 2) //write settings to EEPROM
{
eeprom_write_block((void*)&settings, 0, sizeof(SETTINGS));
}
//clear serial buffer
Serial.flush();
}


}



//Licht-Effekte-------------------------------------------------------------------
void CandyCane  (int sets,int width,int wait) {
  int L;
    for(int j=0;j<(sets*width);j++) {
    for(int i=0;i< strip.numPixels();i++) {
      L=strip.numPixels()-i-1;
      if ( ((i+j) % (width*2) )<width)
        strip.setPixelColor(L, 255, 0, 0);
      else
        strip.setPixelColor(L, 0 , 0, 255);
    }  
    strip.show();
    delay(wait);
  }
}

void rainbowCycle(uint8_t sets, uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256*sets; j++) { //cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(strip.numPixels()-i-1, wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}


//-----------------------------------------------------------------------------------

//Unterprogramme---------------------------------------------------------------------
void tempdruck() {

  sensors_event_t event;
  bmp.getEvent(&event);  // BMP085 Luftruck ziehen
  druck = event.pressure  + ( 509 / 8.5 ); // höhe 509
  bmp.getTemperature(&temperature);
  clearStrip();
  strip.show();
   int d = map(druck, 970, 1040, 0, 29);
    for(uint16_t R= 0; R<d; R++) {
      strip.setPixelColor(29-R,wheel(((R*3) & 255)));
   }
  int t = map(temperature, 10, 40, 0, 29);
    for(uint16_t L = 0; L<t; L++) {
      strip.setPixelColor(31+L,wheel(((165-(L*3)) & 255)));
  }
  strip.show();
    delay(5000);
}
//-----------------------------------------------------------------------------------

//R-G-B Farbrad-----------------------------------------------------------------------
uint32_t wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
  else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

void clearStrip(){
  for(int i = 0; i < NUM_PIXEL; i++) {
    strip.setPixelColor(i, 0);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2015, 17:24
Beitrag #2
RE: Zykluszeit für einen Loop oder einzelsätze
Hi,
ich wuerde mal sagen, wenn Du micros() nimmst, dann geht das bis auf 4us genau. Millis ist im Prinzip bis auf eine Millisekunde genau.
...davon ausgehend, dass der Systemtakt sauber laeuft.
Gruss,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2015, 17:31
Beitrag #3
Thumbs Up RE: Zykluszeit für einen Loop oder einzelsätze
Ah shit micros gibts ja auch noch....man man

Danke für die Antwort!!!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2015, 17:55
Beitrag #4
RE: Zykluszeit für einen Loop oder einzelsätze
Oder ganz klassische Methode, Portausgang invertieren wenn man dran vorbeikommt....Oszi an den Port ran und Impulsbreite messen.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2015, 20:51
Beitrag #5
RE: Zykluszeit für einen Loop oder einzelsätze
Hallo Wampo,

die von Bitklopfer vorgeschlagene Methode verwende ich im Prinzip auch in all meinen Programmen für die Arduinos.

Ich habe jedoch das Prinzip etwas ausgebaut.
Im Loop inkrementiere ich eine int-Variable. Immer dann wenn diese Variable >x ist, wird sie wieder auf 0 gesetzt und ein Binärausgang umgeschaltet.
Code:
digitalWrite(zyklus_pin, digitalRead(zyklus_pin) ^ 1);
An dem Binärausgang ist eine LED als optische Kontrolle angeschlossen.
Wenn diese LED blinkt weiß ich dass Loop noch rundläuft und das Programm auch nicht irgendwo in einer Dauerschleife in einem Unterprogramm läuft.

Je nachdem wie schnell Loop normalerweise abgearbeitet wird habe ich für x 2000 oder 5000 gewählt. Das ergibt dann meist einen Blinktakt der beim Zuschauen nicht nervös macht. Smile

Wenn man den Ausgang in jedem Loop-Zyklus umschaltet hat man beim messen mit dem Oszi meist ein unruhiges Signal mit viel Jitter weil die einzelnen Zyklen nicht immer gleich lang dauern.

Wenn man aber den Ausgang nur alle 2000, 5000 oder 10000 Zyklen umschaltet erhält man einen ruhigen Mittelwert über die entsprechende Zyklenzahl.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.03.2015, 01:15
Beitrag #6
RE: Zykluszeit für einen Loop oder einzelsätze
Hallo,
es scheint ja nicht um eine Zeit-kritische Messung zu gehen…
Code:
unsigned long Start = 0;
unsigned long Stop = 0;
unsigned long Ergebnis = 0;


void setup()  
{
}

void loop()  
{
Start = millis();

Sketch, blah, blah

Stop = millis();

Ergebnis = Stop - Start
}
sollte funktionieren.
Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.03.2015, 14:10
Beitrag #7
RE: Zykluszeit für einen Loop oder einzelsätze
@ Skoby:

So dann auch mein gedanke, nur das ich die millis durch micros ersetzen werde Wink und mir n Debug ausgebe aufn SerialMonitor.

Danke Leute
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  mit if aus do-while oder while Schleife aussteigen Nafetz 6 116 05.12.2016 21:41
Letzter Beitrag: Pit
  Welche IDE? Arduini.cc oder .org Bilbo 1 208 17.10.2016 21:03
Letzter Beitrag: ardu_arne
  Ardublock übertragt nicht an IDE oder UNO R3 tobi83 5 343 16.10.2016 14:07
Letzter Beitrag: Pit
Question Webserver, Client, Loop Marc2014 6 369 29.07.2016 21:04
Letzter Beitrag: Marc2014
  Programmspeicher auf i2c_EEPROM oder SD_Card erweitern? avoid 11 347 11.07.2016 15:46
Letzter Beitrag: avoid
  Ausgabe druckt immer 2 Werte anstatt nur einen. Finde den Fehler nicht TimeMen 24 742 02.07.2016 14:18
Letzter Beitrag: hotsystems
  Zykluszeit für CAN-Botschaften Turbo-S 3 454 18.05.2016 20:57
Letzter Beitrag: Bitklopfer
  Funktion in Loop einmalig ausführen Haustechno 4 646 09.03.2016 22:43
Letzter Beitrag: Haustechno
  IDE von .org oder .cc besser geeignet? Bit of Byte 4 451 01.03.2016 21:57
Letzter Beitrag: arduinopeter
  Pretzelboard oder C.Control Warmbronner 1 533 22.02.2016 20:14
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste