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?
@ 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_genaue_Sekunde_/_RTC Interrupt Multitasking MfG Falk
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.
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
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
@ 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
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....
@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/doc1259.pdf Der Timer 2 ist für den RTC-Mode mit eben 32,768 kHz ausgelegt da dies der Standartuhrenquarz ist. avr
>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.
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
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
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.
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.
@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?
>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).
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?
@ 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
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'.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.