Attiny85 Zyklen

Gast #4769620
Hallo,

ist mir unklar, wie ich den millis() Überlauf (Rücksetzen auf 0) handeln 
kann und hab mir gedacht, ich zähle einfach die Zyklen.
Attiny85 läuft mit Internal 8 Mhz Clock und müsste - denke ich - 
8.000.000x/sek die Loop-Schleife durchlaufen.
Obwohl im Code kein Delay vorhanden ist, entsprechen aber 125.000 Zyklen 
ca. 5 sek, 250.000 Zyklen ca. 10 sek usw.
1
unsigned long Ticker=0;
2

3
...
4
...
5

6
void loop() 
7
{ 
8
  char recvChar;
9
  while(1){
10
    if(blueToothSerial.available()){
11
      recvChar = blueToothSerial.read();
12
      ...
13
      ...
14
    }
15
    Ticker++;
16
    ...
17
    ...
18
  }
19
}

Hängt das mit Bluetooth zusammen oder kann das bitte jemand einem 
Anfänger wie mir erklären?

Danke für alle Antworten

Matthias
Gast #4769622
>Attiny85 läuft mit Internal 8 Mhz Clock und müsste - denke ich -
>8.000.000x/sek die Loop-Schleife durchlaufen.

Selbst wenn dort nur

while(1)
{
}

stehen würde, sind das keine 8.000.000s/sek.
Gast #4769650
Arduino F. schrieb:
> while(1) in Loop(), das ist keine gute Idee!
Stammt aus diesem Beispiel 
http://www.instructables.com/id/ATtiny85-Bluetooth/step3/Code/ und ich 
hab mich auch schon gefragt, ob's das while(1) braucht - besser 
entfernen oder besser drin lassen

Arduinoquäler schrieb:
> Der Überlauf tritt 49 Tage nach dem Starten des Programms
> auf. Wo ist das Problem?
Programm läuft permanent und geplant war die Berechnung eines Intervalls 
z.B. if (millis()-prevmillis>irgendwas) - das ergibt bei einem Überlauf 
ein falsches Ergebnis.
Ansonsten kein Problem. Ich frage mich nur, warum 125.000 Zyklen ca. 5 
sek entsprechen und möchte verstehen. Brauche ja nur den Ticker auf 
750.000 abfragen und habe meine geplanten ca. 30 sek. Warum das dann so 
ist, weiss ich dann aber immer noch nicht.
Gast #4769660
Matthias schrieb:
> z.B. if (millis()-prevmillis>irgendwas) - das ergibt bei einem Überlauf
> ein falsches Ergebnis.

Solange wie "irgendwas" kleiner als 49 Tage ist, gibts keinen Fehler 
beim Überlauf.
Und ja, bevor du fragst, ich bin sicher!

Matthias schrieb:
> besser
> entfernen oder besser drin lassen
So ist die Schleife flüssiger als Wasser!
Überflüssig.

>    while(blueToothSerial.available()){
würde vielleicht ja noch Sinn machen...
Gast #4769691
Warum Einige nicht mal lesen vor dem Posten, wird sich mir nie 
erschliessen.
Die Frage war NICHT "wie handle ich den Überlauf" sondern war "kann mir 
jemand erklären, warum ein 8 MHz uC in 5 sek nur 125.000 Zyklen 
durchläuft.
Gast #4769706
Jetzt machts ihm doch nicht so schwer.
Für eine deterministische Zeitmessung brauchst du einen Timer. Mit 
Zykluszeit- bzw. Loopdurchlauf-Zähler wird das nichts, weil das dann 
davon abhängig ist, was da noch so alles drin steht.
Gast #4769715
Matthias schrieb:
> Die Frage war NICHT "wie handle ich den Überlauf" sondern war "kann mir
> jemand erklären, warum ein 8 MHz uC in 5 sek nur 125.000 Zyklen
> durchläuft.

Wurde bereits gesagt:

dummy schrieb:
> Selbst wenn dort nur
>
> while(1)
> {
> }
>
> stehen würde, sind das keine 8.000.000s/sek.

Manche Befehle daueren eben länger als 1 Takt, auch "Ticker++". Und 
"while()" muss auch noch behandelt werden ...
Gast #4769728
Peter D. schrieb:
> Da würd ich mal 20 Zyklen ansetzen (4*LD + 4*ADD + 4*ST).

Beim Tiny25 sind es 12 Assemblerbefehle - mit while(1)-Loop. Ich habe 
aber nicht nachgeschaut, wieviele Takte LDD, ADC, ADIW, STD und RJMP 
jeweils benötigen.
1
11:       ticker++;
2
+00000020:   8189        LDD       R24,Y+1        Load indirect with displacement
3
+00000021:   819A        LDD       R25,Y+2        Load indirect with displacement
4
+00000022:   81AB        LDD       R26,Y+3        Load indirect with displacement
5
+00000023:   81BC        LDD       R27,Y+4        Load indirect with displacement
6
+00000024:   9601        ADIW      R24,0x01       Add immediate to word
7
+00000025:   1DA1        ADC       R26,R1         Add with carry
8
+00000026:   1DB1        ADC       R27,R1         Add with carry
9
+00000027:   8389        STD       Y+1,R24        Store indirect with displacement
10
+00000028:   839A        STD       Y+2,R25        Store indirect with displacement
11
+00000029:   83AB        STD       Y+3,R26        Store indirect with displacement
12
+0000002A:   83BC        STD       Y+4,R27        Store indirect with displacement
13
+0000002B:   CFF4        RJMP      PC-0x000B      Relative jump
(Firma: Vescomp) #4769792
Matthias schrieb:
> Die Frage war NICHT "wie handle ich den Überlauf" sondern war "kann mir
> jemand erklären, warum ein 8 MHz uC in 5 sek nur 125.000 Zyklen
> durchläuft.

 Nein.
 Ein 8MHz uC durchläuft in 5s genau 5*8Mio Zyklen = 40.000.000 Zyklen.

 Wieviele Befehle der uC in dieser Zeit abarbeiten kann oder wie viele
 Schleifendurchläufe dieser uC schafft, ist eine ganz andere Sache.
1
    if(blueToothSerial.available()){
 oder:
1
   recvChar = blueToothSerial.read();

 sind keine Zyklen sondern Befehle, demzufolge kann so etwas von 1-1Mio
 Zyklen dauern (oder noch länger wenn man eine Funktion aufruft).
Gast #4769947
DanVet schrieb:

> Für eine deterministische Zeitmessung brauchst du einen Timer.

Nein, nicht nowendigerweise.

> Mit Zykluszeit- bzw. Loopdurchlauf-Zähler wird das nichts, weil das dann
> davon abhängig ist, was da noch so alles drin steht.

Das ist zwar im Prinzip richtig, wenn man aber genau weiß, was da "noch 
so alles" drinsteht, dann kann man auch ohne Timer zu einer 
deterministischen Zeitmessung kommen...

Aber ja, bei der Arduino-Scheiße(*) würde ich auch nicht ernsthaft 
versuchen, das ermitteln zu wollen. Mehr noch: ich würde sogar niemals 
in Versuchung geraten, diese Arduino-Scheisse überhaupt ernsthaft für 
eine Verwendung in Erwägung zu ziehen...

(*) gemeint ist natürlich das völlig räudige Software-Framework, nicht 
die zumindest teilweise durchaus attraktive Hardware der 
"Arduino-kompatiblen"...
#4769973
c-hater schrieb:

> (*) gemeint ist natürlich das völlig räudige Software-Framework, nicht
> die zumindest teilweise durchaus attraktive Hardware der
> "Arduino-kompatiblen"...

Beim Anwalt würde ich sagen: unzulässige Verallgemeinerung

Und: Ziel und Zweck betrachten. Außerdem besteht immer die Möglichkeit, 
eine bessere Lösung anzubieten, zugänglich zu machen.

Und inhaltlich stimme ich Deinem ersten Absatz zu.... Ob das dem TO 
hilft, kann er nur selbst entscheiden.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.