Forum: Mikrocontroller und Digitale Elektronik Eine Frage, die jeder mit Informatikkenntnissen lösen kann


von Bilder (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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.

von Anja (Gast)


Lesenswert?

Nee aber in Zeile 42 tritt ein Überlauf auf.

Gruß Anja

von Peter (Gast)


Lesenswert?

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)

von holger (Gast)


Lesenswert?

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.

von ... (Gast)


Lesenswert?

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 
+...+....?

von oldy (Gast)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

>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

von Anja (Gast)


Lesenswert?

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

von Hauspapa (Gast)


Lesenswert?

20000000x60/256/256=18310,5 behauptet zumindest der Windows 
Taschenrechner.

von Peter (Gast)


Lesenswert?

Anja schrieb:
> beim 16F628 wird der Timer mit Quarzfrequenz / 4 betrieben, falls nicht
ist ja verwirrend, aber gut zu wissen.

von oldy (Gast)


Lesenswert?

Der Taschenrechner rechnet nur das was du ihm eingibst.
Wenn du Blödsinn eingibst, dann kommt auch blödsinn raus.

von Bilder (Gast)


Lesenswert?

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

von oldy (Gast)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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

von oldy (Gast)


Lesenswert?

Hat er das gemacht ?
Wahrscheinlich nicht. Also dazu rechnen.

von holger (Gast)


Lesenswert?

>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.

von Peter (Gast)


Lesenswert?

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

von oldy (Gast)


Lesenswert?

Was rechnest du denn da ?
Es kommt eine Frequenz von 76,29 Hz raus.

von holger (Gast)


Lesenswert?

>du hast den Prescaler vergessen

Ich glaube nicht;)

von oldy (Gast)


Lesenswert?

Denk nochmal nach dann findest du den Fehler auch.

von Peter (Gast)


Lesenswert?

holger schrieb:
> Ich glaube nicht;)
wo hast du ihn denn? die 256 sind für die Overlow

von holger (Gast)


Lesenswert?

>wo hast du ihn denn? die 256 sind für die Overlow

>5MHz / 256 = 19531Hz

Da isser doch.

von holger (Gast)


Lesenswert?

Der genaue Wert für eine Minute ist 1171875.

von Peter (Gast)


Lesenswert?

holger schrieb:
> Da isser doch.

es gibt 2mal die 256!! Einmal den Overlow und einmal den Prescaler

von oldy (Gast)


Angehängte Dateien:

Lesenswert?

So sieht es aus.
Das ganze mal als Anhang.

von holger (Gast)


Lesenswert?

>es gibt 2mal die 256!! Einmal den Overlow und einmal den Prescaler

Stimmt, hast recht.

von holger (Gast)


Lesenswert?

>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?

von Yalu X. (yalu) (Moderator)


Lesenswert?

@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 ;-)

von Peter D. (peda)


Lesenswert?

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

von oldy (Gast)


Lesenswert?

Sag doch mal wie groß deine Abweichung ist ?

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

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 !

von omg (Gast)


Lesenswert?

Und dann kannst du deinen Source ja auch mal Posten,
dann muss man nicht im dunkeln Tappen.

ist wohl das Mindeste

OMG

von Lehrmann M. (ubimbo)


Lesenswert?

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