Ich hab´ Deinen Code mal im Simulator laufen lassen. Es zeigt sich, dass die komplette Timer0-ISR 126 Taktzyklen verbraucht. Es müssen ja auch eine ganze Menge Register "gerettet" und nach Ende der ISR wieder zurückgegeben werden. Das sind also etwa 125µs Zeitverlust pro Flanke, also etwa 250µs pro kompletten Impuls - was sich ziemlich genau mit den von Dir gemessenen maximalen 4 KHz deckt.
Das ist ein sehr lehrreiches Beispiel dafür, dass auch die kürzeste ISR dem Controller ganz schön viel Arbeit bereitet
Aber Du wolltest ja wissen, wie Du mehr rausholen könntest. Und da sehe ich zwei Möglichkeiten:
Entweder Du erhöhst die Taktfrequenz des Controllers. Der Mega32 kann mit dem internen Oszillator bis zu 8MHz - dann kämst Du schon mal bis etwa 32 kHz.
Oder Du arbeitest mit der Hardware-PWM - und um genau zu sein, im "CTC"-Modus. Das ist ein sehr feines Feature, was die Erzeugung von absolut frequenzgenauen Rechtecksignalen erlaubt, ohne dass der Controller auch nur das kleinste bisschen dafür rechnen oder arbeiten muss. Das läuft nebenbei im Hintergrund ab, während der Controller sich um andere Dinge kümmern kann.
Im Datenblatt des Mega32 gibt´s auf Seite 74 ein Bild dazu, das mehr sagt als 1000 Worte. Der Wermutstropfen ist allerdings der, dass
Bascom (soviel ich weiß) den CTC-Modus nicht direkt unterstützt - man muss die beiden relevanten Register halt "von Hand" setzen. Aber das tut nicht weh - und wenn man verstanden hat was man dabei tut, macht´s sogar Spaß
Lesezeichen