Udało mi się z powodzeniem uruchomić pierwszy silnik niestety dochodzę do momentu gdzie obsługa kolejnych silników zmusiłaby mnie do kopiowania kodu i zmian tylko nazw portów, chciałbym aby to odbywało się w locie. Nie wiem jak to wygląda w języku C lub jaka drogę obrać w kierunku optymalizacji. Czytałem o strukturach lecz nie wiem czy one nadają się do operacjach na rejestrach.
Program realizuje odczyt wartości ADC i ustawienie silnika o tą wartość kroków. Sterowanie silnikiem odbywa się w poleceniu SWITCH w przerwaniu TIMER0.
Proszę o propozycje, przedstawiam kod:
Kod: Zaznacz cały
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define SET_BIT(r,x) r|=_BV(x)
#define CLR_BIT(r,x) r&=~_BV(x)
#define TOG_BIT(r,x) r^=_BV(x)
#define dirout DDRD
#define portout PORTD
#define sw1 !(PINB & 1<<PB0)
#define sw2 !(PINB & 1<<PB1)
void adc_init (void);
uint8_t adc_read (uint8_t chanel);
volatile uint8_t zadana=50 ;//wejsciowa wartosc
volatile uint8_t step=0 ;//wyjsciowa
volatile uint8_t pom=0 ;//pomocnicza
int main(void)
{
TCCR0 |= (1<<WGM01);
TCCR0 |= (1<<CS02)|(1<<CS00);
OCR0 = 15;
TIMSK |= (1<<OCIE0);
sei();
adc_init();
while(1)
{
zadana=adc_read(1);
_delay_ms(10);
}
}
ISR(TIMER0_COMP_vect)
{
if (zadana>pom) pom++;
if (zadana<pom) pom--;
step=pom%4;
dirout=0;
portout=0;
switch(step)
{
case 0:
SET_BIT(dirout,0); //1STEP
SET_BIT(portout,0);
SET_BIT(dirout,1);
CLR_BIT(portout,1);
break;
case 1:
SET_BIT(dirout,3); //2STEP
SET_BIT(portout,3);
SET_BIT(dirout,2);
CLR_BIT(portout,2);
break;
case 2:
SET_BIT(dirout,1); //3STEP
SET_BIT(portout,1);
SET_BIT(dirout,0);
CLR_BIT(portout,0);
break;
case 3:
SET_BIT(dirout,2); //4STEP
SET_BIT(portout,2);
SET_BIT(dirout,3);
CLR_BIT(portout,3);
break;
}
}
void adc_init(void)
{
ADMUX |=(1<<REFS0)|(1<<ADLAR);
ADCSRA |=(1<<ADEN)|(1<<ADPS0)|(1<<ADPS1);
}
uint8_t adc_read (uint8_t kanal)
{
ADMUX|=(ADMUX&0xF8)|kanal;
ADCSRA|=(1<<ADSC);
while(ADCSRA & (1<<ADSC));
return ADCH;
}