ATTiny85 Timer Probleme

#6962723
Lesenswert?

Hallo in die Runde,
als Fachfremder versuche ich mich gerade in der Mikrocontroller 
Programmierung, also bitte seid nachsichtig mit mir^^.

Ich benutze den ATTiny85 für eine Anwendung bei der die 
Arduino-Funktionen tone(); delay(); ,millis(); verwendet werden. 
Darüberhinaus wird ein Servo über PWM angesteuert und eine Zeit 
gemessen. Diese Zeit habe ich zu Beginn über millis() gemessen. Da diese 
Funktion anscheinen bei Zeiten von mehreren Minuten, Abweichungen von 
mehreren Sekunden erzeugt, habe ich versucht einen TimerInterrupt auf 
dem Timer 1 zu nutzen um die Zeit genauer zu messen. in einer Testsketch 
hat das auch gut funktioniert.

Wenn ich den Timer 1 nun bei dem großen Programm für die Zeitmessung 
nutze, bekomme ich die Fehlermeldung, dass der Vektor mehrfach belegt 
wurde. "
C:\Users\chris_000\AppData\Local\Arduino15\packages\ATTinyCore\hardware\ 
avr\1.1.2\cores\tiny/Tone.cpp:535:  multiple definition of 
`__vector_3'")

Ich verstehe es so, dass tone() ebenfalls auf dem Timer 1 läuft und es 
somit zu Problemen kommt.

Die anderen Arduino Funktionen laufen anscheinend auf Timer0 und nur 
tone() ist das Problem.

Gibt es eine Möglichkeit das Problem aufzulösen? Z.B. tone() ebenfalls 
auf Timer 0 zu schieben?

Wäre dankbar für jeden Hinweis.
Grüße,
Christopher
#6963790
Lesenswert?

Ok, was ich daran nur nicht verstehe, ist, dass ich bei den millis() 
etwa 3-4 Prozent daneben bin. Sowohl zu schnell als zu langsam. Bei dem 
Timer war ich deutlich genauer, auf jeden Fall unter 1 Prozent. Ich habe 
es natürlich nicht statistisch über mehrere Stück ausgewertet. Woran 
könnte es denn liegen, dass millis() so ungenau ist?
Grüße
Gast #6963826
Lesenswert?

Christopher T. schrieb:
> Woran könnte es denn liegen, dass millis() so ungenau ist?

Blockierende (lange) Interruptserviceroutinen oder anderweitiges Sperren 
des Interrupts, der die Millies updated. Da geht die Uhr aber nur 
langsamer und nicht schneller. Beschreib doch kurz die Hardware, ist ein 
Quarz angeschlossen?
Gast #6964442
Lesenswert?

Christopher T. schrieb:
> Ok, was ich daran nur nicht verstehe, ist, dass ich bei den millis()
> etwa 3-4 Prozent daneben bin. Sowohl zu schnell als zu langsam. Bei dem
> Timer war ich deutlich genauer, auf jeden Fall unter 1 Prozent. Ich habe
> es natürlich nicht statistisch über mehrere Stück ausgewertet. Woran
> könnte es denn liegen, dass millis() so ungenau ist?

Das Problem ist die Arduino-Software. Die hat viele interrupt-gesteuerte 
Hintergrundprozesse. Da hilft nur ohne Arduino-SW programmieren.
Gast #6964464
Lesenswert?

BlaBla schrieb:
> Das Problem ist die Arduino-Software. Die hat viele interrupt-gesteuerte
> Hintergrundprozesse. Da hilft nur ohne Arduino-SW programmieren.

Stimmt nicht. Offensichtlich entzieht sich das deiner 
Fachkenntnis/Beurteilung.

Punkt 1:
Einzig die Timer ISR wird üblicherweise etabliert.
Selbst das ist beim Tiny85 nicht unbedingt der Fall(auswählbar)

Punkt 2:
Es gibt keinen Tiny85 im originalen Arduino Umfeld. Das sind alles 
fremde, hinzugeladene Plattformdefinitonen. Hier ist leider geheim, 
welche verwendet wird.
#6964475
Lesenswert?

BlaBla schrieb:
> Das Problem ist die Arduino-Software. Die hat viele interrupt-gesteuerte
> Hintergrundprozesse. Da hilft nur ohne Arduino-SW programmieren.

Wasn Quatsch, millis() benutzt einen Timer und ist damit von 
Programmlaufzeiten unabhängig. Man muß schon elend lange die Interrupts 
sperren, damit ein kompletter Überlauf verloren geht.

millis() zählt aber keine glatten 1.000ms, sondern irgendwas krummes. Es 
kann daher beim Auslesen zu Rundungsfehlern kommen. Genaueres sollte im 
Manual stehen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren