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



Teraz jest 1 lip 2026, o 02:38


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 31 maja 2016, o 18:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2013
Posty: 502
Lokalizacja: Siedlce
Pomógł: 9

Witam. Napisałem prostą funkcje której zadaniem jest wyświetlenie prostego napisu "Error" na 6ciu wyświetlaczach led który przesuwa się od prawej do lewej strony gdy oczywiście odłączę czujnik przypisywane do zmiennych cy1,cy2,cy3,cy4,cy5,cy6 są nowymi zdefiniowanymi znakami w tablicy czyli literki "E" "r" "o" "spacja"
Funkcja jest bardzo długa i "niewygodna" oczywiście działa podejrzewam że można to napisać w bardziej przystępny i krótszy sposób ,mile widziane jakieś propozycje :?:
Kod:
void led_temperatura_error()
{
        cy1=11;   //E            
        cy2=12;   //r
        cy3=12;   //r
        cy4=13;   //o
        cy5=12;   //r
        cy6=16;   // spacja
   _delay_ms(100);
   cy1=12;   //r            
        cy2=12;   //r   
   cy3=13;   //o   
   cy4=12;   //r
   cy5=16;   // spacja
   cy6=11;   //E
   _delay_ms(100);
   cy1=12;   //r            
        cy2=13;   //o   
   cy3=12;   //r   
   cy4=16;   // spacja
   cy5=11;   //E
   cy6=12;   //r
   _delay_ms(100);
   cy1=13;   //o            
        cy2=12;   //r   
   cy3=16;   // spacja   
   cy4=11;   //E
   cy5=12;   //r
   cy6=12;   //r
   _delay_ms(100);
   cy1=12;//r            
        cy2=16;// spacja   
   cy3=11;//E   
   cy4=12; //r
   cy5=12;//r
   cy6=13;//o
   _delay_ms(100);
   cy1=16;   // spacja            
        cy2=11;   //E   
   cy3=12;   //r   
   cy4=12;   //r
   cy5=13;   //o
   cy6=12;   //r
   _delay_ms(100);
}

_________________
Ucz się ucz ,bo po to tutaj jesteś...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2016, o 18:39 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2606
Pomógł: 129

Petla i tablica?

Sent from my mobile.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2016, o 20:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Zacznij od:
definicja tablicy:
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.


Autor postu otrzymał pochwałę


Ostatnio edytowano 31 maja 2016, o 22:12 przez anshar, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2016, o 20:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2013
Posty: 502
Lokalizacja: Siedlce
Pomógł: 9

Wprawdzie kolega nie dał średników w nawiasach pętli for ale okej ;)

Że jako programowanie to sposób myślenia ,a on jest bardzo ważny w programowaniu
To teraz mi kolego bardzo proszę wyjaśnij :) swój sposób jak do tego doszedłeś krok po kroku jaki miałeś na to że tak to nazwę "algorytm" :?: BO z tego co widzę liczba twoich "pomógł" 8-) robi wrażenie :D

Tak szczerze mówiąc to też myślałem o pętli typu for ale już nie o tworzeniu jakiejś nowej tablicy bardzie myślałem o może wykorzystaniu wskaźników do tej tablicy w której są te segmenty zdefiniowane ale niestety mój algorytm rozumowania jeszcze nie stoi na takim poziomie żeby to samemu napisać :cry:

_________________
Ucz się ucz ,bo po to tutaj jesteś...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2016, o 23:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Faktycznie jakoś przecinki zamiast średników wstawiłem. Przepraszam, ale jestem dopiero początkujący i popełniam jeszcze takie błędy. ;)
Kod poprawiłem, co by w oczy nie kłuło. :D
W ramach pokuty postaram się to wyjaśnić.
Więc tak:
Założeniem było wyświetlenie na wyświetlaczu składającym się z 6 wyświetlaczy 7-segmentowch napisu składającego się z 6 znaków: Error_
(gdzie znak '_' oznacza spację)
Następnie po krótkiej przerwie przesunięcie wszystkich znaków o jedno miejsce w lewo z tym, że wypadający znak z lewej strony wskakuje na koniec, czyli ostatnie miejsce z prawej strony.
Operacja ta powtarzana jest 6 razy, by napis przesuwał się płynnie od prawej do lewej.
1. Error_
2. rror_E
3. ror_Er
4. or_Err
5. r_Erro
6. _Error

Powołałem sobie tablicę 6 elementową tab[] typu uint8_t:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

zawierającą definicję znaków, które zamierzamy wyświetlić, czyli w kolejności znaki: {E, r, r, o, r, _}

Jeśli chcielibyśmy wyświetlić ten napis ma wyświetlaczu (statycznie) to możemy napisać tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No tak, ale co z przesunięciem?
Dlatego wymyśliłem sobie, by powołać zmienną uint8_t, która na początku musi mieć wartość zero, ponieważ pierwszy element tablicy to tab[0], prawda?
Całość wrzucić na przykład w pętlę for i wykonać tą operację 6 krotnie, bo tyle chcemy mieć przesunięć, prawda?
No to do dzieła:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wydaje się, że to powinno działać.
Ale sprawdźmy:
dla j=0:
cy1=tab[0], cy2=tab[1], cy3=tab[2], cy4=tab[3], cy5=tab[4], cy6=tab[5] zgadza się, zobaczymy na wyświetlaczu napis Error_
dla j=1 (drugi obieg pętli for):
cy1=tab[1], cy2=tab[2], cy3=tab[3], cy4=tab[4], cy5=tab[5], cy6=tab[6] spodziewamy się, że zobaczymy na wyświetlaczu napis rror_E, lecz niestety tak się nie stanie, ponieważ przekroczyliśmy zakres tablicy tab[6], którą zdefiniowaliśmy przecież jako 6 elementową. Pierwsze 5 elementów tablicy odczytamy prawidłowo, do naszych zmiennych cy1-cy5 trafią odpowiednie znaki, tworzące napis rror_
No dobra, ale co z tym ostatnim znakiem? Przecież tam powinien trafić pierwszy znak napisu 'E'.
Dlatego użyłem operatora % (modulu) czyli reszta z dzielenia:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Sprawdzamy:
dla j=1 (drugi obieg pętli for):
cy1=tab[1%6], cy2=tab[2%6], cy3=tab[3%6], cy4=tab[4%6], cy5=tab[5%6], cy6=tab[6%6]
w wyniku tej skomplikowanej operacji otrzymamy:
cy1=tab[1], cy2=tab[2], cy3=tab[3], cy4=tab[4], cy5=tab[5], cy6=tab[0] BINGO!!!

Przanalizuj sobie jeszcze dla j=2 (trzecii obieg pętli for), j=3(czwarty obieg pętli for), j=4(piąty obieg pętli for) i j=5(szósty obieg pętli for)

Mam nadzieję, że udało mi się wytłumaczyć "łopatologicznie" mój zaiste skomplikowany algorytm! :D


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2016, o 01:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Tak na prawdę to ta zmienna uint8_t j jest nie potrzebna.
Przy okazji dodałem jeden argument do funkcji led_temperatura_error();
Tym razem tablica tab[] ma aż 11 elementów.
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.


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


Jak przeanalizujesz tą krótką funkcję to znajdziesz odpowiedź dlaczego użyłem tablicy. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2016, o 08:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

@anshar, sprawdzałeś ten kod w praktyce? Chodzi mi o obliczenia tablicowe.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2016, o 09:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

SylwekK napisał(a):
@anshar, sprawdzałeś ten kod w praktyce? Chodzi mi o obliczenia tablicowe.

Zobacz:
http://codepad.org/TD8q7cDG
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: 1 cze 2016, o 09:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

Wszystko ok :-) Jakieś takie wątpliwości mi się tylko małe nasunęły przy tych modulo, ale to pewnie dlatego, że miałem sporą przerwę w programowaniu. Nie było tematu :-) ... Pozdrawiam

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2016, o 17:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2013
Posty: 502
Lokalizacja: Siedlce
Pomógł: 9

anshar napisał(a):
Mam nadzieję, że udało mi się wytłumaczyć "łopatologicznie" mój zaiste skomplikowany algorytm! :D


O chłopie to normalnie kolejna "przelotka do wędki" tak powinien każdy dawać pomoc gdy daje kod, bo z ryby to wiadomo niby zjemy... ale potem wiadomo co... :lol:

Dzięki szczególnie bardziej za ten algorytm bo ta odpowiedź była dla mnie bardziej znacząca ;) jak ten kod

_________________
Ucz się ucz ,bo po to tutaj jesteś...



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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