Witam!
Zauważyłem dziwną rzecz. Jeśli w kodzie użyję funkcji _delay_ms z argumentem w postaci zmiennej, rozmiar skompilowanego kodu rozrasta się do około 40kB, zaś jeśli parametrem będzie bezpośrednio liczba, kod zajmuje 4kB. Co może być przyczyną?
A, jeśli wywołuję tę funkcję z parametrem - zmienną, program nie działa prawidłowo.
Pomóżcie, proszę!
Zauważyłem dziwną rzecz. Jeśli w kodzie użyję funkcji _delay_ms z argumentem w postaci zmiennej, rozmiar skompilowanego kodu rozrasta się do około 40kB, zaś jeśli parametrem będzie bezpośrednio liczba, kod zajmuje 4kB. Co może być przyczyną?
A, jeśli wywołuję tę funkcję z parametrem - zmienną, program nie działa prawidłowo.
Pomóżcie, proszę!
#define F_CPU 12000000UL
#define PWM_MAX 100
#include <avr/io.h>
#include <util/delay.h>
void inicjuj(){
int i;
DDRB = _BV(DDB3);
for(i = 0; i < 3; i++){
PORTB = 0x08;
_delay_ms(100);
PORTB = 0x00;
_delay_ms(100);
} //for i
TCCR0 = _BV(WGM00) // timer 2 fast PWM
| _BV(WGM01) // ditto
| _BV(COM01)
| _BV(COM00) // clear OC2 on compare match, set OC2 at TOP
| _BV(CS00); // 1/8 prescale
OCR0 = 255;
DDRA = 0x00;
PORTA = 0xFF;
} //inicjuj
void jasnosc(volatile uint8_t *kanal, uint8_t wartosc){
if(wartosc > PWM_MAX) wartosc = PWM_MAX;
*kanal = wartosc;
} //sciemniaj
int main(){
double czest = 10;
char i;
inicjuj();
while(1){
if(bit_is_clear(PINA, PA0)){
_delay_ms(20);
if(bit_is_clear(PINA, PA0)){
if(OCR0 <= (PWM_MAX - 1)){
jasnosc(&OCR0, ++OCR0);
_delay_ms(10);
}
} // while PA0
} //PA1
if(bit_is_clear(PINA, PA1)){
_delay_ms(20);
if(bit_is_clear(PINA, PA1)){
if(OCR0 >= 1){
jasnosc(&OCR0, --OCR0);
_delay_ms(10);
}
} // while PA1
} //PA1
if(bit_is_clear(PINA, PA2)){ // zapalanie
_delay_ms(20);
if(bit_is_clear(PINA, PA2)){
jasnosc(&OCR0, 255);
}
}
if(bit_is_clear(PINA, PA3)){ //gaszenie
_delay_ms(20);
if(bit_is_clear(PINA, PA3)){
jasnosc(&OCR0, 0);
}
}
if(bit_is_clear(PINA, PA4)){
_delay_ms(20);
while(bit_is_clear(PINA, PA4)){
jasnosc(&OCR0, 0);
_delay_ms(czest * 50);
jasnosc(&OCR0, 255);
_delay_ms(czest * 50);
}
}
if(bit_is_clear(PINA, PA5)){
_delay_ms(20);
if(bit_is_clear(PINA, PA5)){
if(czest >= 2) czest -= 1;
while(bit_is_clear(PINA, PA5));
}
}
if(bit_is_clear(PINA, PA6)){
_delay_ms(20);
if(bit_is_clear(PINA, PA6)){
czest += 1;
while(bit_is_clear(PINA, PA6));
}
}
} //while
} // main
