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



Teraz jest 10 lis 2024, o 06:26


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
Autor Wiadomość
PostNapisane: 1 lut 2012, o 12:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 sty 2012
Posty: 40
Pomógł: 0

Mam problem gdyż chcę wyświetlić np. 3 razy dowolny tekst, pojawia się i znika tak 3 razy, zamieszczam 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.

Co może być źle w powyższym kodzie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2012, o 13:50 
Offline
Moderator
Avatar użytkownika

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

Myślę, że najpierw to przydałoby się bardziej sprecyzować twoje założenie do tego testowego programu, bo na podstawie opisu i pokazanego kodu można tylko próbować zgadywać. Zwykle tego nie robię - tzn nie zgaduję - ale ponieważ kolega jest chyba nowym użytkownikiem i początkującą osobą - to wyjątkowo spróbuję ;)

Czy nie chodziło ci przypadkiem o to, żeby trzy razy wyświetlić na LCD jakiś tekst ale w taki sposób, żeby:

1. pojawił się pierwszy napis na LCD
2. wyświetlał się przez czas 1 sekundy
3. skasował się ten tekst
4. pojawił się drugi napis
5. wyświetlał się 1 sekundę
6. itd ???

Jeśli tak to zastanów się jak u ciebie działa pętla :(

Po pierwsze kardynalny mega BŁĄD (inicjalizację LCD robisz za każdym razem w pętli) .... kolega nie doczytał w książce (trzeba wrócić do niej jeszcze raz) o tym jak dzieli się funkcję main(). Że najpierw jest część gdzie robi się inicjalizację pinów, portów i różnych modułów, potem ew uruchamia globalne przerwania jeśli są akurat konieczne a dopiero potem robi się pętlę główną.

A u ciebie gdzie jest inicjalizacja LCD ? na początku main() ???? toż to się raz inicjalizuje i już działa - nie trzeba i wręcz nie można takiej inicjalizacji przeprowadzać wciąż w pętli!

ok załóżmy że poprawiasz kod i dajesz inicjalizację przed pętlę główną - ale co się dale w nim dzieje.

1. wyświetlasz tekst
2. ----!!!!!----- od razu go kasujesz (LCD_cls) po co ? w tym miejscu ?
3. odczekujesz 1 sekundę (_delay_ms(1000))

czy nie widzisz tego babola ? ;)

chyba chodziło ci o:

1. wyświetlasz tekst
2. oczekujesz 1 sekundę
3. dopiero teraz kasujesz tekst i pętla rozpocznie się od nowa

_________________
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 lut 2012, o 15:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

No właśnie tak jak pisze kolega Mirek

poczytaj co i jak robi pętla FOR

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


wiec się zastanów dlaczego 3x robisz inicjacje LCD, wywietlanie i kasowanie ??

jak już bardzo chcesz żeby to było 3 razy to zrób tak

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

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2012, o 21:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 sty 2012
Posty: 40
Pomógł: 0

Zastosowałem się do powyższych zasad i nadal nie wykonuje się pętla, wyświetla się cały czas napis Test tak jakby petle wykonano tylko raz
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 lut 2012, o 21:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 449
Pomógł: 4

A niech kolega doda po instrukcji
lcd_cls();

kolejne delay ms (1000).
I wtedy będzie jasne ile razy pętla się wykona.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2012, o 21:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 sty 2012
Posty: 40
Pomógł: 0

Już prawie działa teraz wykonuje tylko nieskończoną pętle, cały czas wyświetla napis Test z przerwaniami co 1 s, a pętli for nie wykonuje
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 lut 2012, o 21:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 449
Pomógł: 4

Chyba pętle for właśnie wykonuje, tylko, że kolega tak to napisał, że po ostatnim wykonaniu tej pętli nic dalej ma się nie odbyć w tym programie. Dopóki jest spełniony warunek
while (1) pętla będzie wieczna.

Jeśli ma się ten komunikat wyświetlić tylko trzy razy, to zamiast tego while (1) ja bym spróbował tak:

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


O może tak

Edit:

A zapomniałem, że na końcu oryginalnego kodu kolego można by zastosować np. instrukcję else i po niej czyszczenie ekranu. Czyi pętla wykonałaby się trzy razy, a za czwartym przebiegiem wykona tylko czyszczenie ekranu i zacznie od nowa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2012, o 22:22 
Offline
Moderator
Avatar użytkownika

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

Panie kolego ależ wykonuje ci pętlę for() .... tylko jak ty chcesz się przekonać o tym fakcie wzrokowo przy takim kodzie. No toż warto by go chociaż troszkę zmodyfikować. Koledzy ci już podpowiadają, dodałeś po CLS jeszcze Delaya 1s .... a wstaw jeszcze kolejnego Delaya tuż po zakończeniu pętli for() to wtedy co trzy skasowania swojego tekstu będziesz miał dłuższą przerwę ;) albo coś takiego:

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


wtedy już "nie ma mocnych" - zobaczysz odliczanie od 0 do 2 powtarzające się. Trzeba kombinować

aha .... korzystaj z rozwijanego pola na górze i kod programu wstawiaj w znaczniki syntax=c zamiast code OK ?

_________________
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 lut 2012, o 22:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 449
Pomógł: 4

A czy ta zmienna iteracyjna "i" to musi być dwubajtowa jak liczy tylko do 3 (słownie czech :) )? Można chyba ją zdecydowanie zmieścić w jednym bajcie, prawda?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2012, o 22:36 
Offline
Moderator
Avatar użytkownika

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

worner napisał(a):
A czy ta zmienna iteracyjna "i" to musi być dwubajtowa jak liczy tylko do 3 (słownie czech :) )? Można chyba ją zdecydowanie zmieścić w jednym bajcie, prawda?


Bardzo słuszna i cenna uwaga. Tyle że jak już to nawet wystarczy typ uint8_t zamiast int8_t. Ale generalnie bardzo dobra zasada żeby myśleć o KAŻDYM bajcie - brawo! ;)

_________________
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 lut 2012, o 22:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 449
Pomógł: 4

No tak, racja, że powinno być bez znaku.
Ale tak generalnie, to z tymi zmiennymi do odliczania w pętlach trzeba uważać. Sam się na początku na nich sparzyłem. Piecze do dzisiaj :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2012, o 22:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

oj tak .... potrafią zrobić spore zamieszanie , o ile w takim programie to żaden problem , to w większych konstrukcjach .... boli bardzo

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2012, o 10:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 sty 2012
Posty: 40
Pomógł: 0

pętla się wykonuje dzięki wszystkim za pomoc ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2012, o 11:11 
Offline
Moderator
Avatar użytkownika

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

kris napisał(a):
pętla się wykonuje dzięki wszystkim za pomoc ;)


Ja bym tylko proponował, żebyś zwrócił uwagę na to, że wspomniana w pierwszym wątku pętla for() także się wykonywała, tylko nie wpadłeś na pomysł, jak to sobie zwizualizować. Jest to o tyle istotne, żebyś nie popełnił błędu myślowego, że pętla for() dopiero teraz działa - a wcześniej nie działała. Pomoże ci to w dalszym pisaniu programów i korzystaniu z pętli. Nie zawsze przecież muszą być widoczne dla oka efekty działania przeróżnych pętli.

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO