nimmst Du halt einen EingangsPin mit Interrupt-Fähigkeit und baust Dir aus nem ATTiny oder analog einen externen "250ms Timer"?
Ich nehme an, die Programmteile in der ISR sind zeitkritisch..
Hallo,
ich möchte alle 250 ms ein Unterprogramm ausführen. Dabei ist weniger entscheidend, dass es exakt alle 250 ms aufgerufen wird, wohl aber, dass die Intervalle zwischen den Aufrufen gleich groß sind.
Leider steht mir - und da lässt sich nichts ändern - nur noch der Timer2 zur Verfügung. Da es sich um einen 8bit Timer handelt, dachte ich zunächst, ein so großes zeitl. Intervall lässt sich nicht erzielen (mein M32 läuft mit 16MHz). Jetzt habe ich aber gelesen, dass Bascom für seine Softclock auch über Timer2 (beim M32) alle Sekunde einen Interrupt auslöst. Geht es also doch irgendwie so große Intervalle hinzubekommen? So wie ich jetzt gerechnet habe, komme ich mit prescale=1024 bei 16MHz auf einen max. Abstand von ca. 16.4 ms.
In der Interrupt-Routine zu zählen und nur z.b. jeden 15ten Aufruf auch wirklich was zu tun, geht übrigens nicht, weil das, was ich in der Routine machen will, länger dauern würde, als der Abstand zwischen zwei Interrupts.
Danke für alle Tipps!
Malthy
nimmst Du halt einen EingangsPin mit Interrupt-Fähigkeit und baust Dir aus nem ATTiny oder analog einen externen "250ms Timer"?
Ich nehme an, die Programmteile in der ISR sind zeitkritisch..
Hallo,
das ist aber sehr unelegant... Wie macht das denn die Softclock von Bascom, oder habe ich da einfach nur etwas falsch verstanden?
Viele Grüße,
Malthy
Lies mal die Bascom - Hilfe zu CONFIG CLOCK - entweder wird ein externer (i2C)-baustein benutzt oder die "Softclock" braucht genauso einen timer, der Interrupt-Routinen feuern wird - nix für zeitkritische Sachen wie RS232 oder so..
so wahnsinnig ist ja der externe Aufwand nicht, ein NE555 + 2 Bauteile oder eben ein ATTiny, oder was Dir noch einfällt..
Hallo papa_of_t!
Ich weiss nicht genau, ob ich dich richtig verstanden habe, aber mir ist schon klar, dass die "softclock" einen Timer braucht - beim M32 meines Wissens eben Timer2. Mich wundert nur, dass die Softclock es mit diesem 8bit-Timer(!) schafft, nur alle 1000 ms einen Interrupt auszulösen (nämlich alle Sekunde das Unterprogramm "sectic" anspringt). Wenn das irgendwie softwaretechnisch möglich ist, möchte ich natürlich auf zusätzliche Hardware verzichten (zumal tatsächlich alle Ports meines AvRs belegt sind).
Gruß,
malthy
Okay, ich glaube ich habe da etwas überlesen. Sehe ich es richtig, dass die Softclock einen zusätzlichen externen 32768 Hz Quarz benötigt? Das würde meine Frage beantworten
malthy
denke ich auch, ich grübel gerade am selben ProblemZitat von malthy
32.768 256 128,0000
32.768 1024 32,0000
entweder Vorteiler auf 256 oder 1024 dann würde das compare register mit 8-bit passend bei 128 oder 32 geladen werden....
alle sec ein IRQ
man kanns auch umständlich machen.
Geh doch einfach hin und zähle mit der ISR von Timer2 ne
Bytevariable hoch und wenn eben der x-te Durchlauf vollzogen
ist, dann führe deine Funktion aus.
Du brauchst keine zusätzliche Hardware (NE555 etc.) und von der
Präzision her kommste auch noch gut hin.
Die Softclock läuft im Übrigen tatsächlich mit 32768KHz Quarz.
Vor den Erfolg haben die Götter den Schweiß gesetzt
Hallo Vitis,
das geht leider nicht, weil das, was ich ausführen will, länger dauert, als der maximal möglicher Abstand zwischen zwei 8bit-Timer-Interrupts. Das hatte ich oben schon versucht zu sagen, war wohl etwas verschwommen . Habe mich mittlerweile damit abgefunden, dass es nicht geht, versuche das Problem anders zu lösen - aber auch ohne zusätzliche Hardware.
Gruß,
malthy
Also die Hauptanwendung ist länger als die Interruptroutine
oder die Interruptroutine ist länger als der Überlauf von nem 8-Bit-Timer
mit Prescaler? ... Wenn letzteres der Fall ist würd ich von nem
Programmierfehler ausgehen.
Das macht man nämlich nicht, den Controller in nem Interrupt
gefangen halten. Schau mal State machine
Vor den Erfolg haben die Götter den Schweiß gesetzt
Lesezeichen