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.
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
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
>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
>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
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 !
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 =)