#define hall1 2 #define hall2 3 #define hall3 4 int stepstate; bool hall1state; bool hall2state; bool hall3state; void ExInt0() { hall1state = digitalRead(hall1); NextStep(); } void ExInt1() { hall2state = digitalRead(hall2); NextStep(); } ISR(PCINT2_vect) { hall3state = digitalRead(hall3); NextStep(); } ISR(ADC_vect) { int x = ADCH; // read 8 bit value from ADC OCR1B = map(x,0,255,1,799); } ISR(TIMER1_COMPA_vect) { switch (stepstate) { case 1: PORTD = B00100000; PORTB = B00000001; break; case 2: PORTB = B00000011; break; case 3: PORTB = B01000000; PORTD = B00000010; break; case 4: PORTB = B11000000; break; case 5: PORTB = B10000000; PORTD = B00000100; break; case 6: PORTD = B00100000; PORTB = B00000100; break; } } ISR(TIMER1_COMPB_vect) { PORTD = B01000000; PORTB = B00000101; } void NextStep() { if ((hall1state == 1) && (hall2state == 0) && (hall3state == 1)) { stepstate = 1; } if ((hall1state == 0) && (hall2state == 0) && (hall3state == 1)) { stepstate = 2; } if ((hall1state == 0) && (hall2state == 1) && (hall3state == 1)) { stepstate = 3; } if ((hall1state == 0) && (hall2state == 1) && (hall3state == 0)) { stepstate = 4; } if ((hall1state == 1) && (hall2state == 1) && (hall3state == 0)) { stepstate = 5; } if ((hall1state == 1) && (hall2state == 0) && (hall3state == 0)) { stepstate = 6; } TCNT1 = 790; } void setup() { DDRD = B11100000; //Pin 0,1,2,3,4 Input; Pin 5,6,7 Output DDRB = B00000111; //Pin 8,9,10 Output TCCR1A = 0; TCCR1B = 0; TCCR1B |= (1 << WGM12) | (1 << CS10); //CTC Mode, Prescaler 1 TCNT1 = 0; OCR1A = 800; OCR1B = 0; TIMSK1 = 0; TIMSK1 |= (1 << OCIE1B) | (1 << OCIE1A); ADCSRA = 0; // clear ADCSRA register ADCSRB = 0; // clear ADCSRB register ADMUX |= (0 & 0x07); // set A0 analog input pin ADMUX |= (1 << REFS0); // set reference voltage ADMUX |= (1 << ADLAR); // left align ADC value to 8 bits from ADCH register ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); //Prescaler 128 ADCSRA |= (1 << ADATE); // enable auto trigger ADCSRA |= (1 << ADIE); // enable interrupts when measurement complete ADCSRA |= (1 << ADEN); // enable ADC ADCSRA |= (1 << ADSC); // start ADC measurements PCICR |= 0b00000100; // turn on port d PCMSK2 |= 0b00010000; // turn on PD4 (D4) attachInterrupt(0, ExInt0, CHANGE); attachInterrupt(1, ExInt1, CHANGE); hall1state = digitalRead(hall1); hall2state = digitalRead(hall2); hall3state = digitalRead(hall3); } void loop() { }