Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeittakt über Uhrenquarz
Duesentrieb
19.07.2010, 21:29
Hallo,
ich benötige in einer Schaltung einen sekundengenauen Takt.
Uhrenquarze die bisher gefunden habe haben eine Frequenz von 32,768 kHz.
Kann mir jemand sagen wie ich ein solchen Quarz an einen Interrupteingang anschließen muss um einen Sekundentakt zu erzeugen?
Du könntest das mit einem Teiler machen. Erst durch 256 teilen dann durch 128. Vorrausgesetzt es gibt so große....andernfalls musst du öfters teilen....
Duesentrieb
19.07.2010, 22:04
das ist aber ganz schön aufwendig. Geht es auch einfacher (ohne 2 zusätzliche IC's)
Ich benötige doch "nur" einen Sekundentakt
Hallo,
ich benötige in einer Schaltung einen sekundengenauen Takt.
Uhrenquarze die bisher gefunden habe haben eine Frequenz von 32,768 kHz.
Kann mir jemand sagen wie ich ein solchen Quarz an einen Interrupteingang anschließen muss um einen Sekundentakt zu erzeugen?
Kommt auf deinen µC Typ an. Wenn du einen Mega mit TOSC Anschlüssen hast, kannst du ihn direkt dort anklemmen. Beim Mega16 geht das z.B. so. Beim Mega8 kannst du dann allerdings keinen externen XTAL anschließen, da es die gleichen Pins sind.
Duesentrieb
19.07.2010, 22:14
o.k. ich habe einen Mega32. TOSC1 und 2 sind dort vorhanden.
Bisher ahbe ich damit aber noch nichts gemacht.
Hast du ein Beispiel in Bascom?
Lies dir mal die Hilfe zu
Config Clock = Soft
durch. Dort ist erklärt, welche Variablen damit automatisch definiert werden und was der Sinn des SECTIC Labels ist.
Duesentrieb
19.07.2010, 22:27
wow - Super!
Aber wie "aktiviere" ich die TOSC Eingänge bzw. wie erfährt der Chip dass dort eine Quarz angeschlossen ist?
Macht Bascom automatisch, wenn du
Config Clock = Soft
angibst.
Duesentrieb
20.07.2010, 09:18
Super- Danke!
Benötige ich an den Pins auch noch Kondensatoren oder reicht das Quarz aus?
mat-sche
20.07.2010, 09:21
es reicht wenn Du den Quarz direkt anschließt.
Duesentrieb
21.07.2010, 07:47
Hallo zusammen,
das Quarz ist angeschlossen und ich habe gleich mal das Beispiel aus der Hilfe aufgespielt.
Die Uhr läuft jedoch nicht mit der richtigen Frequenz. Sie geht in jeder Minute ungefähr 5 sec nach.
Den reguläre Takt meines Mega32 gibt ein 7,3728 MHz Quarz vor.
Hat der vielleicht einen Einfluss auf den takt des Uhrenquarz?
Müssen evtl. die Fuse verändert werden?
Ich hatte einmal eine Schaltung mit externen Uhrenbaustein,
An dessen Quarz waren sehr wohl Kondensatoren, einer sogar
als Trimmer zum genauen Abgleich (ziehen der Quarzfrequenz).
Gruß Richard
Für sowas muss man ins Datenblatt schauen. Bei der DS1307 z.B. werden keine externen Kondensatoren gebraucht. Diese könntest du z.B. auch nehmen, da der Baustein einen AUsgang hat wo ein Rechteck mit einer bestimmten, einstellbaren Frequenz rauskommt. Unter anderem kannst du da auch 1 Hz einstellen. Und die RTC ist von sich aus schon sehr genau. Und da musst du auch nicht viel bei machen außer anschließen und ein passendes I²C Programm zu schreiben.
er hat aber keine externe RTC dran, sondern arbeitet
mit dem internen Timer und Uhrenquarz.
Die Quarze sind mehr oder weniger genau, aber so in
etwa sollte es hin kommen. 5 Sec. in der Minute ist
aber zu viel Abweichung.
Dann sollte man wissen welcher Quarz genau verwendet
wurde (-> Datenblatt) und ob der auch an den ATMega passt.
Dann kommts noch auf das Programm an, wenn der µC z.B.
in einer anderen ISR Ewigkeiten bummelt kann da schon mal
ne Sekunde verloren gehen (-> Programm / Quellcode).
Hallo!
Ich kenne die AVR nicht genug, aber vielleicht könnte der Tread behilflich sein: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=42631& .
MfG
Hab mal ein bischen das Datenblatt von Atmel durchstöbert und die schreiben da auch das kein zusätzlicher Kondensator benötigt wird (Seite 31).
Desweiteren müssen auch keine Fuses gesetzt werden. Das macht Bascom automatisch sobald die "Soft Clock" funktion aufgerufen wird.
Besserwessi
22.07.2010, 18:40
Bei den Uhrenquarzen gibt es verschiedene Typen, je nach typ müssen die Konensatoren andere Werte haben, um die nominelle Frequenz zu erreichen. Bei einigen Quarzen kann man mit einem extra Trimmkondensator noch was retten, wenn die benötigete Kapazität kleiner als die interne ist, wird es schwer.
Eine Abweichung von 5 s je minute ist aber reichlich groß. So weit läßt sich die Quarzfrequenz normal kaum verstellen. Das spricht schon mher für ein Softwareproblem.
Hallo!
Ich habe sowas bei mißerfolgten Versuchen beobachtet, und festgestellt, dass der Qüarz sich als Kondensator verhält und weit von seiner eigener Rezonanzfrequenz oszilliert.
Es ist reine Hardwaresache, weil in meinem µC gar kein Programm gelaufen ist. Mit dem in o.g. Link skizziertem Generator habe ich bisher gar keine Probleme gehabt und konnte die Taktfrequenz mit dem Kondensator (Trimmer) sehr genau einstellen.
Die Uhrenquarzen besitzen eben großen inneren Widerstand und arbeiten am besten mit seriellem Rezonanz.
MfG
mat-sche
22.07.2010, 20:13
Hi,
ohhh, ich nutze ja gar keinen Uhrenquarz... :-b :-b
im Anhang mal meine Lösung. Ich nutze einen 32kHz Resonator der auch in Verbindung mit einen DS1307 über eine 3V Litiumzelle bei Stromausfall weiter arbeitet. Das ganze werkelt gemeinsam mit einem DCF77 Funkuhrenmodul zusammen. Somit habe ich nicht nur eine Zeit sondern auch noch das Datum dazu :D.
Bei Codefragen einfach schreiben...
Gruß MAT
Duesentrieb
23.07.2010, 11:08
Hallo zusammen,
ich habe mir das ganze nun nochmal vorgenommen.
Konfig:
Atmega32 mit 7,3728 MHz
Alles Fuse ausgeschaltet (Hacken raus über Ponnyprog).
An den TOSC 1 und 2 Ausgängen hangt das Uhrenquarz vom Typ http://www.conrad.de/ce/de/product/156007/QUARZ-MH32768C/SHOP_AREA_29142&promotionareaSearchDetail=005
Kondensatoren sind daran nicht vorhanden!
Als Programm habe ich den Beispielcode aus Bascom genommen.
Ergebnis:
Nach 24 Std Laufzeit ergibt sich eine Abweichung <1s
D.h. Die Grundfunktion über das Uhrenquarz ist gegeben. Was allerdings einen wesentlichen Einfluss hat ist der Rest vom Programm der nebenbei ja auch noch abgearbeitet werden muss.
Ich bin eingentlich davon ausgegangen dass das weitere Programm keinen Einfluss auf die Funktion das Uhrenquarz bzw. dessen Takt an den beiden speziellen Pins des A32 hat und ich eine genaue Zeit bzw. einen Minuenimpuls, um den es mir ging, bekomme.
in 24h weniger als 1 Sekunde Abweichung ist soweit im Rahmen, die Quarze haben auch Abweichungen, z.B. über Temperatur.
Ja, der Quarz läuft programmunabhängig, aber der Timer Interrupt nicht.
Wenn Ein AVR in einer Interruptroutine drinnen ist ignoriert er weitere
Interrupts bis diese abgearbeitet ist.
Dauert eine Interruptroutine länger als eine Sekunde wird diese verschluckt.
Aus diesem Grund hält man Interruptroutinen immer sehr kurz.
Ich weiß nicht, ob die AVR,s auch für Interrupts definierbare Prioriteten haben. Wenn ja, könnte man dem Uhrinterrupt höchsten Priorität zuweisen und er wird nie durch andere unterbrochen.
Wenn nicht könnte man bei jedem Interrupt nur ein Flag setzen und die Interrupts im Hautprogramm in gewünschter Reihenfolge mit Prioritäten bearbeiten. ;)
MfG
Also im Datenblatt vom Mega32 steht folgendes:
The list also determines the priority levels of the different interrupts. The lower the address the higher is the
priority level. RESET has the highest priority, and next is INT0 – the External Interrupt Request0. The Interrupt Vectors can be moved to the start of the Boot Flash section by setting the IVSEL bit in the General Interrupt Control Register (GICR).
Das bedeutet denk ich mal soviel wie Prio 1. RESET Prio 2. Int0 Prio 3. Int1 Prio 4 Int2
Ich denke sowas meintest du oder? 8-[
Genau um so was ist mir gegangen, Kampi ! :)
So wie es sehe, lassen sich die Prioritäten in BASCOM jedoch nicht beliebig definieren, oder ? 8-[
Ich als PIC Benutzer brauche AVR's nicht so gut kennen, dafür gibt es andere Spezialisten, wie du ...
Wenn ich aber irgendwann irgendwas mit PIC nicht realisieren könnte, würde ich dafür gerne einen AVR mit ASM oder ungern mit BASCOM nehmen ...
MfG
Öhh wie das mit der Deffinition ist weiß ich gerade nicht so recht muss ich gestehen :-b .
Aber ich vermute mal ziemlich stark das der Compiler das von sich aus schon macht. Weil du nach dem Interrupt Befehl ja noch schreiben musst um welchen Interrupt es sich handelt.
Soweit ich in der Bascom Hilfe richtig geschaut habe ist der XMega der einzigste Chip wo man die Priorität der Interrupts konfigurieren muss. Bei allen anderen macht es der Compiler automatisch.
Edit: Hab einen Fehler gemacht. Die Interrupts haben keine unterschiedlich hohen Prioritäten sondern es ist so, dass wenn ein Interrupt ausgelöst wurde und es wird ein zweiter ausgelöst dann muss der zweite warten bis der erste abgearbeitet ist.
Steht hier nochmal genauer
-> http://www.mikrocontroller.net/topic/83787
Danke sehr vor allem für den Link ! :)
Jetzt ist mir alles Klar und ich sehe deutlich, dass wenn jemand, wie ich, hardwarenahe programmieren will, eignet sich dafür BASCOM, wie meisten Hochsprachen ausser C, leider nicht ... :(
MfG
Naja du kannst im Bascom auch mitten im Programm auf Assembler umswitchen und dann ein Mixprogramm aus Basic und Assembler machen.
Wenn man allerdings Prioritäten für die Interrupts festlegen will muss man auf einen XMega wechseln und das entweder auf Registerebene proggen(glaube so geht das ohne Bascomvollversion?) oder man kauft sich das Programm :)
Ich habe früher gemischte Programme in QBASIC für PC (80286, 80283, und 80284) geschrieben, mir ist aber für µC ohne Betriebsystem rein ASM lieber, weil einfacher ... :)
MfG
Ich habe früher gemischte Programme in QBASIC für PC (80286, 80283, und 80284) geschrieben, mir ist aber für µC ohne Betriebsystem rein ASM lieber, weil einfacher ... :)
MfG
G*** Leider muss Mensch dann aber für jeden Chip Typ das
Datenblatt auswendig lernen....Aus diesem Grund habe ich in
ASM Zeiten nur alle xyz Jahre den Prozessor gewechselt. Kennt
man den Chip allerdings in und auswendig, ist ASM recht einfach. :-)
Gruß Richard
Eigentlich muss man nur die innere Struktur des µC's, SFR- und Befehlliste vor Augen haben und das Assemblerprogramm genug kennen. Den Rest lernt man ziemlich schnell aus Fehler, oder ? 8-[
Das eigentliche ASM Programm ist für mich, von der Struktur, immer gleich. Ich benutze, aus eingeborener Faulheit, momentan PIC's mit 35/75 Befehlen, habe aber nach dem Z80 mit ca. 1000 Befehlen keine Angst mehr vor beliebigen µC (z.B. AVR) ... :)
MfG
nein, AVRs haben keine Prioritäten.
Kannste nur per kurzer ISR und Flags setzen
lösen. Dann noch ne ganz ausgefuchste Statemachine
und Du kannst ne Priorisierung erreichen ... ist aber
mehr Aufwand als für die Aufgabe gerechtfertigt.
Eigentlich muss man nur die innere Struktur des µC's, SFR- und Befehlliste vor Augen haben und das Assemblerprogramm genug kennen. Den Rest lernt man ziemlich schnell aus Fehler, oder ? 8-[
MfG
Stimmt auch wieder, ich bin mit 6502/6510/8051 und PIC
"groß geworden". Sehr viel umdenken musste man im Grunde
nicht wirklich. :-)
Das schöne an Bascom ist halt (Man Darf faul sein) und Kopiert
sich sein Programm auf die Schnelle zurecht. Geht aber auch mit
ASM wenn Mensch sich erst einmal genug Standard aufgaben in
einer Lib gespeichert hat. Dann besteht das Hauptprogramm fast nur
noch aus Call xxxx......Ich hatte mir einmal eine Serielle I/O mit
automatischer Baudraten Erkennung gebaut, ging ganz gut.:-)
Gruß Richard
Gruß Richard
nein, AVRs haben keine Prioritäten.
Kannste nur per kurzer ISR und Flags setzen
lösen. Dann noch ne ganz ausgefuchste Statemachine
und Du kannst ne Priorisierung erreichen ... ist aber
mehr Aufwand als für die Aufgabe gerechtfertigt.
Soweit ich das Verstanden habe ist das bei XMegas dann aber mit Prios gemacht worden.
Config Priority
Action
Configures the interrupt system and priority for Xmega
Syntax
CONFIG PRIORITY= prio, VECTOR= vector, HI= hi, LO= lo, MED= med
Oder verstehe ich das falsch? 8-[
Wobei man davon ausgehen kann das nicht jeder Mensch ein XMega benutzt....vorallem da die kein ISP haben *weint*
Ja und das mit dem faul sein ist das schöne an Bascom. Nur der Nachteil ist das man sich selten in das Programm rein denkt und auch in die abläufe.
sind wir beim xmega oder beim 8-bitter avr?
beim xmega muss ich passen, noch nicht verwendet.
was die Hardwarenähe angeht ... man muss ja die highlevelbefehle
von bascom nicht verwenden, mitunter ist es sogar sinnvoll das nicht
zu tun, sondern direkt auf den Registern zu arbeiten ...
spart ausführungszeit und erleichtert sogar manchmal das debuggen.
ich verwende die bascominternen praktisch nur bei komplexen berechungen,
schleifen und verzweigungen ... ansonsten lieber direkt.
was die interrupts angeht ...
man kann in einer ISR wiederum interrupts enablen .... aber das debuggen
wird da nicht einfacher, stichwort stack und frame
Naja braucht er überhaupt mehr als 1 Interrupt? Er will ja nur einen Sekundengenauen Timer und da reicht 1 Interrupt ja vollkommen aus oder? 8-[
Was den XMega angeht.....gearbeitet hab ich damit auch noch nicht. War mehr oder weniger eine Verständnissfrage :)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.