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



Teraz jest 19 kwi 2024, o 19:22


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
 Tytuł: Liczenie czasu
PostNapisane: 13 lip 2017, o 13:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 gru 2014
Posty: 25
Pomógł: 0

Cześć ;)
Po dwóch latach przerwy wracam do programowania (w zasadzie można powiedzieć, że zaczynam od nowa), a zmotywował mnie fakt, iż na uczelni miałem zajęcia z programowania mikroprocesorów (80515 w assemblerze).
Postanowiłem, że odtworzę program pisany na zajęciach. Jego założenia:
- po uruchomieniu, na wyświetlaczu LED ma się pokazać data urodzenia,
- po 3 sekundach na wyświetlaczu mają się pojawić zera i ma uruchomić się odliczanie czasu od 0 do 9:59:9.

Zrealizowałem to przy pomocy dwóch zmiennych pomocniczych (delay3s, counter) w roli liczników, które inkrementowane są w przerwaniu (zależnie od stanu flagi start_counting). W pętli głównej sprawdzam wartość licznika delay3s (który odlicza 3 sekundową przerwę), jeśli odliczy odpowiednią wartość, to na wyświetlaczu LED pojawiają się zera. Zmieniam również stan flagi start_counting, która powoduje zatrzymanie inkrementowania zmiennej delay3s, a uruchamia inkrementowanie zmiennej counter. Drugi if w pętli głównej sprawdza stan zmiennej counter. Jeśli if się wykona (tj. counter będzie miał pożądaną wartość), to zwiększam zmienną set i przekazuje ją do zmiennej cyf4, co ma spowodować wyświetlanie się odpowiadającej cyfry na wyświetlaczu LED.

I tutaj przechodzimy do sedna problemu. Testowo, spróbowałem wpisać w drugim ifie na sztywno do zmiennej cyf4, wartość liczby 6 i okazało się, że po trzech sekundach ta 6 nie pokazuje się na wyświetlaczu, ale nadal jest zero. Dodałem wtedy w drugim ifie sterowanie diodą led, aby zobaczyć czy zmienna counter prawidłowo się zlicza. Okazało się, że dioda LED miga co sekundę (dla testów 1 setna sekundy trwa sekundę), ale na wyświetlaczu nadal jest zero.

Nie mam pojęcia dlaczego sterowanie diodą działa, a ustawienie wartości na wyświetlaczu LED już nie.

Przerwanie wykonuje się co 5ms.

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


W procedurze obsługi przerwania dodałem warunki(plik d_led.c z multipleksowania LED z BB):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zmienne w d_led.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 w pliku d_led.h dodałem:
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: 14 lip 2017, o 08:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

Zacznę może od błędu który po wklejeniu twojego kodu do eclips powodują błąd, a mianowicie skąd Ci się wzięły zmienne cyf1 ... cyf4? Przecież w bibliotece zmienne dla poszczególnych wyświetlaczy noszą nazwy cy1 ... cy4.

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


Druga kwestia to w tych zmiennych powinno się umieszczać pojedyncze cyfry a nie liczby dwucyfrowe, w takiej konwencji będą pojawiać się krzaki na wyświetlaczach. Jak chcesz na wyświetlacze wysyłać po prostu liczby to wykorzystaj kod który w ćwiczeniu mieli się w głównej pętli programu - zapakuj go w funkcję i liczby przekazuj poprzez tę funkcję.

A teraz sedno sprawy czyli dla czego nie zmienia się cyfra na czwartym wyświetlaczu. A tu Cię pewnie zaskoczę ale się zmienia, ale nie ma szans się wyświetlić, bo warunek if który wyżej już zacytowałem nie jest blokowany po odblokowaniu start_counting i on cięgle z częstotliwością wykonywania głównej pętli programu ustawia same zera(czy tam krzaki bo we wklejonym kodzie do dwóch cyfr pakujesz liczby 29). Zauważ że w momencie gdy start_counting zostanie ustawiony na 1 zmienna delay3s pozostaje już niezmieniona i o wartości 600 czyli tyle ile w warunku if, czyli od tego momentu warunek będzie ZAWSZE spełniony. Wystarczy we wnętrzu warunku dodać delay3s=0; i problem zniknie.

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


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lip 2017, o 12:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 gru 2014
Posty: 25
Pomógł: 0

Dziękuję za zainteresowanie i przepraszam, że tak późno odpisuję, lecz nie było mnie w domu.

xentis napisał(a):
Zacznę może od błędu który po wklejeniu twojego kodu do eclips powodują błąd, a mianowicie skąd Ci się wzięły zmienne cyf1 ... cyf4? Przecież w bibliotece zmienne dla poszczególnych wyświetlaczy noszą nazwy cy1 ... cy4.


Rzeczywiście, zapomniałem dodać, że zmieniłem u siebie nazwy tych zmiennych w bibliotece.

Jeżeli chodzi o dwucyfrową liczbę, to jest to tylko indeks tablicy, pod którym jest zapisane zero z kropką. W przerwaniu, na podstawie tego indeksu, jest przekazywana do portu odpowiednia wartość, tak aby wyświetlił się pożądany znak.

xentis napisał(a):
Zauważ że w momencie gdy start_counting zostanie ustawiony na 1 zmienna delay3s pozostaje już niezmieniona i o wartości 600 czyli tyle ile w warunku if, czyli od tego momentu warunek będzie ZAWSZE spełniony. Wystarczy we wnętrzu warunku dodać delay3s=0; i problem zniknie.


Faktycznie nie pomyślałem o tym, że delay3s będzie miał cały czas wartość 600 i będzie warunek będzie stale spełniony. Po wyzerowaniu tej zmiennej program działa tak jak powinien.

Jeszcze raz dzięki za pomoc :)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


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