Eine Frage, die jeder mit Informatikkenntnissen lösen kann

Gast #1961605
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?
Gast #1961624
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)
Gast #1961627
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.
Gast #1961629
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 
+...+....?
Gast #1961632
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.
Gast #1961638
>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
Gast #1961639
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
Gast #1961679
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
Gast #1961693
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.
Gast #1961696
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
Gast #1961706
>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.
Gast #1961789
>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?
Moderator #1961794
@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 ;-)
#1961844
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
(Firma: Promaxx.net) #1961909
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 !
#1961980
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 =)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.