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
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.
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
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.
> Forum: Projekte & Code > Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel vorstellen > und diskutieren. Bitte hier keine Fragen posten
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.
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"...
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.
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
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.
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.
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
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
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.
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
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.
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.
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?
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
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
>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
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
> 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.
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.
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.
Rainer Zufall schrieb: > Das mag fernab von jeglicher Norm sein Ganz genau, ein Delay hat in der ISR absolut rein gar nichts zu suchen.
Max H. schrieb: > ein Delay hat in der ISR ... ist der Anfang allen Übels. Insbesondere wenn es ein ms im Namen hat!
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.
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
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
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.