mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Uhr bauen, aber Timer belegt


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich möchte eine Uhr in ein Projekt einbauen. Ich benutze einen Atmega 8. 
Für die Uhr dachte ich, ich könnte den 16Bit Timer benutzen um die 
Sekunden genau generieren zu lassen, allerdings ist er durch eine andere 
Funktion bereits belegt und da kontinuierlich gezählt werden soll, 
scheidet dieser dann wohl aus, wenn er unterbrochen wird. D.h. mit der 
Zeit würde es wohl ungenau werden, wenn ich ihn immer anhalte, seine 
Daten sichere, meine Aufgabe erledige und ihn danach neu lade und ihn 
dann weiter machen lasse.

Das Problem ist, wenn ich einen 8 Bit Timer nehme mit maximalem 
Prescaler 1024 brauche ich zum einen, ein extra Register, das die 
Überläufe zählt und zum anderen ist die Zeit zwischen 2 Überläufen bei 
mir mit 21ms zu knapp, um die andere Aufgabe auszuführen.
Wie könnte ich das Problem lösen?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Gast (Gast)

>Das Problem ist, wenn ich einen 8 Bit Timer nehme mit maximalem
>Prescaler 1024 brauche ich zum einen, ein extra Register, das die
>Überläufe zählt

Logisch, was denn sonst.

> und zum anderen ist die Zeit zwischen 2 Überläufen bei
>mir mit 21ms zu knapp, um die andere Aufgabe auszuführen.

Glaub ich nicht. Dann ist dein Konzept falsch.

>Wie könnte ich das Problem lösen?

Mit Knoff Hoff

http://www.mikrocontroller.net/articles/AVR_-_Die_...
Interrupt
Multitasking

MfG
Falk

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du willst damit sagen, dass ein Timer-Interrupt alle 21 Millisekunden 
dein sorgfältig ausgetüfteltes Timing so durcheinander bringt, dass 
nichts mehr funktioniert???

Dass ein Timer für Uhrzeit eine oder mehrere Variablen im RAM erfordert 
ist durchaus üblich.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

> ist die Zeit zwischen 2 Überläufen bei
>mir mit 21ms zu knapp, um die andere Aufgabe auszuführen.
>Wie könnte ich das Problem lösen?

Also bei z.B. 16MHz Takt dauert das Hochzählen eines Registers 
vielleicht 1..1,5 µs. Hast du damit ein Problem?

MfG Spess

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach eine richtige Uhr.

Timer 2 mit 32,768 kHz Quarz im asynchron Mode.

Dann kannst du Quarzgenau z.B. 250 ms, volle Sekunde etc.
als Uhrbasis verwenden.
Der Uhrenquarz braucht dabei keine Kondensatoren und keinen
abgleich.
Der Mega8 kann dabei mit dem internen Oszillator z.B. mit
8 MHz laufen.
Abgleich über OSCCAL reicht auch für z.B. RS232.

avr

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  avr (Gast)

>Mach eine richtige Uhr.

>Timer 2 mit 32,768 kHz Quarz im asynchron Mode.

Geht auch problemlos mit jedem anderen "normalen" Quarz.

>Der Uhrenquarz braucht dabei keine Kondensatoren und keinen
>abgleich.

Doppelt falsch!

Jaja, die Experten. Seufz

Autor: Mr.P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann auch externe Uhrbautsteine nehmen. Bei manchen kannst du direkt 
einen GoldCap anschliessen und hast genug Energie um die Uhr auch einige 
Tage ohne Spannungsversorgung im Standby laufen zu lassen, ohne sie 
danach wieder neu einstellen zu müssen. Schliesst du die 
Spannungsversorgung an, wird der GoldCap gleich wieder aufgeladen....

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk

Was ist falsch an meinen Aussagen??

z.B. Atmel macht das so und die sollten das wissen:

http://www.atmel.com/dyn/resources/prod_documents/...

Der Timer 2 ist für den RTC-Mode mit eben 32,768 kHz ausgelegt
da dies der Standartuhrenquarz ist.

avr

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Was ist falsch an meinen Aussagen??

1. ein Quarz braucht zum Anlaufen die Kondensatoren.
2. Wenn man sowieso schon einen Quarz am Controller hat, kann man sich 
eine weitere genaue Taktquelle sparen.
Einen Uhrquarz setzt man dann ein, wenn der Controller mit dem internen 
RC-Oszillator betrieben wird, und schlafen gelegt wird. Bis zu einer 
bestimmten Schlaftiefe arbeitet nämlich auch noch die RTC.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und auch RTC-Qurze müssen kalibriert werden, wenn es nicht nur ne 
Eieruhr werden soll. Denn die haben auch +/-20ppm und mehr Toleranz ohne 
Abgleich. Siehe den RTC Artikel oben.

MFG
Falk

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normale Quarze haben +-50 ppm  Uhrenquarze +-10-15 ppm.
(fertige RTC 10-25 je nach Selektion).
Die Kondensatoren für den Uhrenquarz hat der Mega8 intern
und schaltet diese dazu wenn man den asyncronen Mode einschaltet.
Es hängen dann keine zwei Quarze am Mega8 sondern der Prozessortakt
kommt vom internen Oszillator (oben schon so geschrieben) da
die selben Pins verwendet werden.

avr

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zurück zum Thema


> Für die Uhr dachte ich, ich könnte den 16Bit Timer benutzen um die
> Sekunden genau generieren zu lassen, allerdings ist er durch eine andere
> Funktion bereits belegt

Durch welche?
Man könnte ja  mal überlegen, ob nicht 1 Timer beide Aufgaben übernehmen 
kann. Hängt natürlich auch etwas davon ab, was der Timer bisher schon 
macht.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also nochmal etwas genauer:
Kann natürlich auch sein, dass ich mich verrechnet habe.

CPU Frequenz 12,288 MHZ. 32kHz sind zu langsam, weil ich ein serielles 
Signal mit Bitabständen von ca 40µs abtasten muss, das ca 2ms lang ist. 
Das Abtasten dauert ca. 3ms. Das ist die andere Aufgabe. Das Signale 
wird ca alles 50ms gesendet bzw vom Atmega8 empfangen. Um sicher zu 
stellen, dass die Abtastung des Signals nicht irgendwo in der Mitte des 
Signals beginnt, warte ich bei dem ersten detektierten Flankenwechsel 
3ms bis der Interrupt wieder aktiviert wird, so dass die nächste Flanke 
garantiert der Signalanfang ist.
Wenn ich jetzt den Timer0 als Uhrentimer benutzen würde, wird dieser 
46,875 mal pro Sekunde ausgelöst (Prescaler 1024). Das wären dann alle 
21 ms. Also mit kommt das ziemlich knapp vor.

Angenommen ich aktiviere den Interrupt zum abtasten des Signales immer 
am Ende eines Uhren Inerrupts. Dann ist erstmal ungewisse wann das neue 
Signal kommt. D.h. ich würde vermutlich mit dem ersten oder dem zweiten 
Abtasten und der Uhr irgendwann kollidieren, weil sich irgendwas 
überlagert.
Und wenn der Uhreninterrupt in der Abtastung aktiv sein soll, kann man 
die abgetasteten Daten wohl wegschmeißen.

Ich werde mal versuchen den Timer0 zum Abtasten zu benutzen in der 
Hoffnung, dass die Genauigkeit unter Prescaler 8 nicht all zu sehr 
leidet.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger:
Wie soll das gehen? Wenn ich den Timer für etwas anderes als die Uhr 
benutze würde sie doch schnell ungenau werden? Denn ich müsste die Uhr 
anhalten, den aktuellen Wert sichern, meine neue Aufgabe erledigen und 
die Uhr dann weiter laufen lassen. Da diese Aufgabe wie oben beschrieben 
ca. 50ms-100ms (je nachdem wann die erste Flanke nach dem Start des 
"Lauschens" kommt) dauert wäre die Verschiebung die entsteht wohl zu 
groß oder?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>weil ich ein serielles Signal mit Bitabständen von ca 40µs abtasten muss, >das ca 
2ms lang ist.
>Das Abtasten dauert ca. 3ms. Das ist die andere Aufgabe.
Wieso dauert das Abtasten länger als das Signal?

>Das Signale wird ca alles 50ms gesendet bzw vom Atmega8 empfangen. Um >sicher zu 
stellen, dass die Abtastung des Signals nicht irgendwo in der >Mitte des Signals 
beginnt, warte ich bei dem ersten detektierten >Flankenwechsel
Für sowas benutzt man auch gerne die ICP-Einheit, die auch im ATmega8 
vorhanden ist, sofern es sich um éin digitales Signal handelt.

>3ms bis der Interrupt wieder aktiviert wird, so dass die nächste Flanke
>garantiert der Signalanfang ist.
Darum kümmert sich dann die Hardware ganz von alleine.

>Wenn ich jetzt den Timer0 als Uhrentimer benutzen würde, wird dieser
>46,875 mal pro Sekunde ausgelöst (Prescaler 1024). Das wären dann alle
>21 ms. Also mit kommt das ziemlich knapp vor.

21ms sind verdammt lang für einen Controller.
Du solltest dein Programm-Konzept noch mal überdenken. (das hatte 
Karl-Heinz oben auch schon vorgeschlagen).

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast schrieb:
> @Karl heinz Buchegger:
> Wie soll das gehen? Wenn ich den Timer für etwas anderes als die Uhr
> benutze würde sie doch schnell ungenau werden?

Dein ganzes Konzept mit warten etc. klingt nach: Du gehst das alles 
völlig falsch an.

> Um sicher zu
> stellen, dass die Abtastung des Signals nicht irgendwo in der
> Mitte des Signals beginnt, warte ich bei dem ersten detektierten
> Flankenwechsel 3ms bis der Interrupt wieder aktiviert wird, so dass
> die nächste Flanke garantiert der Signalanfang ist.

Schon mal etwas von Input Capture gehört?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Gast (Gast)

>CPU Frequenz 12,288 MHZ. 32kHz sind zu langsam, weil ich ein serielles
>Signal mit Bitabständen von ca 40µs abtasten muss, das ca 2ms lang ist.

Wie sieht das denn genau aus?

>Das Abtasten dauert ca. 3ms. Das ist die andere Aufgabe.

Ja und? Bleiben noch 19ms zum La Paloma pfeifen.

> Das Signale
>wird ca alles 50ms gesendet bzw vom Atmega8 empfangen.

Eine kleine Ewigkeit.

> Um sicher zu
>stellen, dass die Abtastung des Signals nicht irgendwo in der Mitte des
>Signals beginnt, warte ich bei dem ersten detektierten Flankenwechsel
>3ms bis der Interrupt wieder aktiviert wird, so dass die nächste Flanke
>garantiert der Signalanfang ist.

???

>Wenn ich jetzt den Timer0 als Uhrentimer benutzen würde, wird dieser
>46,875 mal pro Sekunde ausgelöst (Prescaler 1024). Das wären dann alle
>21 ms. Also mit kommt das ziemlich knapp vor.

Wieso? Wenn du für deine (noch leicht konfuse) Abtastung den Timer bzw. 
Interrupts allgemein für 3ms sperrst, hast du noch 19ms bis zum nächsten 
Interrupt. Erst wenn dann der Interrupt nciht bedient wird, wird er 
verschluckt und deine Uhr geht falsch. Siehe Artikel Interrupt.

>Angenommen ich aktiviere den Interrupt zum abtasten des Signales immer
>am Ende eines Uhren Inerrupts.

Nöö, Finger weg. Du deaktivierst den Timer bestenfalls nach Erkennung 
der ersten Flanke deines ominösen Signals.

> Dann ist erstmal ungewisse wann das neue
>Signal kommt.

Wieso? Ich denke es kommt alle 50ms?

> D.h. ich würde vermutlich mit dem ersten oder dem zweiten
>Abtasten und der Uhr irgendwann kollidieren, weil sich irgendwas
>überlagert.

Nicht wenn man es richtig macht. Denk mal drüber nach.

>Und wenn der Uhreninterrupt in der Abtastung aktiv sein soll, kann man
>die abgetasteten Daten wohl wegschmeißen.

Beschreibe deine Daten mal genauer.

MfG
Falk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Denkfehler besteht darin, dass du in der Situation

* du sollst die Läufer eines Skirennens stoppen
* Ein Lauf dauert ~50 Sekunden
* Die Läufer starten alle 15 Sekunden
* gleichzeitig ist auch noch ein Rodelrennen im Gange
* aber dort startet nur alle 2 Minuten ein Teilnehmer
* du hast nur eine Uhr, und die hat noch nicht einmal eine Stoppuhr

verzweifelst, denn wie sollst du schliesslich 3 Läufer auf der Strecke 
gleichzeitig mit nur 1 Uhr stoppen.

Und die Lösung lautet:
Du registrierst, zu welchem Zeitpunkt was passiert

Läufer 1 startet um 12:30::15
Läufer 2 startet um 12:30::31
Rodler 1 startet um 12:30::35
Läufer 3 startet um 12:30::44
Läufer 1 geht durchs Ziel um 12:30::56
Läufer 4 startet um 12:31::02
Läufer 2 geht durchs Ziel um 12:31::19
Rodler 1 geht durchs Ziel um 12:31::23
....

Daraus kann man nun super die einzelnen Laufzeiten für jeden Skiläufer 
und Rodler errechnen.

Du lässt die Uhr einfach durchlaufen (bei dir ist das der Timer) und 
stellst die Uhrzeiten fest, an denen ein Ereignis passiert (bei dir ist 
das der konkrete Timerstand). Voilla: Mit einer Uhr (die noch nicht 
einmal eine Stoppuhr sein muss), kann man wunderbar ein Skirennen 
mitstoppen, selbst wenn gleichzeitig 5 Läufer auf der Piste sind.

Alles nur eine Frage der Organisation und ein wenig rechnen.
Dein Einwand wäre in diesem Szenario: Du kannst mir nicht auch noch 
gleichzeitig die aktuelle Uhrzeit sagen, sonst würde das Stoppen eines 
Rennläufers durcheinanderkommen. Und das das absurd ist, sollte 
mitlerweile klar geworden sein.

PS: besagter Input Capture hilft dir insofern, als er dir die Zeitpunkte 
sehr exakt feststellt an denen etwas passiert. Das 'Ablesen' der Uhr 
macht also die Hardware, du musst die Ergebnisse nur noch 
'niederschreiben und verrechnen'.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.