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).