eMCe2 napisał(a):
A ja nie widzę gdzie bufor Text jest definiowany np
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Buffor jest zdefiniowany, poprostu wrzuciłem najważniejsze fragmenty kodu które dotyczą pomiaru prędkości.
Kuźnia napisał(a):
Witam
Przede wszystkim nie napisałeś jednej ważnej rzeczy. Mianowicie z jakiego napięcia będzie zasilany wentylator PC bo jeżeli z 12V, to należy amplitudę impulsów wyjściowych wentylatora ograniczyć do poziomu akceptowalnego przez mikrokontroler.
Przy wyświetlaniu przydało by się najpierw wykasować starą wartość (albo LCD_CLS() albo nadpisać ją spacjami i z powrotem ustawić lcd_locate() ). Może to powoduje chaotyczne wartości na wyświetlaczu.
Wyświetlając zawartość rejestru ICR1 wyświetlasz przechwyconą wartość licznika, która zawiera ilość zliczonych impulsów zegara wewnętrznego AVR-a z preskalerem do momentu pojawienia się impulsu z wentylatora na pinie ICP1. Nie jest to wartość o jaką Ci chodzi bo nie zliczasz ilości impulsów z wentylatora. Jest to przechwytywanie.
Pomyśl czy nie należałoby w rejestrze TCCR1B ustawić też bitu CS12 co da Ci możliwość "taktowania" rejestru zliczającego sygnałem zewnętrznym "External Clock Source" na końcówce T1 (PB1). To już niestety nie będzie "tryb przechwytywania" i będziesz np. musiał sam zadbać o wyzerowanie rejestru po pomiarze, bramkowanie itp. A przy pomiarze prędkości czas mierzyć drugim timerem.
Wentylator jest zasilany napięciem 12V. Nie znalazłem żadnych wiadomości na temat w jaki sposób czujnik Halla podaje impulsy (RPM). Więc skorzystałem z oscyloskopu. Nie wiem czy pomiar był prawidłowy, ale wyszło że impulsy mają amplitudę 300-400mV. Troszkę się zdziwiłem, no ale tak prawdopodobnie jest. Trzeba będzie zamontować jakis wzmacniacz albo klucz tranzystorowy. Bo rozumiem że ATmega32 wykrywa tylko impulsy o amplitudzie równej napięciu zasilania procka? Odnośnie wyświetlacza mam pomiar temperatury zaprogramowany w podobny sposób bez czyszczenia poprzedniej wyświetlanej wartości i działa, więc chyba nie tutaj jest problem, ale wezmę to pod uwagę.
Odnoście ICP1 tak wiem że jest to wartość licznika, a nie ilość impulsów. I właśnie na podstawie tej wartości chciałbym wyliczyć prędkość. W jakiś sposób zliczać okres tych impulsów, jeszcze nie przemyślałem do końca tej sprawy. Ważne jest to aby wykonać pomiar przy użyciu jednego timera (timer1 16-bitowy) ponieważ dwa pozostałe wykorzystuję w innym celu. Chciałbym się upewnić że wektor przerwania jest prawidłowy i że dobrze rozumiem zasadę działania. Podczas pojawienia się zbocza narastającego (akceptowanego przez procek) do rejestru ICR1 wpisywana jest wartość licznika. Dzieje się to automatycznie nie trzeba ustawiać, bądź sprawdzać flag?