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



Teraz jest 29 mar 2024, o 06:16


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 27 ] 
Autor Wiadomość
PostNapisane: 1 cze 2012, o 11:13 
Offline
Użytkownik
Avatar użytkownika

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

Proszę o pomysły jak mogę wyjść z pętli while(1) w której zamieściłem Timer który pozwala mi na mruganie diodą. Nie wiem w jaki sposób opuścić pętlę while tak aby jej zawartość nadal się wykonywała. Zamieszczam krótki kod z próbami, nie udanymi :/

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 2012, o 11:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Panie tak to tylko w Erze, czy jakoś tak ;) ........ daj no cały kod ........ bo jak na razie to moża powiedzieć że prościej jest mrygać diodą w przerwaniu.

Co do pętli while(1) to bedzie się zawsze wykonywac ponieważ warunek jest zawsze spełniany ( poczytaj o tej pętli w książce )
Zamiast 1 powinien być jakiś warunek który tą pętlę przerwie ............



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2012, o 11:39 
Offline
Użytkownik
Avatar użytkownika

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

Nie wyraziłem się jasno, chodzi mi o to aby ta pętla wykonywała się cały czas ale chcę wiedzieć w jaki sposób mogę do niej wchodzić/wychodzić i modyfikować zmienne inną funkcją zewnętrzną ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2012, o 11:52 
Offline
Użytkownik

Dołączył(a): 11 kwi 2012
Posty: 118
Pomógł: 0

Musisz skorzystać z przerwań, w książce masz to ładnie opisane.

Czyli pętelka sobie leci wykonuje jakieś tam pierdoły a Ty za pomoca przerwania timera "mrygasz" sobie diodą (zmieniasz stan na pinie)



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

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

W tym kodzie jest już zastosowany do mrugania diodą, w książce jest dobrze wytłumaczone tylko w tym konkretnym przypadku nie wiem jak wykorzystać przerwanie aby się wydostać z pętli i wykonywać inne zadania równlolegle.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2012, o 12:38 
Offline
Użytkownik

Dołączył(a): 11 kwi 2012
Posty: 118
Pomógł: 0

Mozesz sobie zrobić tak:

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



Ostatnio edytowano 1 cze 2012, o 12:41 przez kirex, łącznie edytowano 3 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2012, o 12:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lis 2011
Posty: 534
Lokalizacja: Mierzyn
Pomógł: 9

Kirex - widze ze podprowadziles komus awatar .

_________________
pozdrawiam
Jachu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2012, o 12:39 
Offline
Użytkownik

Dołączył(a): 11 kwi 2012
Posty: 118
Pomógł: 0

ee, przecież ja nie mam avatara :p



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2012, o 12:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lis 2011
Posty: 534
Lokalizacja: Mierzyn
Pomógł: 9

kirex napisał(a):
ee, przecież ja nie mam avatara :p


sorki chodzi o kris-a :)

_________________
pozdrawiam
Jachu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2012, o 12:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Ok, no to może innaczej, warunkiem wyjścia z pętli (while) jest nie spełnienie warunku while(1) , ponieważ masz "1" to warunek zawsze będzie spełniony, co znaczy że pętla będzie się wykonywała do końca świata i jeden dzień dłużej .....

Teraz troszkę jaśniej ? ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2012, o 12:50 
Offline
Użytkownik

Dołączył(a): 11 kwi 2012
Posty: 118
Pomógł: 0

Tylko jak wyjdzie z while, "break" powinien wystarczyć, to się program skończy :D
No chyba, że po dordze jest kolejna nieskończona pętla, to wtedy jeszcze sobie podziała.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2012, o 12:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

kirex napisał(a):
Tylko jak wyjdzie z while, "break" powinien wystarczyć, to się program skończy :D
No chyba, że po dordze jest kolejna nieskończona pętla, to wtedy jeszcze sobie podziała.



Dlatego własnie poprosiłem żeby wrzucił cały kod , z małym opisem co chce uzyskać, bo to mi jakoś nie comprende ;)

jest sobie jakaś flaga tylko nie wiadomo od czego, domyślam się że to z jakiegoś przerwania ale nie wiadomo czmu ma tyo służyć, widzę jakis licznik tylko nie wiadomo co liczy .......... i dlatego się upieram przy pokazaniu kodu :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2012, o 13:49 
Offline
Użytkownik
Avatar użytkownika

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

Z pętli się wydostaję tylko gdy z niej wychodzę zostaje przerwana, co można by zrobić aby po wyjściu z niej nie została przerwana?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Opiszę działanie programu do jakiego dążę. Mam menu w którym podaję zmienną "i" która będzie odpowiadała za czas po którym dioda zacznie migać, po wprowadzeniu tej danej chcę wrócić do menu. Udało mi się wydostać z pętli ale zostaje przerwana a chcę aby po wprowadzeniu zmiennej wykonywało się to niezależnie od tego czy cofnę się do menu czy nie.



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

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

To więc tak, według mnie brniesz w jakiś ślepy zaułek, ponieważ takie działanie będzie "blokować" uC, a prostym przykładem tego jest delay który wstawiłes do kodu a równocześnie wykorzystujesz SuperDebounce .......... więc ponawiam wklej cały main.c , bez tego naprawdę nie bardzo możemy cię naprowadzić na jakieś rozwiązanie, czy też pomóc w "naprostowaniu" ;) twojego myślenia.



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

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

Więc podaję kod źródłowy, moje wypociny :) w main wywołuję funkcję set()
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 2012, o 14:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Jessuuu, żeby tylko tego Mirek nie zobaczył bo padnie na miejscu .........

No dobra to po kolei, poczytaj z jakich sekcji powinien skladać się plik main.c , korzystasz z funkcji SuperDepounce ale biblioteki już nie masz podłączonej.

W tej formie nie ma prawa działać to co napisałeś.

To na razie tyle,doczytaj o tym popraw plik i zamieść go jeszcze raz ale już poprawiony .


I żeby było jasne błedów jest tutaj od groma, ale od czegoś musisz zacząć ;)



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

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

O matko i córko , ..... biedne eclipse ... o kompilatorze nie wspomnę
Mirek nawet niech tu nie zagląda ... aż się boje o jego serce

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



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

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

To co widać jest w pliku z rozszerzeniem .h więc superD jest zadeklarowane i działa prawidłowo proszę tylko spojrzeć na funkcję run_dioda i spróbować pomoc



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

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

No to staramy się ......... całkowicie zapomniałeś o sekcjach w mian.c , doczytaj o tym.

No to super że jest w pliku .h tylko z ciekawości powiedz którym, a skoro jest w tym pliku to po co ci w main.c deklaracja tego ?

void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,
uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait
void (*push_proc)(void), void (*rep_proc)(void) );

Więc patrzę w run_dioda i widzę to :

TCCR0 = (1<<WGM01); // tryb pracy CTC
TCCR0 = (1<<CS02)|(1<<CS00); // preskaler = 1024
OCR0 = 108; // przerwanie porównania co 10ms (100Hz)
TIMSK = (1<<OCIE0);

I odpowiadam NIE MA PRAWA TUTAJ TO BYĆ
Wniosek ?
Sprawdź jak powinien wyglądać prawidłowy main.c ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2012, o 15:03 
Offline
Użytkownik
Avatar użytkownika

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

dzięki :) poprawię i zobaczę co dalej



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2012, o 15:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

No popraw, i dopiero wtedy będziemy gadać co jest źle ......... a jest duuuużo



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

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

kris napisał(a):
To co widać jest w pliku z rozszerzeniem .h więc superD jest zadeklarowane i działa prawidłowo proszę tylko spojrzeć na funkcję run_dioda i spróbować pomoc


łeeech ... zajrzałem ;)

jeśli to wszystko jest w pliku *.h to:

1. albo na co dzień programujesz w C++ na PC i strasznie myli ci się wszystko - ponieważ tam umieszcza się definicje funkcji

2. albo właśnie totalnie źle na razie rozumiesz jak rozmieszcza się definicje i deklaracje w plikach *.c i *.h w języku C bo tu jest różnica ;)

więc trza wrócić do źródeł i jak najszybciej poprawić to

_________________
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: 2 cze 2012, o 21:01 
Offline
Użytkownik
Avatar użytkownika

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

Zrobiłem porządek jeśli coś przegapiłem to niechcący :)
main.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
funkcje.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
funkcje.h
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Ostatnio edytowano 4 cze 2012, o 15:25 przez kris, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2012, o 09:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

No już jest całkiem nie źle :)

W main.c brakuje pętlii while zaraz za funkcą set()
W funkcje.h dubluje ci sie deklaracja funcji
Przerwanie timera wywal do main.c na sam dół
W funkcjach down.select, up_select, screen powiela ci się kod pomyśl nad utworzeniem nowej funcji z tym kodem. ( latwiej wtedy skupic się tylko nad zmianą wartości, i będzie bardzej optymalnie )





kris napisał(a):
Opiszę działanie programu do jakiego dążę. Mam menu w którym podaję zmienną "i" która będzie odpowiadała za czas po którym dioda zacznie migać, po wprowadzeniu tej danej chcę wrócić do menu.

Ponieważ jakoś dzisiaj jestem lekko nie gramotny wytłumacz dokładnie jak ma to działać.

Rozumiem że chcesz ustawiać czas po którym ma zacząć migać dioda. Czy ona ma migac później cały czas czy tylko przez z góry założony czas a później gasnąć i czekać na nowe ustawienia ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2012, o 15:31 
Offline
Użytkownik
Avatar użytkownika

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

Poprawiłem te szczegóły o których napisałeś, a program ma uruchamiać diodę z góry założony czas a później gasnąć i czekać na nowe ustawienia. Chcę stworzyć później większe menu w którym będę mógł wprowadzać dane, potwierdzać je aby się natychmiast wykonywały cofać się do menu i kolejne ustawienia w menu uruchamiać. Chcę aby po zatwierdzeniu ustawień wychodząc do menu nie zostały zatrzymywane bądź przerywane. :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2012, o 15:55 
Offline
Użytkownik
Avatar użytkownika

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

hehe kris ... paskudny podkradaczu avatarów :)
super :)

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



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

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

To teraz warto poczytać trochę o timerach programowych skoro to ma być program nie blokujący.
Jeden bedzie potrzebny do tego żeby odmierzyć czas po jakim ma mrygać dioda, drugi do czasu przez jaki ma mrygac, a trzeci do tego żeby mrygała w odpowienich odstepach czasu.

( Można to jeszcze zrealizować za pomocą jednego lub dwóch timerów oraz enum ale timery wydają się fajniejsze ;) )



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

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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO