Forum: Mikrocontroller und Digitale Elektronik Der Anfänger und die ungenaue Binäruhr (PIC)


von Rainer Z. (doomkeks)


Angehängte Dateien:

Lesenswert?

Tach, Ich habs nun auch endlich mal geschafft mich in die Materie µC 
einzuarbeiten.
Hier wird ein PIC 16F1503 (14Pin) verwendet. Leds sind gemuxt.

Dachte ich fange mal mit einer Binäruhr in Assembler an.
Bin mit dem Verlauf des Projekts auch sehr zufrieden, nur schaffe ich es 
einfach nicht eine ausreichende Genauigkeit mit dem internen Takt 
(16MHz) zu erreichen.

Mir scheint es als ob der Takt extrem schwanken würde. (Temperatur??, 
Strom??, Spannung??)
Manchmal geht die Uhr 1s/h zu schnell mal 1s/h zu langsam, ohne dass ich 
Hard- oder Software verändere.

Das "Uhrwerk" funktioniert mit Delayschleifen, ohne Timerinterrupt.
Als Interrupt sind lediglich die Taster zum Uhrstellen programmiert.
Alles läuft prima nur krieg ich keine Genauigkeit hin.

Das ist ärgerlich weil ich gerade kurz davor war alles in ein schönes 
Gehäuse für Wandmontage zu bauen (Bilder folgen).

Bringt es was wenn ich die Leds alle über Transistoren schalte um den 
Sourcing Strom des µC zu verringern? (Der max. Strom wird im Moment 
nicht erreicht.)
Oder hab ich einfach Pech gehabt und muss einen externen Schwinger 
verwenden?

(Ja, so eine Frage wurde garantiert schon mal irgendwo im Netz 
beantwortet. Aber es ist gerade für mich als Anfänger extrem Mühsam und 
frustrierend mich da durchzuwühlen. Die neuen PICs sind auch noch nicht 
so gut dokumentiert.)

Dankeee

: Verschoben durch Moderator
von Me (Gast)


Lesenswert?

Rainer Zufall schrieb:
> nur schaffe ich es
> einfach nicht eine ausreichende Genauigkeit mit dem internen Takt
> (16MHz) zu erreichen.

Mit dem internen Takt schafft man nie eine ausreichende Genauigkeit. Ein 
Quarz ist hier unbedingt notwendig.

Rainer Zufall schrieb:
> Das "Uhrwerk" funktioniert mit Delayschleifen, ohne Timerinterrupt.
> Als Interrupt sind lediglich die Taster zum Uhrstellen programmiert.

Zwei weitere Punkte, die der Genauigkeit entgegenstehen. Die Zeit zählt 
man normalerweise mittels Timerinterrupt, die Tasten dagegen fragt man 
nur in Ausnahmefällen per Interrupt ab.

Rainer Zufall schrieb:
> Alles läuft prima nur krieg ich keine Genauigkeit hin.

Kein Wunder. Dein Konzept ist völlig verkehrt.

von Max H. (hartl192)


Lesenswert?

Rainer Zufall schrieb:
> Manchmal geht die Uhr 1s/h zu schnell mal 1s/h zu langsam, ohne dass ich
> Hard- oder Software verändere.
So ist der interne Oszillator nun mal, für eine Uhr brauchst du einen 
Quarz
> Das "Uhrwerk" funktioniert mit Delayschleifen, ohne Timerinterrupt.
Sind die Delays auf den Taktzyklus genau angepasst, das weiterzählen der 
Zeit usw. braucht auch seine Zeit, mit einer Delayschleife von genau 1s 
wird deine Uhr zu langsam gehen.
Ich würde es mit einem 32768Hz Uhrenquarz und per Timerinterrupt machen.

> Bringt es was wenn ich die Leds alle über Transistoren schalte um den
> Sourcing Strom des µC zu verringern? (Der max. Strom wird im Moment
> nicht erreicht.)
Nein
> Oder hab ich einfach Pech gehabt und muss einen externen Schwinger
> verwenden?
Pech würde ich das nicht nennen...

> Die neuen PICs sind auch noch nicht
> so gut dokumentiert.
Ich finde das Datenblatt des PIC16F1503 ist nicht schlechter als z.B. 
das eines 16F877A.

: Bearbeitet durch User
von Helge A. (besupreme)


Lesenswert?

Auf meiner Werkbank wäre ein Uhrenbaustein zusätzlich dabei. Der läuft 
nämlich auch weiter bei Stromausfall, wenn der eine Batterie oder einen 
Goldcap dran hat.

von Guest (Gast)


Lesenswert?

> Forum: Projekte & Code
> Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel vorstellen
> und diskutieren. Bitte hier keine Fragen posten

von MaWin (Gast)


Lesenswert?

Me schrieb:
> Ein Quarz ist hier unbedingt notwendig.

Und zwar ein 32kHz Uhrenquartz wenn man uhrengenau sein will
und kein 4 oder 8 oder 16MHz Standardquartz, die weichen schon mal 
mehrere Sekunden am Tag ab.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Guest schrieb:
> Forum: Projekte & Code
> Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel vorstellen
Richtig: Falsch! Verschoben.

Rainer Zufall schrieb:
> Mir scheint es als ob der Takt extrem schwanken würde.
Das ist also das Problem. Und das hier die Lösung:
> Das "Uhrwerk" funktioniert mit Delayschleifen
Das ist wie "Auto mit Schaltgetriebe ohne fahren und sich wundern, dass 
es manchmal spanabhebend rappelt"...

von Peter D. (peda)


Lesenswert?

Rainer Zufall schrieb:
> Das "Uhrwerk" funktioniert mit Delayschleifen, ohne Timerinterrupt.

Das wird so nix.
Zwischen den Delays läuft ja Programmcode und der braucht je nach 
if/else immer unterschiedlich lange.

Es soll mal Freaks gegeben haben, die haben dann immer den kürzeren 
Zweig mit NOPs aufgefüllt, bis alles die gleiche Zeit brauchte. Aber man 
kann seine Zeit auch sinnvoller nutzen.

Nen Timerinterrupt brauchst Du eh, um das Multiplexen flackerfrei 
hinzubekommen. Und der teilt praktischer Weise gleich auf die Sekunde 
runter.

Und wir schon gesagt wurde, Du brauchst irgendeinen Quarz, sonst bleibt 
das ein Zufallszahlengenerator.

von Georg (Gast)


Lesenswert?

Hallo,

was falsch ist am Konzept:

1. Ein interner Oszillator ist um Grössenordnungen zu ungenau für eine 
Uhr*, selbst einen Quarz muss man noch abgleichen, wenn man die 
Genauigkeit einer handelsüblichen Quarzuhr erreichen will. Für so einen 
Abgleich braucht man natürlich eine entsprechend genaue Referenz oder 
viel Zeit. Aber Quarz ist das mindeste.

* So etwa wie eine Sanduhr. Als Eieruhr ginge es.

2. Zeit muss gemessen werden mit einem Interrupt nach immer genau 
gleicher Timerkonstante, z.B. immer genau 10 ms.

3. Ein Uhr die ohne Strom alles vergisst ist weitgehend nutzlos. Daher 
muss der Controller mit Batterie weiterlaufen oder man nimmt gleich 
einen externen RTC-Chip mit Batterieversorgung.

Georg

von Rainer Z. (doomkeks)


Lesenswert?

Danke für die vielen Tipps!

Werde dann wohl den größeren Bruder 16f1508 (20 pin) mit Uhrenquarz und 
Timerinterrupt verwenden.
Hatte anfangs einfach nicht gedacht dass der interne Takt so stark 
schwankt.

>die Tasten dagegen fragt man nur in Ausnahmefällen per Interrupt ab.
Das wusste ich nicht. Warum wird das so gehandhabt?

>Nen Timerinterrupt brauchst Du eh, um das Multiplexen flackerfrei
>hinzubekommen.
Bei mir flackert nichts ;)

>Ein Uhr die ohne Strom alles vergisst ist weitgehend nutzlos.
Och ist doch bei sämtlichen Radioweckern auch so. Das macht mir nichts 
aus, wird sowiso permanent am Netzteil hängen.
Das soll mehr ein Hingucker als eine Gebrauchsuhr werden ;)

Mit dem DCF77 Signal wollte ich auch mal etwas experimentieren, 
allerdings nicht bei diesem Projekt.

von Max H. (hartl192)


Lesenswert?

Rainer Zufall schrieb:
>>die Tasten dagegen fragt man nur in Ausnahmefällen per Interrupt ab.
> Das wusste ich nicht. Warum wird das so gehandhabt?
Weil mechanische Taster prellen und mit einem Druck mehrere Interrupts 
auslösen können und Entprellung einfacher im Timer Interrupt geht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Rainer Zufall schrieb:
>> die Tasten dagegen fragt man nur in Ausnahmefällen per Interrupt ab.
> Das wusste ich nicht. Warum wird das so gehandhabt?
Ein so schnarchlangsames Event wie einen Taster, der ja sicher gleich 
mal 100ms betätigt wird, braucht keinen Interrupt. Den kann ich mit 
einem 1ms Timer hundertmal pollen.
Und bekomme so garantiert kein Semaphorenproblem mit sich gegenseitig 
verriegelnden Interrupts und Prioritätsinversionen...

: Bearbeitet durch Moderator
von Toxic (Gast)


Angehängte Dateien:

Lesenswert?

Rainer Zufall schrieb:
> Werde dann wohl den größeren Bruder 16f1508

Nimm doch den Pic16f883
Reichelt hat den fuer 2€
Sein Timer 1 ist speziell fuer nen normalen Uhrenquarz (32.768 
kHz)ausgelegt - da kannste dann deinen Sekundentakt problemlos erzeugen

http://www.reichelt.de/PIC-16F883-I-SP/3/index.html?&ACTION=3&LA=446&ARTICLE=89327&artnr=PIC+16F883-I%2FSP&SEARCH=16f883

von X4U (Gast)


Lesenswert?

Rainer Zufall schrieb:
> Manchmal geht die Uhr 1s/h zu schnell mal 1s/h zu langsam, ohne dass ich
> Hard- oder Software verändere.

1 Stunde hat 3600 Sekunden. Die Abweichung von +/- 1 Sekunde sind also 
~0,03% oder 300 ppm. Für einen internen Oszillator (und dein 
Assemblerprogramm) schon ganz ordentlich.

Uhrenquarze sind ohne Abgleich auch nur 10 - 20x genauer.

von Joachim B. (jar)


Lesenswert?

Me schrieb:
> die Tasten dagegen fragt man
> nur in Ausnahmefällen per Interrupt ab.

wieso?

Me schrieb:
> Kein Wunder. Dein Konzept ist völlig verkehrt.

der obige Satz passt für mich nicht zu dem hier

Ich frage die Tasten grundsätzlich im Interrupt ab, erstens werden die 
dann immer abgefragt, entprellt und egal wann ich das Ergebnis wissen 
will entgeht mir kein Tastendruck, erst wenn ich das Ergebnis verabeitet 
habe ist der Tastendruck wieder freigegeben, wird also als erkannt 
gelöscht, natürlich wenn der in 1 Sekunde bis 10 Stunden nicht mehr 
interessiert liegt es an mir den gespeicherten Tastendruck zu verwerfen.

Am AVR kann ich auch den internen Oszi kalibrieren für eine gewünschte 
Temperatur.

: Bearbeitet durch User
von Ingo (Gast)


Lesenswert?

Joachim B. schrieb:
> Am AVR kann ich auch den internen Oszi kalibrieren für eine gewünschte
> Temperatur.
Is aber trotzdem völliger Quatsch den für eine Uhr zu benutzen, denn 
dafür gibts ja extra Quarze. Am genausten ist sowieso eine netzgeführte 
Uhr, jedenfalls auf Dauer.

Zur Not noch n RV3049 drauf falls mal n Netztausfall passiert oder das 
Ding vom Netz getrennt wird. Dann noch schnell die aktuelle Uhrzeit in 
die RTC, diese läuft dann weiter, und beim nächsten Start die Uhrzeit 
wieder abholen und fertig is die Laube.

von Noch einer (Gast)


Lesenswert?

Apropos Steckbrett...

So ein Uhrenquartz ist recht empfindlich. Schon ein paar cm Leitung 
fangen Störungen ein und deine Uhr geht falsch. Leitungsführung und 
Abschirmung im Datenblatt solltest du ernst nehmen.

von Joachim B. (jar)


Lesenswert?

Ingo schrieb:
> Is aber trotzdem völliger Quatsch den für eine Uhr zu benutzen,

ist das so?
wenn einer anfängt zu lernen zu basteln?

Ist es nicht genauso Quatsch sich Löcher in die Haut zu stechen, Tinte 
unter die Haut zu jagen, in einer Stadtwohnung 10 Hunde zu halten oder 
30 Katzen?

Ist es nicht Quatsch Autos über 1000 PS zu bauen und zu kaufen?
Ist es nicht Quatsch Werbung in UHD zu sehen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> Ich frage die Tasten grundsätzlich im Interrupt ab
Es ist ja auch etwas grundlegend anderes, Tasten im Timer-Interrupt 
abzufragen als sie per Pinchange-Interrupt abzufragen. Ersteres ist 
deterministisch und leicht beherrschbar. Die zweite Lösung bringt Chaos 
und Aufwand. Nicht, dass jetzt einer meint, Taster gehörten per 
Interrupt ausgewertet...

: Bearbeitet durch Moderator
von Ingo (Gast)


Lesenswert?

Joachim B. schrieb:
> wenn einer anfängt zu lernen zu basteln?
Wenn er sich über die Ungenauigkeit wundert schon

> Ist es nicht genauso Quatsch sich Löcher in die Haut zu stechen, Tinte
> unter die Haut zu jagen
Wenn man sich anschliessend drüber beklagt, dass es nicht abzuwaschen 
ist schon

>in einer Stadtwohnung 10 Hunde zu halten oder 30 Katzen?
Wenn man keinen Dreck mag schon

> Ist es nicht Quatsch Autos über 1000 PS zu bauen und zu kaufen?
Wenn man sich über die hohen Kraftstoffrechnungen ärgert schon

> Ist es nicht Quatsch Werbung in UHD zu sehen?
Wenn man keinen UHD-TV besitzt schon

von Rainer Z. (doomkeks)


Lesenswert?

>Nimm doch den Pic16f883
>Sein Timer 1 ist speziell fuer nen normalen Uhrenquarz (32.768
>kHz)ausgelegt - da kannste dann deinen Sekundentakt problemlos erzeugen
Habe ich da nicht das selbe Problem mit einem ungenauen internen Takt?

Uhrequarze kosten ja faktisch nichts. Und so spare ich mir auch die 
Verwirrung mit einer weiteren PIC Familie. (Habe schon viel mit dem 
18F45k20 gemacht)

Mir liegt es eher an einem Quarz mit konstanter Frequenz. Die Abweichung 
korrigiere ich dann einfach per Software. Nur schwanken darf die 
Frequenz eben nicht.
Als Frequenzzähler steht ein Digilent Analog Discovery 
(http://youtu.be/Aymumu3mYl8) zur Verfügung.

>Apropos Steckbrett...
>So ein Uhrenquartz ist recht empfindlich.
Gut zu wissen.

>Ich frage die Tasten grundsätzlich im Interrupt ab
Also bei mir hat das auch keine Probleme gemacht. Entprellen mach ich 
einfach im Interrupt. War jetz für mich irgendwie die logischere 
Vorgehensweise.

>Ist es nicht Quatsch Werbung in UHD zu sehen?
grübel :D

von Max H. (hartl192)


Lesenswert?

Rainer Zufall schrieb:
> Entprellen mach ich einfach im Interrupt.
Wie? In welchem Interrupt?

von Rainer Z. (doomkeks)


Lesenswert?

Interrupt wird ausgelöst wenn ein Taster zum Uhrstellen betätigt wird.

Interrupt on Chagnge -> Interruproutine wird abgearbeitet -> ~10ms Delay 
-> Button noch gedrückt? -> Interrupt verlassen

In meinem Fall wird der Sekundenanzeiger bei jedem Interrupt resettet.
Interrupts sind nur während der Delayschleife für den Sekundentakt 
erlaubt.
(In der sich der PC zu 99,xxx% der Zeit befindet)

Das mag fernab von jeglicher Norm sein aber so kam es mir in den Sinn 
und es funktioniert. ;)

: Bearbeitet durch User
von Noch einer (Gast)


Lesenswert?

> Nur schwanken darf die Frequenz eben nicht.

So ein Uhrenqarz schwankt so 0,05 ppm/C° ein MHZ-Quarz meist 0,2 ppm/C°. 
Dazu kommen noch so 1 ... 5 ppm Drift pro Jahr.

Genauer als 1/10 Sekunde pro Tag wird es mit einem Quarz auch nicht.

von Karl H. (kbuchegg)


Lesenswert?

Noch einer schrieb:
>> Nur schwanken darf die Frequenz eben nicht.
>
> So ein Uhrenqarz schwankt so 0,05 ppm/C° ein MHZ-Quarz meist 0,2 ppm/C°.
> Dazu kommen noch so 1 ... 5 ppm Drift pro Jahr.
>
> Genauer als 1/10 Sekunde pro Tag wird es mit einem Quarz auch nicht.

Und vorausgesetzt der Quarz ist mit den Ziehkondensatoren auch möglichst 
genau auf 32768Hz abgeglichen. Denn auch Quarzuhren müssen vom Uhrmacher 
abgeglichen werden.

von Toxic (Gast)


Lesenswert?

Rainer Zufall schrieb:
> Verwirrung mit einer weiteren PIC Familie

Kann ich nicht ganz nachvollziehen.Der PIC16(L)F1508/9 und PIC16F883 
sind nicht so verschieden.Der PIC1508 ist ein enhanced Typ - hat ein 
paar Befehle mehr,aber keine die Dich verwirren sollten.Wenn Du den 
PIC16(L)F1508/9 programmieren kannst,dann den PIC16F883 allemal.
=================
Fuer einen Taktgeber ist der Uhrenquarz ideal - nicht umsonst hat er die 
32.768 kHz und nicht umsonst hat Microchip dem Timer 1 noch diese 
Oszillatorfunktion spendiert.Da gibt es kein "Gepfusche" mit NOPs und 
Verzoegerungschleifen.
=================
Die 32.768 kHz Hardwarefunktion ist jederzeit der Softwareloesung 
vorzuziehen.
Anderes Beispiel fuer Hardwareloesungen : PWM.
Bevor ich anfange Stunden damit zu verbringen eine Softwareloesung fuer 
ne komplexe PWMsteuerung zu tipseln (davon abgesehen bin ich eh kein 
doller Programmierer...)geb ich lieber 10 cent mehr aus fuer einen Pic 
mit HardwarePWM.

von Max H. (hartl192)


Lesenswert?

Rainer Zufall schrieb:
> Das mag fernab von jeglicher Norm sein
Ganz genau, ein Delay hat in der ISR absolut rein gar nichts zu suchen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Max H. schrieb:
> ein Delay hat in der ISR
... ist der Anfang allen Übels. Insbesondere wenn es ein ms im Namen 
hat!

von Peter D. (peda)


Lesenswert?

Rainer Zufall schrieb:
> Das mag fernab von jeglicher Norm sein aber so kam es mir in den Sinn
> und es funktioniert. ;)

Das hat nichts mit Norm zu tun, sondern alle von Dir angewandten 
Techniken erschweren massiv die Weiterentwicklung des Programms.
Und in der Regel will man den MC mehr und mehr Aufgaben erledigen 
lassen.

Man darf einem Ortskundigem ruhig glauben, daß man eine Sackgasse 
entlang geht, auch wenn man selber das Ende noch nicht sieht.

Vielleicht müssen ja Anfänger bereits bekannte Fehler selber machen und 
die Sackgasse bis zum bitteren Ende gehen.

von Georg (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Vielleicht müssen ja Anfänger bereits bekannte Fehler selber machen und
> die Sackgasse bis zum bitteren Ende gehen.

Manche sieht man auch nie mehr wieder, weil sie sich am Ende der 
Sackgasse den Kopf eingerannt haben. Ein schwerer Verlust ist das 
allerdings nicht.

Georg

von Rainer Z. (doomkeks)


Lesenswert?

Habe mich nun für den 16F1508 mit 32.768 kHz Quarz entschieden.
Den Pic intertn mit 16MHz takten und einen Timerinterrupt mit Uhrenquarz 
auslösen.

Als Quarz nehme ich den "0,032768" von Reichelt. Laskapazität 10pF.
Ist es ok, wenn ich als Koppelkonsensatoren 1x 15pF und 1x 
Trimmerkondensator 5,2-30pF nehme?
(Formel C1,C2 = Lastkapazität*2 - Störkapazität*2)

Habe herausgefunden dass man an den 16F1503 nirgends einen Quarz 
anschließen kann. (Weder OSC1/OSC2 Pins noch SOSCI/SOSCO Pins vorhanden)
Da muss man ja echt aufpassen.

>ein Delay hat in der ISR absolut rein gar nichts zu suchen.
Ok ist ja gut, wird nicht mehr gemacht. ;)

: Bearbeitet durch User
von Rainer Z. (doomkeks)


Lesenswert?

So, der PIC16F1508 läuft jetzt mit 32768Hz Quarz und Timer1 Interrupt.
Die Uhr geht jetzt deutlich genauer.

Kalibireren werde ich den Trimmerkondensator wahrscheinlich über einen 
Outputpin des µC's und Soundkarte, weil das Analog Discovery dummerweise 
keinen Frequenzzähler an Bord hat. (Warum auch immer)

Danke für eure Hilfe!

von Georg (Gast)


Lesenswert?

Rainer Zufall schrieb:
> Kalibireren werde ich den Trimmerkondensator wahrscheinlich über einen
> Outputpin des µC's und Soundkarte, weil das Analog Discovery dummerweise
> keinen Frequenzzähler an Bord hat

Das kannst du dir sparen. Eine Ganggenauigkeit von 5 min / Jahr, was man 
mindestens von einer Quarzuhr erwartet, entspricht etwa 8stelliger 
Genauigkeit. Wenn du keinen so genauen Frequenzzähler hast bringt das 
nichts, wahrscheinlich macht ein Abgleich mit der Soundkarte die Uhr 
viel schlechter als sie vorher war.

Georg

von W.S. (Gast)


Lesenswert?

Toxic schrieb:
> Fuer einen Taktgeber ist der Uhrenquarz ideal - nicht umsonst hat er die
> 32.768 kHz und nicht umsonst...

Nö.
Stimmt überhaupt nicht.
So ein 32 KHz Uhrenquarz hat nur deshalb seine Berechtigung, weil man 
damit deutlich stromsparendere Uhren bauen kann als mit einem Quarz im 4 
MHz Bereich. Das ist wichtig für alle, die eine Uhr per Knopfzelle oder 
0.22F Kondensator betreiben wollen.

Aber für jeden, der genug Strom zur Verfügung hat, ist ein Quarz im 
MHz-Bereich allemal besser.

Und zwar SEHR.

Der Grund dafür ist, daß es bei 32 kHz dramatisch hochohmiger zugeht als 
bei 4..16 MHz und man sich damit erhebliche Abgleichprobleme und 
Anfälligkeit gegen Handkapazität etc. einhandelt. Bereits ein Antippen 
mit einer Oszi-Tastspitze verstimmt so einen 32 kHz Oszillator dermaßen, 
daß nix mehr stimmt oder er sogar aussetzt.

Obendrein ist man bei Verwendung eines µC nicht auf glatt teilbare 
Binär-Frequenzen angewiesen wie bei simplen Ripple-Countern (von 32786 
Hz auf 1 Hz).

W.S.

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
Noch kein Account? Hier anmelden.