Pracuję obecnie nad układem obsługującym kilka czujników na I2C oraz jednym na USARTcie i wysyłaniu przeliczonych i obrobionych danych przez drugi USART do innego mikroprocka.
Program, którym obsługuję całość, składa się z:
1. zewnętrznych przerwań generowanych przez czujniki (linie INT0...7), gdzie są ustawiane flagi, że czujniki mają nowe dane
2. z przerwania od odbioru danych po USARTcie, gdzie odebrane bajty wpisywane są do buforu
3. z przerwania od skończenia konwersji na ADC (triggerem jest przepełnienie timera0) ustawiającego flagę, że dane można zczytać i obrobić
4. z przerwania compare match od timera1, ustawiającego flagę, że należy wysłać to co mamy do tej pory.
W pętli głównej wszystkie flagi są zaifowane i czyszczone po wejściu w daną procedurę, gdzie wykonywany jest odbiór danych i ich obróbka.
Wszystko działało sensownie do momentu rozbudowania funkcji interpretujących bufor (generalnie chodzi, że zajmują więcej czasu). Obecnie program wykonuje się na początku poprawnie jednak po pewnym czasie (5-10 sekund) niektóre przerwania przestają się wykonywać. Powstawiałem trochę instrukcji wysyłania po usarcie w różnych miejscach, żeby zobaczyć co się dzieje i w momencie wieszania przestają się wykonywać przerwania od timera1 oraz wszystkie INT0..7 od czujników. Nadal jednak wykonuje się przerwanie od odebrania danych po USARTcie oraz przerwanie od zakończenia konwersji ADC i główna pętla programu wykonuje odpowiadające im ify. Gdy skróci się wykonywany w ifach kod, to program wraca do normalnego działania. Czym takie zachowanie może być spowodowane ? Z logiki działania wydaje się, że przerwania powinny nadal się wykonywać niezależnie od ilości kodu w funkcji main. Czy ktoś ma jakieś sugestie ?
Program, którym obsługuję całość, składa się z:
1. zewnętrznych przerwań generowanych przez czujniki (linie INT0...7), gdzie są ustawiane flagi, że czujniki mają nowe dane
2. z przerwania od odbioru danych po USARTcie, gdzie odebrane bajty wpisywane są do buforu
3. z przerwania od skończenia konwersji na ADC (triggerem jest przepełnienie timera0) ustawiającego flagę, że dane można zczytać i obrobić
4. z przerwania compare match od timera1, ustawiającego flagę, że należy wysłać to co mamy do tej pory.
W pętli głównej wszystkie flagi są zaifowane i czyszczone po wejściu w daną procedurę, gdzie wykonywany jest odbiór danych i ich obróbka.
Wszystko działało sensownie do momentu rozbudowania funkcji interpretujących bufor (generalnie chodzi, że zajmują więcej czasu). Obecnie program wykonuje się na początku poprawnie jednak po pewnym czasie (5-10 sekund) niektóre przerwania przestają się wykonywać. Powstawiałem trochę instrukcji wysyłania po usarcie w różnych miejscach, żeby zobaczyć co się dzieje i w momencie wieszania przestają się wykonywać przerwania od timera1 oraz wszystkie INT0..7 od czujników. Nadal jednak wykonuje się przerwanie od odebrania danych po USARTcie oraz przerwanie od zakończenia konwersji ADC i główna pętla programu wykonuje odpowiadające im ify. Gdy skróci się wykonywany w ifach kod, to program wraca do normalnego działania. Czym takie zachowanie może być spowodowane ? Z logiki działania wydaje się, że przerwania powinny nadal się wykonywać niezależnie od ilości kodu w funkcji main. Czy ktoś ma jakieś sugestie ?
