Przerabiając SPI z "niebieskiej książki" postanowiłem przetestować je na układzie MAX7219. Założenie było takie, że wykonam stoper liczący z dokładnością do 1/100 sek. Generalnie wszystko udało się ładnie wykonać, poniżej kod źródłowy ale mam "mieszane uczucia" czy umieszczanie w obsłudze przerwania wyświetlania w ten sposób jest prawidłowe, czy jednak wyprowadzać to do pętli głównej?
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
No i jeszcze jedna sprawa, czy da się w C przeciążyć funkcję czy tylko w C++? Chciałbym mieć w bibliotece np. kilka funkcji init z różnymi argumentami (np ilością układów MAX połączonych kaskadowo).
przesyłanie po SPI jest tak szybkie że generalnie nie powinno tu sprawiać kłopotu, jednak pomyśl sobie - ten program można drastycznie uprościć.
1. w przerwaniu zliczaj TYLKO czas - i tak to już robisz 2. do 1/100 sek - ustawiaj jakąś flagę - spi_send_flag na JEDEN 3. w pętli głównej programu gdy ta flaga jest = 1 to ją zerujesz i jednocześnie wysyłasz po kolei wszystkie cyfry.
wtedy przerwanie jest w ogóle nie obciążone a program ładnie przejrzyście napisany w sposób nieblokujący
Ok, właśnie tak kombinuję tylko wydawało mi się, że lepiej z przerwania wysyłać zależnie od czasu od 1 do 4 cyfr (zawsze to mniej niż w pętli głównej za każdym razem 4) ale teraz widzę, że można inaczej zmienne zorganizować i czasowo wyjdzie na to samo a kod się znacznie uprości. SCK SPI ustawiłem na Fosc/2 więc faktycznie 1 bit to tylko 2 takty zegara i nie było problemów nawet z przesłaniem wszystkich wyświetlaczy w przerwaniu.
Poniżej filmik z wygranej bitwy z MAX7219. Założenia do "projektu" były takie: wykonać stoper zliczający z dokładnością do 1/100 sek. Wykorzystać 4 nieblokujące klawisze z następującymi funkcjami: klawisz 1 - krótkie naciśnięcie start/stop odliczania czasu, długie naciśnięcie reset stopera klawisz 2 - krótkie naciśnięcie "zatrzymanie" na wyświetlaczu czasu bieżącego, w tle cały czas trwało odliczanie czasu, ponowne naciśnięcie wznowienie wyświetlania czasu klawisz 3 - krótkie naciśnięcie zmniejszenie intensywności świecenia wyświetlacza, długie naciśnięcie ustawienie intensywności na minimum (na filmie pokazane również odliczanie przy minimalnej intensywności) klawisz 4 - krótkie naciśnięcie zwiększenie intensywności świecenia wyświetlacza, długie naciśnięcie ustawienie intensywności na maksimum
Obsługa klawiszy zaczerpnięta z bloga Mirka. A reszta z noty katalogowej MAX7219 i ATmega32. Poniżej kody. Obsługa SPI jest w max7219.c bo nie chciałem już tworzyć oddzielnej biblioteki.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
A teraz jeszcze pytanie. Co radzicie do dokładnego odmierzania czasu? Chodzi o to, ze chciałbym wykonać układ mierzący czas z dokładnością właśnie do 1/100 sek ale pomiary muszą być dokładne. Chodzi o odmierzanie czasu biegu. Wyzwolenie i zatrzymanie tego pomiaru to inna sprawa, obecnie chodzi mi tylko o odmierzenie czasu. Myślałem nad jakimś rtc umożliwiającym generowanie co 10 ms przerwania (chyba jest to stabilniejsze niż zwykły timer w mikrokontrolerze) co o tym sądzicie? A może jakieś inne podpowiedzi?
Przeglądnąłem notę ATmega32 - Timer2 i faktycznie tryb asynchroniczny wygląda obiecująco na moje potrzeby. RTC chciałem wykorzystać ze względu na to, że w projekcie będę potrzebował jeszcze czasu i daty więc i tak będzie. Może jeszcze jakieś propozycje?
Niestety tryb asynchroniczny z kwarcem 32,768 nie umożliwia dokładnego generowania przerwania co 10 ms. Błędy są jak na moje potrzeby zbyt duże - chyba, ze coś źle liczę. Poniżej kod na którym "testowałem" Timer2 async.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Skłaniam się jednak do jakiegoś sprzętowego rozwiązania, które umożliwia generowanie przerwania z częstotliwością 100Hz no i przy okazji może ma jakieś RTC. Możecie coś polecić?
No dowolny układ RTC - dowolny - pierwszy z brzegu - jest ich przecież całe mrowie i na dowolne magistrale chociażby PCF8583 itp .... czy o coś innego ci chodziło ?
Właśnie szukam rozwiązania podobnego do PCF8583 pracującego jako clock ale mającego możliwość generowania przerwania na wyjściu z częstotliwością 100Hz a nie 1Hz. Wiem, że mogę go wykorzystać w innym trybie, ale w takim przypadku potrzebowałbym 2 takich układów. A poniżej krótki opis, który rozjaśni do czego to potrzebuję. Chciałbym wykonać układ, który mierzy czas z dokładnością do 1/100 sek. Poza tym po zatrzymaniu pomiaru zapisuje datę, godzinę (hh:mm) zakończenia pomiaru oraz dokładny zmierzony czas. (taki stoper logger). Może osoby bardziej doświadczone podpowiedzą jak to można inaczej wykonać, jakieś wskazówki?
Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 7 gości
Nie możesz rozpoczynać nowych wątków Nie możesz odpowiadać w wątkach Nie możesz edytować swoich postów Nie możesz usuwać swoich postów Nie możesz dodawać załączników