Ja hallo,
vielen Dank für die interessanten Tipps.
Damit wir hier nicht so virtuell in den Äther diskutieren, hier mal etwas Code an dem ich gerade arbeite.
Code:
#ifndef _stepMotorClass_
#define _stepMotorClass_
#include <util/delay.h>
#include <avr/io.h>
class ClStepMotor {
private:
uint8_t stepNo;
int8_t direction; // +1 / -1
uint16_t wait;
public:
ClStepMotor();
void setMotorStep(void);
void setWait(uint16_t*);
void setDirection(int8_t*);
void setMotorOff(void);
};
#endif // stepMotorClass
Und hier die ClStepMotor.cpp:
Code:
#include <util/delay.h>
#include <avr/io.h>
#include "ClStepMotor.h"
ClStepMotor::ClStepMotor() {
// Den Schrittmotortreiber aktivieren. => Port D Bit 4 & 5 auf eins schalten
DDRD |= (1<<PD4 | 1<<PD5); // Die Bits 4 und 5 auf Ausgang setzen.
PORTD |= (1<<PD4 | 1<<PD5); // Die beiden Bits auf 1 setzen: High-Ausgang
// Die Steuerleitungen fuer den Schrittmotortreiber aktivieren => Port B Bit 0 und 1, Port C Bit 6 und 7
DDRB |= (1<<PB0 | 1<<PB1); // Port B aktivieren
DDRC |= (1<<PC6 | 1<<PC7); // Port C aktivieren
wait = 80;
stepNo = 0;
direction = 1;
}
void ClStepMotor::setWait(uint16_t *w) {
wait = *w;
}
void ClStepMotor::setDirection( int8_t *d ) {
direction = *d;
}
void ClStepMotor::setMotorStep(void) {
uint8_t valPrtB = 0;
uint8_t valPrtC = 0;
uint16_t w = wait;
stepNo += direction;
if( stepNo > 7 ) { // auch 2'er-Komplementzahlen (negative) sind usigned größer als 7 :)
if ( direction > 0 )
stepNo = 0;
if ( direction < 0 )
stepNo = 7;
}
switch( stepNo ) {
case 0: valPrtB = 1<<PB0; // 10-10
valPrtC = 1<<PC6;
break;
case 1: valPrtB = 1<<PB0; // 10-00
valPrtC = 0<<PC6;
break;
case 2: valPrtB = 1<<PB0; // 10-01
valPrtC = 1<<PC7;
break;
case 3: valPrtB = 0<<PB0; // 00-01
valPrtC = 1<<PC7;
break;
case 4: valPrtB = 1<<PB1; // 01-01
valPrtC = 1<<PC7;
break;
case 5: valPrtB = 1<<PB1; // 01-00
valPrtC = 0<<PC7;
break;
case 6: valPrtB = 1<<PB1; // 01-10
valPrtC = 1<<PC6;
break;
case 7: valPrtB = 0<<PB1; // 00-10
valPrtC = 1<<PC6;
break;
default: stepNo = 0;
break;
}
PORTB = (PORTB & !(1<<PB0 | 1<<PB1) ) | valPrtB; // Clear out old values and then set the new ones.
PORTC = (PORTC & !(1<<PC6 | 1<<PC7) ) | valPrtC;
while ( w-- )
_delay_us(1);
}
void ClStepMotor::setMotorOff(void) {
PORTB = (PORTB & !(1<<PB0 | 1<<PB1) ); // Clear out old values.
PORTC = (PORTC & !(1<<PC6 | 1<<PC7) );
}
Wie Ihr sehen könnt, programmiere ich gerne in C++. Das bringt mir die Vorteile, daß ich einmal geschriebenen Code wirklich einfach wiederverwenden kann. Aber in diesem Fall wird in der Prozedur motorStep() eine delay-Routine aufgerufen. Das ist natürlich nicht gut, und diese möchte ich gerne gegen die ISR ersetzen.
Ansonten: Was haltet Ihr von meinem Code?
Gruß,
Lev
Lesezeichen