TommyB
Team Bitschubse
Soweit richtig, hat aber Nachteile.
Du setzt immer das ganze Register, musst also z.B. bei DDRx beachten ob nicht vorher schon was gesetzt war, oder eben nicht.
Richtig wäre:
1) Register laden
2) Bits setzen / löschen, je nach Bedarf. And löscht, Or setzt.
3) Register zurück schreiben
Oder einfach Bascom's Config Port / Pin nutzen.
Oder man weiß genau was man tut, was bei komplexeren Programmen aber nahezu unmöglich ist, zumindest wenn man nach ein paar Monaten noch was anpassen muss und sich erst wieder stundenlang reindenken muss.
Und warum die Aufgabe, das hast du dir grade selbst beantwortet. Das ist ein Fehler den du schon öfters gemacht hast, du liest nicht richtig.
Preload ist Glücksache wenn der wirklich 100% exakt ist.
Warum?
Du hast nur eine CPU. Einen "Task" der arbeiten kann. Und der durchläuft entweder deine Main Loop, oder kümmert sich grade um den aufgetretenen Interrupt.
Preload bekommst du ja einen Interrupt wenn der Timer überläuft, dann musst du ihm den Wert geben, und zwar schnellstmöglich! Weil der Timer zählt gnadenlos weiter. Vielleicht bist du zu langsam und der Timer hat mittlerweile schon bis 100 gezählt, dann bist du halt 100 Takte daneben.
Das ganze wird umso schlimmer je höher der Reload Wert und desto niedriger der Prescaler ist, weil du so immer weniger Zeit hast. Dazu kommt dass du ja in der CPU Rechenregister hast, die müssen bei jedem Interrupt gesichert und nachher wiederhergestellt werden. Sonst könnte er nach dem Interrupt nicht so da weiter machen wo er vorher aufgehört hat. Da gehen schon einige Taktzyklen verloren. Du merkst davon nichts, Bascom kümmert sich darum, die Takte sind trotzdem verbraten.
Und wenn du jetzt noch andere Interrupts ebenfalls verwendest (normalerweise kann immer nur einer laufen) und du in einer ISR noch etwas zeitintensives machst (wait, lcd, langsames uart, ...) dann wird es erst richtig lustig. Daher, wenn irgendwie möglich, die Hardware alles machen lassen.
CTC hast du das Problem nicht, da setzt du das Maximum fest, welches deswegen so hoch wie möglich sein kann (umso genauer kannst du ihn einstellen).
Du setzt immer das ganze Register, musst also z.B. bei DDRx beachten ob nicht vorher schon was gesetzt war, oder eben nicht.
Richtig wäre:
1) Register laden
2) Bits setzen / löschen, je nach Bedarf. And löscht, Or setzt.
3) Register zurück schreiben
Oder einfach Bascom's Config Port / Pin nutzen.
Oder man weiß genau was man tut, was bei komplexeren Programmen aber nahezu unmöglich ist, zumindest wenn man nach ein paar Monaten noch was anpassen muss und sich erst wieder stundenlang reindenken muss.
Und warum die Aufgabe, das hast du dir grade selbst beantwortet. Das ist ein Fehler den du schon öfters gemacht hast, du liest nicht richtig.
Jetzt frag dich mal ob das so ganz ohne Vorteiler auch das maximalste ist... Ja, ne, ich meine was wäre die maximale Zeitspanne die du erreichen könntest...
Preload ist Glücksache wenn der wirklich 100% exakt ist.
Warum?
Du hast nur eine CPU. Einen "Task" der arbeiten kann. Und der durchläuft entweder deine Main Loop, oder kümmert sich grade um den aufgetretenen Interrupt.
Preload bekommst du ja einen Interrupt wenn der Timer überläuft, dann musst du ihm den Wert geben, und zwar schnellstmöglich! Weil der Timer zählt gnadenlos weiter. Vielleicht bist du zu langsam und der Timer hat mittlerweile schon bis 100 gezählt, dann bist du halt 100 Takte daneben.
Das ganze wird umso schlimmer je höher der Reload Wert und desto niedriger der Prescaler ist, weil du so immer weniger Zeit hast. Dazu kommt dass du ja in der CPU Rechenregister hast, die müssen bei jedem Interrupt gesichert und nachher wiederhergestellt werden. Sonst könnte er nach dem Interrupt nicht so da weiter machen wo er vorher aufgehört hat. Da gehen schon einige Taktzyklen verloren. Du merkst davon nichts, Bascom kümmert sich darum, die Takte sind trotzdem verbraten.
Und wenn du jetzt noch andere Interrupts ebenfalls verwendest (normalerweise kann immer nur einer laufen) und du in einer ISR noch etwas zeitintensives machst (wait, lcd, langsames uart, ...) dann wird es erst richtig lustig. Daher, wenn irgendwie möglich, die Hardware alles machen lassen.
CTC hast du das Problem nicht, da setzt du das Maximum fest, welches deswegen so hoch wie möglich sein kann (umso genauer kannst du ihn einstellen).