Forum: Mikrocontroller und Digitale Elektronik Problem Timer1 überlauf


von Philip (Gast)


Lesenswert?

Hallo zusammen,

ich hab mal wieder ein Problem.

Ich habe ein Programm auf meinem Mikrocontroller (PIC 16F648A) dass sich 
nach einem Ablauf wiederholt.
Die Dauer dieses Ablaufs ist abhängig von den eingelesenen Werten (über 
AD-Wandler).
Allerdings soll dieser nach einer immer gleichen Zeitkonstante 
wiederholt werden.
Also dachte ich mir, ich nehme den Timer1 dafür und warte bis der 
Überlauf (TMR1IF) gesetzt wird, um das Programm erneut zu wiederholen.
Das Problem, es läuft weiterhin zusätzlich in Abhängigkeit der 
eingelesenen Werte.
Der Überlauf wird natürlich nach der Aktivierung auch zurück gesetzt.
Auch verschiedene Teilungen am Vorteiler (T1CKPS0, T1CKPS1) habe ich 
ausprobiert. Das Programm selbst ist auch nicht zu lange.
Der Timer1 hat zwar schon eine Auswirkung auf die Dauer des 
Programmablaufs, dennoch ist dieser noch zusätzlich Abhängig von den 
eingelesenen Werten, obwohl dies laut meiner Auffassung nicht der Fall 
sein sollte, da der Timer ja immer nach gleich vielen Takten überlaufen 
sollte?

Oder habe ich einen Denkfehler?

Vielen Dank für eure Antworten

Gruß Philip

von g457 (Gast)


Lesenswert?

> Oder habe ich einen Denkfehler?

Zeig einfach den Quellcode. Und schreib nochmal ∗genau∗ auf, was Du 
haben willst und was Du stattdessen bekommst, das obige ist leicht 
verwirrend.

von Philip (Gast)


Lesenswert?

Ja, war vielleicht etwas kompliziert beschrieben, sorry.
Der Quellcode ist leider viel zu lange tut mir Leid ...

Ich versuche es mal einfacher zu beschreiben


Init
 Timer1 Vorteiler = 4


1. Einlesen AD-Wandler
2. Werte des AD-Wandlers berechnen
3. Warten bis Timer1 überläuft
4. Überlauf löschen
5. Zurück zu Punkt1 springen

Laut meiner Auffassung sollte der Zyklus 1-5 immer gleich lang sein, da 
der Timer1 immer nach 65535 Takten überläuft.

Das ist er aber nicht, er ändert sich Abhängig vom Vorteiler UND von den 
eingelesenen- und zu berechneten Werten.

von skorpionx (Gast)


Lesenswert?


von weiss_nix (Gast)


Lesenswert?

skorpionx schrieb:
> Beitrag "Matrix Tastatur (Matrixtastatur) mit 74HC4051 und 162A Display."
>Ja, war vielleicht etwas kompliziert beschrieben, sorry.
>Der Quellcode ist leider viel zu lange tut mir Leid ...

Wenn Du Deinen Quellcode nicht zeigen willst, darfst Du ihn gerne 
behalten, aber dann wirst Du hier wohl kaum Hilfe erhalten koennen...

mfG weiss_nix

von zork (Gast)


Lesenswert?

Philip schrieb:
> Der Quellcode ist leider viel zu lange tut mir Leid ...

Schade. Man könnte den Quellcode kürzen oder aber lieber andere wühlen 
lassen?!

von TK (Gast)


Lesenswert?

Hallo,
der Timer läuft - wie schon von Dir beschrieben - nach 65536 x 4 Zyklen 
über.
Dann wird TMR1IF gesetzt. Je nach OSC Takt kann man das jetzt in 
Zeiteinheiten umrechnen (bei 4MHz wären das dann ca. 260ms - natürlich 
nur, wenn TMR1H,TMR1L nicht anders vorbelegt werden).
An Deinem Ablauf kann ich mir zwei Probleme aus der Glaskugel ziehen:
1) Du hast ein BANK-Problem und schreibst einen falschen Wert ins 
TMR1H/L- Register.
2) Deine ADC Routinen / Berechnungen dauern länger als 260ms (das geht 
ganz schnell, wenn Du mit 32bit Floatingpoint Rechnungen ankommst - ES 
LEBE C)

Abhilfe / Analyse:
Nimm mal den Simulator aus MPLAB und lasse den mal durchlaufen. Da 
siehst Du dann ganz schnell, wo die Zeit geblieben ist / wo das 
BANK-Problem auftaucht.

Alternativ: Du setzt/löschst einen unbenutzten Pin in jeder Teilroutine 
und benutzt ein Oszi für die Auswertung.

Gruß
TK

von Peter D. (peda)


Lesenswert?

Philip schrieb:
> Das ist er aber nicht, er ändert sich Abhängig vom Vorteiler UND von den
> eingelesenen- und zu berechneten Werten.

Das ist doch der Sinn eines Vorteilers:
Zeit = Quarz / Vorteiler / Timer

Code ausführen benötigt Zeit, insbesondere Division und Float.
Da Du keinerlei Angaben machst, kann man nur vermuten. Wenn der Timer 
alle 10µs überlaufen soll, wirst Du dazwischen kaum Berechnungen machen 
können.
Du mußt die Zeit so lang wählen, daß alle Berechnungen garantiert bis 
zum nächsten Überlauf abgeschlossen sind.

: Bearbeitet durch User
von Thomas E. (picalic)


Lesenswert?

Philip schrieb:
> Das Programm selbst ist auch nicht zu lange.

Philip schrieb:
> Der Quellcode ist leider viel zu lange

Aha...

Wenn Du schon Deinen Code nicht posten willst, beschreibe doch 
wenigstens mal, wie Du zu der Meinung kommst, daß das Programm nicht das 
macht, was es soll. Irgendwie scheinst Du ja das Timing-Verhalten 
messtechnisch zu erfassen (ich nehme an, Du sitzt nicht mit der Stopuhr 
in der Hand und stopst manuell Millisekunden, bis eine LED aufblitzt).
Dasselbe Verfahren kann man sicher auch dazu nutzen, um das Programm zu 
debuggen, wenn das Debugging mit Simulator oder Debugger-Hardware nicht 
weiterführt.
Also, welches Timing-Verhalten erwartest Du von Deinem Programm genau 
und was passiert dann tatsächlich?

von Philip (Gast)


Lesenswert?

Erstmal vielen Dank für eure Antworten.

Das Programm umfasst fast den kompletten Speicherinhalt des PICs, also 
um die 4000 Befehle.
Ich bezweifle dass dies jemanden hier weiter geholfen hätte.
Aber ich habe es nun gelöst:

@Thomas Elger, die Messung erfolgte mit einem Oszilloskop  ;)

Genau daran lag auch das Problem, die Triggerung auf ein PPM-Signal an 
dem ich gemessen habe funktionierte nicht richtig.
Zudem habe ich zunächst die falsche PIR-Flag für den Überlauf gelöscht. 
Die scheint von PIC zu PIC unterschiedlich zu sein.
Erst nachdem ich einen Ausgang zweckentfremdet habe, der mir die Zyklen 
genau anzeigte, kam ich darauf.
Manchmal ist die Lösung ganz Simpel, aber wer misst misst Mist.

Danke nochmal

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.