Hallo,
Hintergrund ist der Folgende. Ich baue eine Schrittmotorsteuerung mit
der L297/L298 Kombination. Es wird ein Schritt ausgeführt, wenn der L297
eine steigende Flanke am Takteingang bekommt.
Die Steuerung soll dann von einem anderen Board via I2C angesteuert
werden.
Folgendes habe ich mir als Konzept überlegt. Zunächst einmal benötige
ich eine Art Befehlswarteschlange. Denn wenn nacheinander mehrere
Anweisung kommen, x-Schritte auszuführen, sollen alle der Reihe nach
abgearbeitet werden. Wie kann man so etwas geschickt in C realisieren?
Hier fehlt ja leider die Objektorientierung der Sprache.
Dann zur eigentlichen Impulserzeugung. Ich habe mal schnell diesen Code
geschrieben, und er scheint auch zu funktionieren. Hier ein relevanter
Ausschnitt.
LCLK ist der Pin OC2A. Und alle in der ISR verwendetn Varriablen sind
als volatile definiert.
Hier wird der Befehl angenommen x-Schritte zu machen:
1 | lcounter=2*steps;
|
2 | lready=false;
|
3 | LPORT &= ~(1<<LCLK);
|
4 | TCNT2=0;
|
5 | TCCR2A |= (1<<COM2A0);
|
und hier die ISR:
1 | ISR(TIMER2_COMPA_vect) {
|
2 | if(lready==false){
|
3 | if(lcounter==1) {
|
4 | lready=true;
|
5 | TCCR2A &= ~(1<<COM2A0);
|
6 | } else {
|
7 | --lcounter;
|
8 | }
|
9 | }
|
10 | }
|
Der Timer läuft die ganze Zeit im Hintergrund durch, und erzeugt somit
den Takt. Eventuell setze ich nach erhalten des Befehls ein wenig viel
zurück. Da bin ich mir nicht genau sicher, ob das nötig ist.
Ansonsten wäre es noch möglich, erst nach erhalten des Befehls den
Compare Interrupt zu aktivieren, und wenn die Erzeugung der Impulse
beendet ist, diesen wieder zu deaktivieren?
Viele Grüße