www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Uhrenquarz und PIC16F627A


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte mir eine Uhr mit einem Microcontroller bauen (PIC16F627A), 
und dazu verwende ich einen Uhrenquarz 32,768kHz: 
http://www.reichelt.de/?ACTION=3;ARTICLE=1089;PROVID=2402 (hat 10pF)

Es ist allerdings das erste Mal, dass ich so einen langsamen Quarz 
verwende, vorher habe ich immer ein 4MHz-Quarz verwendet, mit zwei 22pF 
gegen Masse. Im Config-Word vom PIC besteht die Möglichkeit, zwischen XT 
(normales Quarz) oder LP (low power crystal) zu wählen. Muss ich da 
zweiteres wählen?

Was ist nun bei dem langsameren Quarz zu beachten? Ich habe im 
Zusammenhang zu Uhrenquarzen meistens 33pF als Massekondensatoren 
gefunden. Wie kommt mensch auf diesen Wert? Und was würde sich als 
Trimmkondensator zur Feinjustierung empfehlen?

Viele Fragen, ich weiß. Ich danke euch jetzt schon für eure Hilfe.

Viele Grüße
Jens

Autor: pic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm den internen Takt (OSC) und verbinde das Quarz am Timer1 . Der hat 
einen eigenen Oszillator extra für Uhrenquarze, welcher auch während 
eines
sleep funktioniert. Genaueres im Datenblatt bei der Beschreibung des
Timer1.

Autor: usuru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schliess den Uhrenquarz an Timer1 an, Kondis laut Datenblatt 2x 15pF. 
Timer1 generiert Interrupts, die schalten die Uhr weiter. Den Rest 
(Anzeige etc.) machst Du im Hauptprogramm, das läuft mit dem internen 
Oszillator (4MHz oder 48kHz).

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für eure Antworten.

Vielleicht habe ich mich unklar ausgedrückt, aber ich würde gerne den 
PIC mit den 16kHz als Haupttakt betreiben, weil der nunmal nicht sehr 
viel mehr machen muss als zehn LEDs anzusteuern. Das wird ein 
batteriebetriebenes Gerät, das nur auf Knopfdruck die LEDs 
durchschaltet. Daher sollte der PIC möglichst wenig Strom ziehen (i.e. 
mit geringerem Takt laufen).

Was muss ich speziell beachten, wenn ich den PIC mit 16kHz laufen lassen 
möchte?

Gruß & gute Nacht
Jens

Autor: HerrSchrader (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nichts.
Bei mir läuft ein 16F628 auch mit 32768 Hz Uhrenquarz. Ganz normal 
beschalten. Die Kondensatoren sind m.E. unkritisch.

Der Tip mit Timer1 ist allerdings richtig. Wenn Timer1 läuft, kann der 
ganze Rest vom PIC schlafen und verbraucht so nur minimal Strom.

Bei mir ist der Uhrenquarz nur deshalb der Haupt-Takt, weil ich vorher 
einen PIC ohne internen Oszillator vorgesehen hatte.

Gruß
HerrSchrader

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, die Tips zum Timer1 hören sich in der Tat praktisch an, da habt ihr 
schon Recht. Die Schaltung ist bateriegepuffert [die werden bei 
Stromausfall über ein Relais zugeschaltet], und wenn am Pin RB2 (habe 
ich willkürlich gewählt) auf einmal nur noch eine digitale null anliegt, 
dann sage ich dem Controller SLEEP ();, um Strom zu sparen, weil er ja 
nun an den Batterien hängt.

Also ich stelle mir die vorherige Konfigurationen dann so vor:

Ich setze im Config-Word den Oszillator-Modus auf INTOSC (RA6 und RA7 
sind dann als IOs verwendbar). Der PIC läuft dann mit internem Takt (ich 
werde hier 4MHz auswählen weil ich noch PWM brauche).

Globale Interrupts sind aktiviert (GIE = 1).

Dann schalte ich Timer1 an (TMR1ON = 1), setze den Prescaler auf 1:8 
(T1CKPS = 0b11), und sage ihm, er soll als Timer arbeiten (TMR1CS = 0), 
und den externen Takt, also die 32768Hz, dazu benutzen (T1OSCEN = 1). 
Den Uhrenquarz schließe ich dann an RB6 und RB7 an, mit 
15pF-Kondensatoren. Zudem setze ich den Power-Up-Timer (PWRT = 1) damit 
das Uhrenquarz einschwingen kann.

Dann muss noch der Interrupt bei Überlauf des Timer1 aktiviert werden 
(TMR1IE = 1), und in der ISR wird dann einfach geschaut, ob TMR1IF == 1. 
Dort wird ein Zähler auf 4096 hochgezählt, und wenn der resettet, dann 
ist eine Sekunde um, und die Uhrzeit wird geupdatet.

In der ISR kann er dann auch überprüfen, ob an RB2 immer noch eine Null 
liegt. Wenn ja, dann gehe wieder schlafen ( SLEEP (); ), aber wenn dort 
eine 1 liegt, dann bleibe wach (das macht er doch, wenn ich ihm nicht 
explizit erneut schlafen lege, oder?).

Puhh, das war viel Text, aber mir würde es sehr gut helfen, wenn da 
jemand, der das schonmal gemacht hat, drübersehen könnte. Ich hab 
bestimmt etwas falsch verstanden und/oder vergessen.

Danke für eure Hilfe.

Jens

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(nur der Vollständigkeit halber, die Lösung findet sich hier: 
Beitrag "Timer1 läuft nicht an bei Uhrenquarz")

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.