Motorsteuerung/V2/Motor/Motor.c
2012-10-22 16:27:44 +00:00

129 lines
2.6 KiB
C

#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define AINpin ((1<<PD6) | (1<<PD7))
volatile uint8_t led[3] = {(1<<PB3)|(1<<PB0),(1<<PB4)|(1<<PB0),(1<<PB5)|(1<<PB0)};
volatile uint8_t motor[6] = {
(1<<PD4)|(1<<PD1), //C+ A-
(1<<PD2)|(1<<PD1), //B+ A-
(1<<PD2)|(1<<PD5), //B+ C-
(1<<PD0)|(1<<PD5), //A+ C-
(1<<PD0)|(1<<PD3), //A+ B-
(1<<PD4)|(1<<PD3) //C+ B-
};
volatile uint8_t mux[6] = {
(0<<MUX2)|(1<<MUX1)|(0<<MUX0), //B
(0<<MUX2)|(0<<MUX1)|(1<<MUX0), //C
(0<<MUX2)|(1<<MUX1)|(1<<MUX0), //A
(0<<MUX2)|(1<<MUX1)|(0<<MUX0), //B
(0<<MUX2)|(0<<MUX1)|(1<<MUX0), //C
(0<<MUX2)|(1<<MUX1)|(1<<MUX0) //A
};
volatile uint8_t ind = 0;
void step() {
uint8_t i = ind;
PORTB = led[i];
PORTD = motor[i];
ADMUX = mux[i];
}
void runon() {
/*for(uint8_t j=0;j<2;j++) {
for(uint8_t i=0;i<6;i++) {
PORTB = led[i%3];
PORTD = motor[i];
_delay_ms(100);
}
}
/*for(uint8_t j=0;j<4;j++) {
for(uint8_t i=0;i<6;i++) {
PORTB = led[i%3];
PORTD = motor[i];
_delay_ms(50);
}
}
for(uint8_t j=0;j<8;j++) {
for(uint8_t i=0;i<6;i++) {
PORTB = led[i%3];
PORTD = motor[i];
_delay_ms(20);
}
}
for(uint8_t j=0;j<16;j++) {
for(uint8_t i=0;i<6;i++) {
PORTB = led[i%3];
PORTD = motor[i];
_delay_ms(10);
}
}
for(uint8_t j=0;j<32;j++) {
for(uint8_t i=0;i<6;i++) {
PORTB = led[i%3];
PORTD = motor[i];
_delay_ms(5);
}
}
for(uint8_t j=0;j<64;j++) {
for(uint8_t i=0;i<6;i++) {
PORTB = led[i%3];
PORTD = motor[i];
_delay_ms(3);
}
}*/
/*for(uint8_t k=0;k<120;k++) {
ind = k%6;
step();
_delay_ms(10);
}*/
}
ISR(ANA_COMP_vect) {
ind = ind+1%6;
step();
//_delay_ms(10);
}
int main(void) {
DDRB |= (1<<PB3) | (1<<PB4) | (1<<PB5) | (1<<PB0);
DDRD = 0b00111111;
DDRD &=~ AINpin;//as input
PORTD &=~ AINpin;//no Pull-up
runon();
cli();
ADCSRB |=(1<<ACME);//enable multiplexer
ADCSRA &=~(1<<ADEN);//make sure ADC is OFF
//ADMUX|=(0<<MUX2)|(1<<MUX1)|(1<<MUX0); //select ADC3 as negative AIN
ACSR |= (1<<ACIS1)|(0<<ACIS0);
ACSR |= (1<<ACIE); // Comparator Interrupt Enable setzen damit Interrupt aktiv
/*ACSR|=
(0<<ACD)| //Comparator ON
(0<<ACBG)| //Connect AIN0
(1<<ACIE)| //Comparator Interrupt enable
(0<<ACIC)| //input capture disabled
(0<<ACIS1)| //set interrupt on output toggle
(0<<ACIS0); */
PORTB = led[1];
PORTD = motor[1];
ADMUX = mux[1];
sei();
while(1) {
//PORTB = (1<<PB0);
/*for(uint8_t i=0;i<6;i++) {
PORTB = led[i%3];
PORTD = motor[i];
_delay_ms(10);
}*/
}
}