PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timingproblem



Rev0luTio
29.03.2007, 21:49
Hallo Leute,

ich komm irgendwie mit dem Timer nicht klar.
Ich versuch mal zu erklären was ich bisher verstanden hab:
PIC läuft mit internem Takt von 37kHz
1/4 davon kann ich nutzen für den Timer, bedeutet 9,25kHz
Den Prescaler hab ich auch 1:2 eingestellt, was wiederum bedeutet 4,625kHz
Wenn ich den Timer jetzt von '0' ab zählen lassen läuft der 18,066... mal pro Sekunde über. Richtig?

Dazu hab ich mir nen Zähler programmiert der ab 18 bei jedem Timerüberlauf um 1 runterzählt. Ist der Zähler bei 0 angekommen sollte ca. 1 Sekunde vorrüber sein. Richtig?

Nach dutzenden von Versuchen das mit der Stoppuhr abzustoppen (LED blinkt) bin ich zu dem Schluss gekommen das nur ca. 1 halbe Sekunde vorrüber is. Ist in meiner Rechnung was verkehrt oder bin ich einfach nur Depp?

orph
29.03.2007, 22:22
Hallo

Ich verstehe deine Rechnunug noch nich so ganz. Erstens einmal, wäre der Interne Takt schon 1/4 des externen Takts, also vom Takt des Quarz. Der ganze Pic läuft nur mit 1/4 des externen Taktes. (Das hat seinen Grund in der RISC-Architektur, damit ist fast jeder Befehl in einem Takt-Zyklus ausführbar.) Bei deiner Rechnung oben ist nicht so klar, wievel mal du geteilt durch 4 rechnest und wieviel der externe Takt ist.

Zudem solltest du noch sagen, welchen Timer (8-Bit oder 16-Bit) du verwendest und weleche Werte du für den Autoreload der Register gesetzt hast. Sonst kann ich deine Werte nicht wirklich nachvollziehen.

quote: oder bin ich einfach nur Depp?
Das kann ich so nicht sagen ;-)

Rev0luTio
29.03.2007, 22:56
Sorry, falsch ausgedrückt. ich meine natürlich den internen oszillator. ich verwende keinen externen.
Dieser ist eingestellt auf 37kHz.

Als Timer verwende ich einen 8-Bit Timer.

Was heisst "Autoreload der Register"?


Achja, bei dem verwendeten PIC handelt es sich um einen 16f627A

kalledom
29.03.2007, 23:04
@Rev0luTio
Deine Berechnung stimmt so weit:
Frequenz : 4 : 2 (Prescaler) = 4,625kHz
Ab hier wird es einfacher zu rechnen, wenn Du die Frequenz in Zeit umwandelst: 1 : 4,625kHz = 0,216 ms.
Das Timer-Register wird alle 0,216ms um 1 erhöht, bei 255 (0xFF) erfolgt ein Überlauf nach 0. Dabei wird das Timer-Flag gesetzt und evtl. ein Interrupt ausgelöst.
Mit der obigen Konfiguration kannst Du Zeiten von 255...256=1 * 0,216ms = 0,216ms bis 0...256=256 * 0,216ms = 55,296ms einstellen.
Je nach Timer gibt es allerdings noch weitere Skalierungs-Möglichkeiten.
Für längere Zeiten würde ich einen Timer so initialisieren, daß er jede Millisekunde einen Interrupt auslöst. In der Interrupt-Routine kannst Du dann leicht weitere Zähler z.B. bis auf 0 dekrementieren und bei 0 wieder mit einem (Zeit-)Wert laden.

orph
29.03.2007, 23:50
na so,
da du die Preload-Register offenbar nicht verwendest, nehme ich wie von kalledom bereits geschrieben, an, dass ein Durchgang des Timers 55.296ms benötigt. Da aber 55.269*18=995.328ms gibt, ist noch nicht geklärt, wo der Fehler passiert ist, dass du empirisch nur 0.5sek erkennst.
So auf den ersten Blick kann ich mir nicht erklären, woran das liegen könnte. Aber wenn du sagst, dass du den internen Oszi verwendest, könnte das Problem eventuell an dessen Ungenauigkeit liegen. Ich hab zwar die Taktgenauigkeit eines internen Oszillators zwar noch nie überprüft, aber so vom hören-sagen soll die ja angeblich nicht gerade der Hit sein.
Vielleicht kannst du für das Blinklicht mal einen externen Quarz oder Oszillator nehmen und schauen, ob es sich verbessert. Aber wie gesagt; ist nur ne vermutung.

greez

Rev0luTio
04.04.2007, 22:33
Also es lag wohl tatsächlich an der Ungenauigkeit des internen Oszis.
Das wäre somit geklärt. Auch hab ich es geschafft das der PIC genau das macht was er soll, aber... und damit tut sich auch schon ein neues Problem auf.

Im Testboard läuft er einwandfrei. Jetzt hab ich ihn auf ne Platine gebastelt und stelle fest: Er startet nicht.
Schaltplan im Anhang!

Die Led sollte beim starten angehen!

Das komische ist, wenn ich statt des verwendeten Spannungsreglers ein 5V Universalnetzteil nehme startet er. Ich kann dann sogar den Kondensator weglassen

Mobius
04.04.2007, 23:10
Hum, hast du nachgemessen, ob der Spannungsregler "regelt"? Weil eigentlich braucht ein 7805 noch mindestens 2 Kondensatoren am Ein- und Ausgang, damit er stabil und sicher läuft (sich nicht hochschwingt).

Ansonsten, hast du bei deinem PIC den extrenen MCLR abgeschaltet? Weil wenn nicht, dann brauchst du noch ein Pull-up auf den entsprechenden Pin des µC.
Aja, dem LED würde ich nur so aus Gefühl noch nen Vorwiderstand verpassen, es ist schon richtig, dass die Pins des PIC ein LED mit Strom versorgen können, doch hab ich bis jetzt irgendwie nie der internen Strombegrenzung der Pins vertraut ;). So um 500 Ohm müssten vollkommen reichen.

MfG
Mobius

Rev0luTio
05.04.2007, 12:23
Der Spannungsregler liefert mir konstant 4,25 V, soweit ich das mit meinem 5 € Messgerät beurteilen kann.
MCLR ist aus.
Wie schon gesagt, mit nem 5V Universalnetzteil funktionierts ja. Das soll aber net Sinn der Sache sein.
Welche Kondensatoren soll ich verwenden und wie muss ich die am 7805 beschalten?

BMS
05.04.2007, 21:02
hi

die 4,25 V sind aber zu wenig. der 5V-Regler heißt ja so, weil er ja 5Volt liefern soll :). die eingangsspannung sollte mindestens 2volt höher sein als die ausgangsspannung (also mindestens 7 Volt an den Eingang. [EDIT: ah, in deinem schaltplan steht 12Volt - das müsste der reler doch gut schaffen])
dreh' mal die eingangsspannung auf - dann müsste er wirklich auf 5v regeln.
ansonsten stimmt was nicht mit deinem messgerät (mal batterie wechseln?)

zu den elkos und kondensatoren - ein bild sagt mehr als 1000 worte:
http://bwir.de/images/schaltungen/sr_s.gif

mfg
BMS