mikrocontroller.net

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


Autor: Bilder (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee aber in Zeile 42 tritt ein Überlauf auf.

Gruß Anja

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 
+...+....?

Autor: oldy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hauspapa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
20000000x60/256/256=18310,5 behauptet zumindest der Windows 
Taschenrechner.

Autor: Peter (Gast)
Datum:

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

Autor: oldy (Gast)
Datum:

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

Autor: Bilder (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: oldy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: oldy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat er das gemacht ?
Wahrscheinlich nicht. Also dazu rechnen.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: oldy (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>du hast den Prescaler vergessen

Ich glaube nicht;)

Autor: oldy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Denk nochmal nach dann findest du den Fehler auch.

Autor: Peter (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wo hast du ihn denn? die 256 sind für die Overlow

>5MHz / 256 = 19531Hz

Da isser doch.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der genaue Wert für eine Minute ist 1171875.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Da isser doch.

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

Autor: oldy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So sieht es aus.
Das ganze mal als Anhang.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>es gibt 2mal die 256!! Einmal den Overlow und einmal den Prescaler

Stimmt, hast recht.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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:
#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

Autor: oldy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sag doch mal wie groß deine Abweichung ist ?

Autor: Bernd Rüter (Firma: Promaxx.net) (bigwumpus)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: omg (Gast)
Datum:

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

ist wohl das Mindeste

OMG

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht 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 =)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.