Kod mojego przerwania wygląda tak. Program działa w rezultacie tak jak bym chciał, ale samo wykonanie przerwania zajmuje trochę czasu. Zoptymalizowałem kod tak jak potrafiłem i w tym momencie liczę na Waszą pomoc.
SW_pwm_12_channels:
Zależy mi na optymalizacji samego przerwania. Kod może zajmować więcej (ramu też sporo jeszcze zostało), byleby udało się go trochę przyśpieszyć.
Może nawet ktoś pokusiłby się o przepisanie tego do ASM i zrobienei z tego wstawki do C
Z góry dzięki za wszelką pomoc.
SW_pwm_12_channels:
volatile unsigned char chanell[12];
volatile const pwm_res = 32;
volatile unsigned char counter = 0;
#define PORTB_MASK (1 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3)|(1 << PB4)|(1 << PB5)|(1 << PB6)|(1 << PB7)
#define PORTD_MASK (1 << PD3)|(1 << PD4)|(1 << PD5)|(1 << PD6)
#define DEBUG_PIN (1<<PD2)
SIGNAL (SIG_OVERFLOW1)
{
PORTD |= DEBUG_PIN;
TCNT1 = 64920; //f = 32000Hz / f_pwm = 1kHz / oryg = 64911
if(counter == chanell[0]) PORTB &= ~(1<<0);
if(counter == chanell[1]) PORTB &= ~(1<<1);
if(counter == chanell[2]) PORTB &= ~(1<<2);
if(counter == chanell[3]) PORTB &= ~(1<<3);
if(counter == chanell[4]) PORTB &= ~(1<<4);
if(counter == chanell[5]) PORTB &= ~(1<<5);
if(counter == chanell[6]) PORTB &= ~(1<<6);
if(counter == chanell[7]) PORTB &= ~(1<<7);
if(counter == chanell[8]) PORTD &= ~(1<<3);
if(counter == chanell[9]) PORTD &= ~(1<<4);
if(counter == chanell[10]) PORTD &= ~(1<<5);
if(counter == chanell[11]) PORTD &= ~(1<<6);
if(counter == 31)
{
counter = 0;
PORTB |= PORTB_MASK;
PORTD |= PORTD_MASK;
}
counter++;
PORTD &= ~DEBUG_PIN;
}
void Init(void)
{
DDRB |= PORTB_MASK;
DDRD |= PORTD_MASK;
DDRD |= DEBUG_PIN;
CLKPR = (1 << CLKPCE); // enable clock prescaler update
CLKPR = 0; // set clock to maximum (= crystal)
TIFR = (1 << TOV1); // clear interrupt flag
TIMSK = (1 << TOIE1); // enable overflow interrupt
TCCR1B &= ~(1<<CS12);
TCCR1B &= ~(1<<CS11);
TCCR1B |= (1<<CS10);
sei();
}
Zależy mi na optymalizacji samego przerwania. Kod może zajmować więcej (ramu też sporo jeszcze zostało), byleby udało się go trochę przyśpieszyć.
Może nawet ktoś pokusiłby się o przepisanie tego do ASM i zrobienei z tego wstawki do C
Z góry dzięki za wszelką pomoc.
