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



Teraz jest 24 sty 2025, o 20:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 27 sie 2013, o 23:41 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

Swego czasu popełniłem kod pozwalający podłączyć wyświetlacz siedmio segmentowy do dowolnych pinów procesora. Ostatnio na forum pojawiło się pytanie o taką możliwość. Postanowiłem zaproponować swoje rozwiązanie w postaci biblioteczki, a może raczej półki z książkami.
Klu tematu do zmienne tablicowe przechowujące przypisania segmentów do portów. Konfiguracja odbywa się przez odpowiednie wpisy w pliku nagłówkowym. Multipleksowanie odbywa się poprzez cykliczne wywołanie funkcji LED7_TIMER0_OVF_vect() wstrzykniętej w procedurę obsługi przerwania. Nazwa mówi sama za siebie. Być może nie najszczęśliwiej dobrana, bo może ktoś użyć innego timera do obsługi multipleksu. Miałem wersję multipleksowania na zasadzie flagi podnoszonej w przerwaniu i eventu wołanego w pętli głównej, ale doszedłem do wniosku, że wołanie bezpośrednio z przerwania pozwoli wyczyścić pętlę główną z kodu który de facto ukryłem w biblioteczce. Należy zaznaczyć, że kod zabiera sporo zasobów ale pozwala dowolnie żonglować podpięciem segmentów. Czas na kod.
Plik nagłówkowy .h:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

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


Wszelkie krytyczne uwagi mile widziane jak również pomoc w optymalizacji kodu.

Jeszcze filmik. Sory za jakość ale nagrywałem kamerką laptopa. Do ATB włożona ATMega8 w przejściówce. Jak widać kabelki podłączone do różnych portów jak popadło.


Poprawka kodu.
Dla poprawności politycznej wprowadziłem możliwość obsługi multipleksowania w pętli głównej. Konfiguracja trybu oczywiście w pliku nagłówkowym. Zmieniłem również nazwę procedury do wstrzyknięcia w przerwanie.

_________________
sig off ;(



Ostatnio edytowano 29 sie 2013, o 15:40 przez perlon, łącznie edytowano 14 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sie 2013, o 11:47 
Offline
Moderator
Avatar użytkownika

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

Antystatyczny napisał(a):
tak na szybko podpowiedzieć, by raczej nie stosować skoku do funkcji wprost z przerwania. Unikamy w ten sposób niepotrzebnych rozkazow push i pop,


A tu są aż trzy skoki z przerwania do funkcji, z tej funkcji jeszcze do funkcji i chyba jeszcze raz. Niestety kod jest MEGA zagmatwany ... oczywiście jak działa to dobrze ;)

ale tak raczej nie należy podchodzić do pisania kodu. Tzn tak też na prawdę to warto się zastanowić w ogóle czy jest sens obsługi Wyświetlacza LED na różnych pinach ... ??? Tak sobie myślę tylko - że jak już ktoś niby usilnie potrzebuje rozbić to na różne piny - to zwykle chyba ma do czynienia z jakimś małym prockiem np ATtiny. No ok ... uda się ... ale z kolei KOSZT związany z

1. stratą pamięci FLASH
2. stratą szybkości

może być a dla mnie byłby wręcz nie do przyjęcia ;) to już bym wolał dać ciut większy procek ... ALBO ....

albo zrobić to tak jak się należy czyli np na REJESTRACH przesuwnych. Wtedy wystarczą (uwaga!) ramptem TRZY PINY a do tego na prawdę banalny i bardzo szybko działający kod do wsuwania w te rejestry danych i po zawodach.

To co tutaj piszę nie ma na celu "skrytykowania" tego projektu - raczej tylko zwrócenie uwagi jak się poruszać przy tworzeniu takich projektów na przyszłość.... Ale też to co piszę to moje subiektywne zdanie i oczywiście każdy może zrobić i robi po swojemu.

WAŻNE! że autorowi działa ;) i to się liczy.

_________________
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: 28 sie 2013, o 12:17 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

W przypadku multipleksu w pętli głównej (LED7_MULTIPLEX_EVENT = 1) skok jest tylko jeden, ustawienie flagi i powrót. Można to oczywiście przenieść bezpośrednio do obsługi przerwania. W przypadku multipleksowania w przerwaniu faktycznie skoki są trzy i dodatkowo pętle do zapalania/gaszenia poszczególnych segmentów. Mamy demokrację i jest wybór ;-). Poprawiłem jeszcze kod bo zabrakło w przerwaniu ustawienia flagi do multipleksu. Faktycznie przedstawione rozwiązanie jest zasobożerne i to jest koszt swobody pinologicznej. Być może w projektach bez krytycznych zależności czasowych pozwoli na uproszczenie płytki PCB, ale głównie służyło celom edukacyjnym (tablicowanie wskaźników etc). Chciałbym do tego kodu dołożyć jeszcze "ściemniacz" - czyli możliwość wprowadzenia wcześniejszego zgaszenia wyświetlacza jeszcze przed przeskokiem na kolejny wynikający z multipleksu ( taki programowy PWM ). Może ktoś podrzuci jakiś pomysł.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sie 2013, o 12:23 
Offline
Moderator
Avatar użytkownika

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

perlon napisał(a):
Mamy demokrację i jest wybór


Oczywiście, że tak :lol: i to się wpisuje w główną zasadę, którą ja zawsze wyznaję, że nie ma NAJLEPSZEGO rozwiązania. Rozwiązań jest tyle ilu programistów jest na świecie ;)

_________________
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: 28 sie 2013, o 14:34 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

No i oświeciło mnie w temacie przygaszania wyświetlacza. Wypełnienie ustalam za pomocą stałej dosłownej LED7_PWM_TIMER. W przypadku wpisania wartości przekraczającej LED7_MULTIPLEX_TIMER dyrektywy kompilacji usuną niepotrzebny kod. Można to sobie oczywiście zrobić na zmiennej wyrzucając przy okazji dyrektywy kompilacji warunkowej jeżeli będzie potrzebna interaktywna zmiana PWM.

_________________
sig off ;(



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: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO