Dopiero raczkuje w temacie CNC i mikro-kontrolerów mimo to ostatnimi czasy porwałem się na to aby zbudować własny sterownik dla silników bipolarnych. Wyglądać ma to tak, że uC będzie posiadał 4 linie wyjścia służące do załączania odpowiednich tranzystorów, są to piny PC0-PC3, STEP/DIR na pinach PD0(int0)/PD2 , oraz zworka określająca tryb pracy półkrok/pełny krok na pinie PD1. Chciałbym aby ktoś mający doświadczenie praktyczne rzucił na to okiem i stwierdził jak bardzo źle jest

Kod: Zaznacz cały
/*
* Created: 2013-03-20 14:44:43
* uC: Atmega8
*
* Impulsy kroków odbierane na INT0 :: 4
* Kierunek obrotów zależny od PD0 :: 2
* Tryb pracy pełny krok/półkrok zależny od PD1 :: 3
*
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#define POLKROK 0
#define PELNYKROK 1
uint8_t licznik = 0, kroki[4], polkroki[8], tryb_pracy = 0;
int main(void) {
DDRD = 0x00;
DDRC = 0x0f;
MCUCR |= (1<<ISC01) | (1<<ISC00) ; // INT0 reaguje na zbocze narastajace
GICR |= 1 << INT0; // włączenie INT0
kroki[0] = 0b1010; // 0xA
kroki[1] = 0b0110; // 0x6
kroki[2] = 0b0101; // 0x5
kroki[3] = 0b1001; // 0x9
polkroki[0] = 0b0001;
polkroki[1] = 0b1001;
polkroki[2] = 0b0101;
polkroki[3] = 0b0110;
polkroki[4] = 0b0100;
polkroki[5] = 0b1000;
polkroki[6] = 0b0000;
polkroki[7] = 0b0010;
// Pełny krok czy półkrok ?
if( PIND & 0x02 )
tryb_pracy = POLKROK;
else
tryb_pracy = PELNYKROK;
sei(); // włączenie przerwań
while(1) {
}
}
void pelny_krok() {
if( PIND & 0x01 ) {
licznik = licznik < 3 ? licznik+1 : 0;
} else {
licznik = licznik > 0 ? licznik-1 : 3;
}
PORTC = kroki[licznik];
}
void pol_krok() {
if( PIND & 0x01 ) {
licznik = licznik < 7 ? licznik+1 : 0;
} else {
licznik = licznik > 0 ? licznik-1 : 7;
}
PORTC = polkroki[licznik];
}
ISR(INT0_vect) { // obsługa przerwania INT0
if(tryb_pracy==POLKROK)
pol_krok();
else
pelny_krok();
}