Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 5 sty 2025, o 04:57


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 3 mar 2013, o 22:56 
Offline
Użytkownik

Dołączył(a): 14 sty 2013
Posty: 36
Pomógł: 2

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?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
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).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2013, o 23:56 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27328
Lokalizacja: Szczecin
Pomógł: 1041

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2013, o 00:09 
Offline
Użytkownik

Dołączył(a): 14 sty 2013
Posty: 36
Pomógł: 2

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 mar 2013, o 14:12 
Offline
Użytkownik

Dołączył(a): 14 sty 2013
Posty: 36
Pomógł: 2

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.

main.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


max7219.h
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


max7219.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


microswitch.h
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


microswitch.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
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? :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 mar 2013, o 15:59 
Offline
Użytkownik

Dołączył(a): 14 sty 2013
Posty: 36
Pomógł: 2

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?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 kwi 2013, o 15:06 
Offline
Użytkownik

Dołączył(a): 14 sty 2013
Posty: 36
Pomógł: 2

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.

Składnia: [ Pobierz ] [ Ukryj ]
język c
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ć?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 kwi 2013, o 19:45 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27328
Lokalizacja: Szczecin
Pomógł: 1041

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 ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 kwi 2013, o 20:49 
Offline
Użytkownik

Dołączył(a): 14 sty 2013
Posty: 36
Pomógł: 2

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?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO