Hallo,
ich habe mir mal das Datenblatt angeschaut. Dieser PIC hat auch den 16 Bit Timer "Timer1".
Damit lassen sich 100ms problemlos erzeugen? Wird der Timer1 anderweitig verwendet?
Wenn wir mal davon ausgehen, dass nur der Timer0 zur Verfügung steht, würde ich folgendermaßen vorgehen:
- Ein Takt des internen Oszillators benötigt 1µs (Fosc/4) -> das entspricht der Ausführungszeit von einem Befehl
- Wird der Vorteiler auf 32 gestellt, dann werden 32 Takte benötigt, bevor der TMR0 einmal hochzählt
- Wird der TMR0 auf 130(dezimal) voreingestellt, dann kann er 125 mal hochgezählt werden, bevor er überläuft.
Er würde also nach genau 4ms überlaufen und einen Interrupt auslösen.
- In der Interrupt Routine müsste dann ein Zählregister 25mal hochgezählt werden, damit die 100ms erreicht werden.
Jetzt kommen die Haken:
Wenn der Interrupt ausgelöst wurde, dann zählt der Vorteiler natürlich weiter.
Das bedeutet, dass nach 32 Takten / 32 µs / 32 Befehlen der TMR0 wieder erhöht wird.
Also muss der TMR0 bis dahin erneut auf 130(dezimal) eingestellt werden, damit er die nächsten 4ms zählen kann.
Es stehen also nur 32 Befehle für die Interrupt Sevice Routine (ISR) zur Verfügung. Darin muss das Zählregister erhöht und mit dem Endwert 25 verglichen werden, der TMR0 muss neu geladen werden und vielleicht muss das W und das Status Register gesichert und wiederhergestellt werden. Nach meiner Rechnung dürfte das ausreichen (in Assembler).
Wenn die ISR verlassen wurde, stehen 4 ms (4000 Befehle) für das Hauptprogramm zur Verfügung, bevor der TMR0 die nächste Unterbrechung anfordert.
Letztendlich ist die Frage, was passieren soll, wenn die 100ms erreicht sind.
Falls gleich die nächsten 100ms loslaufen sollen, dann darf der weitere Programmablauf nicht
in der ISR stattfinden.
Gruß,
Cooloola