Właśnie pisałem jakiś kolejny program w GCC i jak pewnie większość z Was musiałem sobie skonfigurować liczniki by uzyskać... coś, nieważne co. Dziwię się, że środowisko związane z AVRGCC nie wpadło na pomysł by takie konfiguracje ludziom uprościć! Pewnie wielu z Was rozpisuje się w stylu:
Czyż nie byłoby prościej mieć plik nagłówkowy timerconf.h w którym wszelkie te łączenia i przesuwanie bitów zdefiniowne by były jako przyjazne i zrozumiałe definicje:
(0<<CS02) | (0<<CS01) | (1<<CS00) -> TIMER0_PRESCALER_1
(0<<CS12) | (1<<CS11) | (0<<CS10) -> TIMER1_PRESCALER_8
(1<<WGM01) | (0<<WGM00) -> TIMER0_CTC_ON
(1<<COM20) | (1<<COM21) -> TIMER2_PWM_CLEAR_DOWN
itd.
Wtedy możnaby przykładowo zapisać:
Prawda, że prościej i czytelniej?
A teraz pomarzmy dalej. Możnaby to usystematyzować i pójść na całego. Zaprządz do pracy preprocesor i za pomocą jednej funkcji - co prawda z dość skompilkowanymi warunkami - wykonać konfigurację licznika w najprostszy możliwy sposób:
Pewnie ktoś mógłby Mi zarzucić w tej chwili, że z GCC chciałbym zrobić GCCOMA (taki C-BASCOM). Lecz jak starałem się popełnić jeden program dla MSP430 to przykładowo w środowisku Code Composer były właśnie takie pliki nagłówkowe, które znacznie upraszczały konfigurację czegokolwiek.
Pojawią się też głosy: "No to zrób!". Być może. Ale czy nie można by wspólnie takiego czegoś opracować? Co o tym myślą starzy wyjadacze GCC...?
// **********************************************************
// procedurki pomocnicze
// **********************************************************
void timer_setup(void)
{
// generator podstawy czasu dla silnika
OCR0 = RELOAD; // wpisz wartość okresu przerwań
TCCR0 = (0<<CS02) | (0<<CS01) | (1<<CS00) | (1<<WGM01) | (0<<WGM00);
// preskaler = 1, CTC = włączone, jeszcze nie generuj przerwań
// generator podstawy czasu dla wyświetlacza
OCR1A = 0x1FFF;
TIMSK |= (1<<OCIE1A);
TCCR1A = (0<<WGM11) | (0<<WGM10);
TCCR1B = (0<<CS12) | (1<<CS11) | (0<<CS10) | (1<<WGM12);
// preskaler 8, CTC = włączone, generuj przerwania
// ok. 60Hz
// sterownik PWMa
// konfiguracja timer2 (czy to się nie pogryzie z silnikiem?)
TCCR2 = (0<<CS02) | (1<<CS01) | (0<<CS00) | (1<<WGM20) | (1<<COM21);
// prescaler = 8, PWM phase mode = włączone, tryb = clear downcount
// Fpwm = 3,9kHz
} Czyż nie byłoby prościej mieć plik nagłówkowy timerconf.h w którym wszelkie te łączenia i przesuwanie bitów zdefiniowne by były jako przyjazne i zrozumiałe definicje:
(0<<CS02) | (0<<CS01) | (1<<CS00) -> TIMER0_PRESCALER_1
(0<<CS12) | (1<<CS11) | (0<<CS10) -> TIMER1_PRESCALER_8
(1<<WGM01) | (0<<WGM00) -> TIMER0_CTC_ON
(1<<COM20) | (1<<COM21) -> TIMER2_PWM_CLEAR_DOWN
itd.
Wtedy możnaby przykładowo zapisać:
TCCR0 = TIMER0_PRESCALER_1 | TIMER0_CTC_ON;Prawda, że prościej i czytelniej?
A teraz pomarzmy dalej. Możnaby to usystematyzować i pójść na całego. Zaprządz do pracy preprocesor i za pomocą jednej funkcji - co prawda z dość skompilkowanymi warunkami - wykonać konfigurację licznika w najprostszy możliwy sposób:
timer0_conf(PRESCALE_1|PWM_FAST|PWM_INVERT_MODE)Pewnie ktoś mógłby Mi zarzucić w tej chwili, że z GCC chciałbym zrobić GCCOMA (taki C-BASCOM). Lecz jak starałem się popełnić jeden program dla MSP430 to przykładowo w środowisku Code Composer były właśnie takie pliki nagłówkowe, które znacznie upraszczały konfigurację czegokolwiek.
Pojawią się też głosy: "No to zrób!". Być może. Ale czy nie można by wspólnie takiego czegoś opracować? Co o tym myślą starzy wyjadacze GCC...?