Ich habe ein Timingproblem mit einem PIC 16F628, der einen 20Mhz-Quartz hat. Es geht um den Timer0. Dieser zählt von 0 bis 255 und beim Interrupt wird ein Zähler hochgezählt. Hier die Registereinträge, sollte ein Prescaler von 256 sein: OPTION_REG.T0CS = 0 OPTION_REG.T0SE = 0 OPTION_REG.PSA = 0 OPTION_REG.PS2 = 1 OPTION_REG.PS1 = 1 OPTION_REG.PS0 = 1 Ich habe ausgerechnet, daß beim Zählerwert von 4578 eine Minute vergangen sein sollte. Aber in Realität stimmt das nicht. Liegt der Fehler in den Werten?
Bilder schrieb: > Eine Frage, die jeder mit Informatikkenntnissen lösen kann Ich kenne ein paar Informatiker, die vor dieser Aufgabe stehen würden wie der sprichwörtliche Ox vorm Berg. Nicht weil sie dumm wären.
Nee aber in Zeile 42 tritt ein Überlauf auf. Gruß Anja
ich kenne zwar pic nicht nur die av'rs aber deine Rechnung kann ich nicht nachvollziehen. 20.000.000Hz Prescaler 256 also 78125 schritte in der sekunde das sind bei einem 8bit Timer 305.2 Overlows in der sekunde damit soltle nach 1Min der Zähler bei 18310 stehen (wenn es denn ein 16bit Zähler ist)
Du hast einen Prescaler von 256 eingestellt, das ist richtig. >Ich habe ausgerechnet, daß beim Zählerwert von 4578 eine Minute >vergangen sein sollte. Aber in Realität stimmt das nicht. Mit welchem Takt laüft Timer0 denn? Timer0 kann übrigends nicht bis 4578 zählen. Der hat nur 8 Bit.
20MHz = 50µs/Takt Wie viel Taktzyklen braucht ein PIC 16F628 um das Zählerregister runter zu zählen + wie viel Taktzyklen für die Ausführung des Interrupts +...+....?
Die rechnung ist schon richtig. Nur du mußt bedenken das die Befehle selber auch Zeit brauchen um ausgeführt zu werden. Die mußt du in deine Rechnung mit einbeziehen. Also die Zyklen ausrechnen, die ein Befehl braucht. Dann stimmt es.
>Mit welchem Takt laüft Timer0 denn? Timer0 kann übrigends >nicht bis 4578 zählen. Der hat nur 8 Bit. Vergiss es:( Ersten Post nicht genau gelesen;) 20MHz / 4 = 5MHz 5MHz / 256 = 19531Hz 19531Hz / 4578 = 4.2Hz
Peter schrieb: > damit soltle nach 1Min der Zähler bei 18310 stehen (wenn es denn ein > 16bit Zähler ist) beim 16F628 wird der Timer mit Quarzfrequenz / 4 betrieben, falls nicht einer der RC-Oszillatoren aktiv ist. Gruß Anja
20000000x60/256/256=18310,5 behauptet zumindest der Windows Taschenrechner.
Anja schrieb: > beim 16F628 wird der Timer mit Quarzfrequenz / 4 betrieben, falls nicht ist ja verwirrend, aber gut zu wissen.
Der Taschenrechner rechnet nur das was du ihm eingibst. Wenn du Blödsinn eingibst, dann kommt auch blödsinn raus.
Ja was nun? Damit es nicht nur oldy versteht: MEIN Programm zählt hoch. => 1 0 -> 255 = Ein Interrupt => Zähler = Zähler + 1 2 0 -> 255 = Ein Interrupt => Zähler = Zähler + 1 3 0 -> 255 = Ein Interrupt => Zähler = Zähler + 1 ... => 1 0 -> 255 = Ein Interrupt => Zähler = 0 2 0 -> 255 = Ein Interrupt => Zähler = 1 3 0 -> 255 = Ein Interrupt => Zähler = 2 ... n 0 -> 255 = Ein Interrupt => Zähler = 4578 Zeit(Zähler=4578) minus Zeit(Zähler=0) sollte 1 Minute = 60 Sekunden bei 20 Mhz sein
Hab ich doch schon geschrieben wo der Fehler liegt. Also rechne die Zeit dazu die die Befehle brauchen und schon bist du auf der Zeit die du wirklich brauchst.
oldy schrieb: > Hab ich doch schon geschrieben wo der Fehler > liegt. > Also rechne die Zeit dazu die die Befehle brauchen > und schon bist du auf der Zeit die du wirklich brauchst man nimmt noch extra Timer damit die Bearbeitungszeit keine rolle spielt
Hat er das gemacht ? Wahrscheinlich nicht. Also dazu rechnen.
>Zeit(Zähler=4578) minus Zeit(Zähler=0) sollte 1 Minute = 60 Sekunden bei >20 Mhz sein Ist es doch aber nicht, stimmts? Meine Rechnung: 20MHz / 4 = 5MHz 5MHz / 256 = 19531Hz 19531Hz / 4578 = 4.2Hz 4.2Hz => 0.23s Du willst 1Minute = 60s = 0.016666666 Hz Über den Daumen müsste dein Zähler bis mindestens 1098720 zählen. Musst halt noch mal genau nachrechnen.
holger schrieb: > Über den Daumen müsste dein Zähler bis mindestens > > 1098720 zählen. Musst halt noch mal genau nachrechnen. du hast den Prescaler vergessen
Was rechnest du denn da ? Es kommt eine Frequenz von 76,29 Hz raus.
>du hast den Prescaler vergessen
Ich glaube nicht;)
Denk nochmal nach dann findest du den Fehler auch.
>wo hast du ihn denn? die 256 sind für die Overlow >5MHz / 256 = 19531Hz Da isser doch.
Der genaue Wert für eine Minute ist 1171875.
So sieht es aus. Das ganze mal als Anhang.
>es gibt 2mal die 256!! Einmal den Overlow und einmal den Prescaler
Stimmt, hast recht.
>Ich habe ausgerechnet, daß beim Zählerwert von 4578 eine Minute >vergangen sein sollte. Aber in Realität stimmt das nicht. Eigentlich dürfte ich hier nicht mehr posten;) Aber, wie lang ist denn die Minute jetzt?
@Bilder: Das Problem hat ja weniger mit Informatik- als viel mehr mit PIC-Kennt- nissen zu tun. Dass die wenigsten PIC-Kenner Informatiker sind und sich die wenigsten Informatiker mit PICs auskennen, erkennst du an den bisher gelieferten Antworten. Hast du eigentlich Informatikkenntnisse? Aber zu deiner Frage: > Liegt der Fehler in den Werten? Soweit ich das beurteilen kann, nicht. Der Fehler liegt in einem dir wahrscheinlich unwichtig erscheinenden Detail, von dem außer dir niemand etwas weiß. > Aber in Realität stimmt das nicht. Präziser kann man die Realität kaum beschreiben. Auch wenn damit dein Problem noch nicht gelöst ist, merkst du jetzt vielleicht, welche drei Fehler in deiner Anfrage stecken ;-)
Bilder schrieb: > Ich habe ausgerechnet, daß beim Zählerwert von 4578 eine Minute > vergangen sein sollte. Aber in Realität stimmt das nicht. Liegt der > Fehler in den Werten? Ein Informatiker ist da völlig fehl am Platze. Du brauchst einen, der für Dich das Datenblatt Deines konkreten MC liest und dann noch ein kleines bischen Mathematik kann. D.h. Mathematik nur insoweit, daß er die Rechnung hinschreiben kann. Das Ausrechnen von Konstanten zur Compilezeit kann ja der Compiler selber machen. Ich hasse es, wenn jemand in Programmen irgendwelche magische Zahlen eintippt und man nicht weiß, wie er darauf kommt. Ich schreibe daher immer die Formel hin und lasse es vom Compiler ausrechnen. Dann kann ich auch mal nen anderen Quarz nehmen und die Rechnung stimmt immer noch. Bei den AVRs hat sich eingebürgert, daß am Anfang z.B. steht:
1 | #define F_CPU 20e6 // 20MHz
|
Und alle Baudraten, Timings usw. rechnen dann damit. Vom PIC habe ich keine Ahnung. Ich könnte Dir nur helfen, wenn es um einen AVR oder 8051 ginge. Peter
Sag doch mal wie groß deine Abweichung ist ?
Jaja, diese trockenen Informatiker in ihrem Turm... Das ist doch alles Blödsinn hier. Du kannst keinen Minuten-Takt erzeugen, wenn Du Teiler und Zähler nimmst um einen 20MHz-Takt zu bändigen. Nimm einen 16-Bit-Timer und die CCP-Baugruppe, um einen 1ms oder länger Interrupt zu erzeugen, der dann einen Zähler hochzählt, um die Minute zu timen - genau !
Und dann kannst du deinen Source ja auch mal Posten, dann muss man nicht im dunkeln Tappen. ist wohl das Mindeste OMG
Ich liebe es wenn tausende Leute ihren Senf dazu geben müssen, nur, dass mal gelabert ist. Nun in der Summe: Die OPTION Register passen soweit ich das 'by inspection' gesehen habe. Grundsätzlich müsstest du uns mal am besten deinen kompletten Code offenlegen. Könnte es sein, dass du den internen Oszillator gewählt hast (Config-Bits) und den 20 MHz Quarz (nicht Quarzt) garnicht verwendet? Wo hast du denn den ext. Quarz angeschlossen (welche Pins und welcher Kondensator nach GND)? Ansonsten schau dir nochmal das OPTION Register an (Datenblatt Sektion 4.2.2.2) und lies nochmal das mit dem Prescaler & WDT (bei 4.2.2.2 gibt's ne Note zu der ensprechenden Sektion). Gruß PS: Bitte den kompletten Source-Code nicht vergessen =)
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.