[avr-gcc] problem z arytmetyka ...

Witam, napisalem prosty programik to liczenia czasu twania okresu przebiegu prostokatnego na wejscie IC1. Wyglada jak ponizej:

volatile u16 Counter; volatile u16 Capture; volatile u08 Ready; volatile u08 Start; volatile u32 Wynik;

int main ( void ) {

ICR1 = 0; TCNT1 = 0; TIMSK |= (1<<TICIE1) | (1<<TOIE1); TCCR1B |= (1<<ICNC1);

#if defined (__AVR_ATmega128__) // Config IC1 port ATMEGA128 DDRD &= ~(1<<DDD4); PORTD &= ~(1<<PD4); #endif

Ready = 0; Start = 1; sei();

//----- Program glowny -------------------------------------------------------- while (1) {

if (Ready == 1) { Wynik = (u32)Counter * 0x0000FFFF + (u32)Capture; Ready = 0; }

}

return 0; }

SIGNAL(SIG_OVERFLOW1){ TCNT1 = 0; Counter++; Ready = 0; }

SIGNAL(SIG_INPUT_CAPTURE1){ if (Start == 1) { TCNT1 = 0; ICR1 = 0; TCCR1B |= (1<<CS10); //Start Timer1

Counter = 0; Ready = 0; Start = 0; } else { Capture = ICR1; TCCR1B &= ~(1<<CS10); //Stop Timer1

Ready = 1; Start = 1; }

}

Wycialem procedury wyswietlania wyniku na LCD zeby nie zasmiecac zbytnio. Jednak zauwazylem ze Counter nie jest mnozona przez 0x0000FFFF i przyjmuje warosc ujemna jak rowniez Capture tez jest raz ujemna a raz dodatnia. Ludzie co jest grane???? Gdzie tkwi blad. Na AVRStudio 4.0 wszystko sie symuluje poprawnie (wrrr).

Reply to
invalid unparseable
Loading thread data ...

Akurat AVR-studio nie znam, ale moze mnozyc przez 0x0ffffL ?

Reply to
jerry1111

No i po cholere taka operacja? Bo siakos nie rozumiem. Napisz po ludzku: wynik=(counter<<16)-1+capture

Reply to
jerry1111
Reply to
invalid unparseable
Reply to
invalid unparseable
Reply to
invalid unparseable
Reply to
invalid unparseable

bylo, ale pogrzebalem w makefile i all dziala !! big tx.

Reply to
invalid unparseable

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.