Witam szanownych kolegów. Piszę z prośbą o pomoc w następującym problemie.
Sprawa dotyczy mikrokontrolera Atmega32, konkretnie zewnętrznych przerwań INT0 i INT1. Wspomniany mikrokontroler steruje pracą większego urządzenia pomiarowego, którego jednym z zadań jest zliczanie impulsów pochodzących z zewnętrznego urządzenia. Impulsy są zbliżone do prostokątnych o częstotliwości od 20 do 200Hz. Z racji tego że, napisany przeze mnie kod jest bardzo rozbudowany, prezentuję tu jedynie fragmenty istotne dla tego problemu:
Problemem jest błędne zliczanie impulsów. Dla celów testowych na oba wejścia (INT0 i INT1) jednocześnie podaję ten sam sygnał. Gdy usunę z kodu wszystkie instrukcje nie związane ze zliczaniem impulsów, wyniki są prawidłowe. Przykładowo:
impulsy_A = 60 000 impulsów
impulsy_B = 60 000 impulsów
Natomiast gdy zaczynam dodawać do kodu poszczególne pozostałe fragmenty kodu ilość zliczonych impulsów zaczyna się coraz bardziej rozjeżdżać:
impulsy_A = 59 900 impulsów
impulsy_B = 60 000 impulsów
Nie wiem czy obie zmienne są zaniżane bo nie mam możliwości zadania układowi dokładnej ilości impulsów, natomiast zawsze impulsy zliczone na przerwaniu INT0 są zaniżone w stosunku do tych zliczanych na przerwaniu INT1.
Gdy tworzyłem program kierowałem się tą zasadą, że przerwania te są o najwyższym priorytecie i każdy przychodzący impuls na pewno zostanie zliczony bez względu na to w jakim zadaniu czy przerwaniu mikrokontroler aktualnie się znajduje. Czy byłby ktoś tak dobry wyprowadzić mnie z błędu?
Mikrokontroler taktowany jest kwarcem 16MHz.
Sprawa dotyczy mikrokontrolera Atmega32, konkretnie zewnętrznych przerwań INT0 i INT1. Wspomniany mikrokontroler steruje pracą większego urządzenia pomiarowego, którego jednym z zadań jest zliczanie impulsów pochodzących z zewnętrznego urządzenia. Impulsy są zbliżone do prostokątnych o częstotliwości od 20 do 200Hz. Z racji tego że, napisany przeze mnie kod jest bardzo rozbudowany, prezentuję tu jedynie fragmenty istotne dla tego problemu:
Code: c
Problemem jest błędne zliczanie impulsów. Dla celów testowych na oba wejścia (INT0 i INT1) jednocześnie podaję ten sam sygnał. Gdy usunę z kodu wszystkie instrukcje nie związane ze zliczaniem impulsów, wyniki są prawidłowe. Przykładowo:
impulsy_A = 60 000 impulsów
impulsy_B = 60 000 impulsów
Natomiast gdy zaczynam dodawać do kodu poszczególne pozostałe fragmenty kodu ilość zliczonych impulsów zaczyna się coraz bardziej rozjeżdżać:
impulsy_A = 59 900 impulsów
impulsy_B = 60 000 impulsów
Nie wiem czy obie zmienne są zaniżane bo nie mam możliwości zadania układowi dokładnej ilości impulsów, natomiast zawsze impulsy zliczone na przerwaniu INT0 są zaniżone w stosunku do tych zliczanych na przerwaniu INT1.
Gdy tworzyłem program kierowałem się tą zasadą, że przerwania te są o najwyższym priorytecie i każdy przychodzący impuls na pewno zostanie zliczony bez względu na to w jakim zadaniu czy przerwaniu mikrokontroler aktualnie się znajduje. Czy byłby ktoś tak dobry wyprowadzić mnie z błędu?
Mikrokontroler taktowany jest kwarcem 16MHz.