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



Teraz jest 29 mar 2024, o 08:49


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 5 sie 2017, o 13:21 
Offline
Nowy

Dołączył(a): 16 lip 2017
Posty: 4
Pomógł: 0

Witajcie,

Zabrałem się za pisanie kodu do obsługi wyświetlacza 7-segmentowego z pomocą rejestru 74HC595. Bardzo fajnie mi to działa. W programie chcę a nawet chyba muszę zastosować timery programowe, gdyż chcę mieć jeszcze obsługę klawiszy, np z pomocą tej strony: http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-zwoka-czasowa-cd3.html

Zmianę wyświetlacza realizuję już za pomocą timera 1. Za pomocą timera 2 chciałbym zmieniać stan zwykłej diody LED co 1 sekundę. Jeżeli "uruchomię" w programie dwa timery na raz wyświetlacz działa poprawnie, dioda natomiast migocze bardzo szybko, że ciężko zauważyć. Jeżeli "uruchomię" tylko jeden kawałek kodu np. dla timera 2 z diodą, dioda miga jak powinna.

Proszę mi powiedzieć, w którym miejscu nie rozumiem zasady działania timerów programowych? Bo tak najpewniej jest. Kod poniżej.

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2017, o 15:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Segmenty wyświetlacza i LED3 masz na tym samym porcie. Wysyłając dane na wyświetlacz nadpisujesz stan pinu PC0, na którym masz LED3.

Przenieś LED3 na pin innego portu albo użyj maskowania wysyłając dane na wyświetlacz tak aby zmieniać stan pinów PC1-PC7 nie ruszając pinu PC0.
Spróbuj tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W pierwszym nawiasie zerowane są piny PC1-PC7. PC1 zostaje bez zmian.
W drugim nawiasie w wartości odczytanej z tablicy wyzerowany zostaje najmłodszy bit.
Potem te dwie wartości np. 0b00000001 | 0b11111110 są sumowane i wysyłane na PORTC. W wyniku sumowania na PORTC trafi wartość 0b11111111.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2017, o 15:17 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 181
Lokalizacja: Kraków
Pomógł: 30

Masz zdefiniowane LED_DATA jako PORTC i potem w pętli głównej co 1 ms wpisujesz do tego portu nową wartość za pomocą prostego przypisania =. Czyli wpisujesz praktycznie za każdym razem na pozycji PC0 wartość 0. Aby wyzerować tylko te bity , które odpowiadają konkretnej cyfrze powinieneś użyć operatora &. Czyli np:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wtedy nie zmieni się pozycja PC0.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2017, o 20:50 
Offline
Nowy

Dołączył(a): 16 lip 2017
Posty: 4
Pomógł: 0

Chłopaki, wielkie dzięki! Tak długo szukałem, kminiłem i znaleźć sensu tego kodu nie mogłem. Już się przegrzewałem dzisiaj w tym upale... choć lepiej, że ja a nie ATmega.

Jeszcze raz bardzo dziękuję!

Pozdrawiam.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 14 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