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



Teraz jest 29 gru 2024, o 19:29


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 22 sty 2013, o 21:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 wrz 2012
Posty: 65
Pomógł: 0

Witam,

W miarę wolnego wieczoru, zasiadłem do przetestowania programowego timer'a, który został zaprezentowany przez Mirka w rozdziale o 'systemie czasu rzeczywistego' - przy okazji - za każdym razem jak wracam do tej książki to odkrywam ją na nowo :)

Wykorzystałem T/C0 w mojej ATMega8 (16MHz) i zadziałał bez zarzutu, tak więc poszedłem dalej i pomyślałem, że zastąpię tym funkcję _delay_ms(). Tak więc na szybko skorzystałem z części kodu do PWM programowego i w miejscach gdzie jest _delay_ms(N) wstawiłem:

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

Moja konfiguracja przerwania jest następująca:

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

Tak wiec w pętli while(1) wstawiam te opóźnienia:

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


Jednak raczej to nie działa, bo dioda się cały czas pali.
Kod w przerwaniach dla:

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

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

Od razu chcę nadmienić, że PWM działa jeśli _delay_ms() są od komentowane, a elementy z Timer2 usunięte. Także, jak pisałem wcześniej, "timer programowy" też działa - po usunięciu kodu z PWM i wstawieniu LED_TOGGLE z wywołanie Timer2 = 1, dioda miga bardzo szybko.

Tutaj głównie proszę o podpowiedź, jak zastąpić _delay_ms() "timerem programowym"... jakieś sugestie?

Bardzo Dziękuję,
Jan



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sty 2013, o 21:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Witam,
kolego Jan Mazur przede wszystkim musisz zrozumieć na czym polega różnica między programowaniem zdarzeniowym z wykorzystaniem timerów programowych a programowaniem liniowym z delay. Chodzi głównie o to, że przy wykorzystaniu timerów programowych pętla główna nie zatrzymuje się, a krąży czekając na zdarzenie. Dzięki temu możemy obsługiwać wiele zdarzeń pseudo jednocześnie. Twój kod będzie działał jedynie z delay bo tak został napisany. Musisz go przepisać aby dobrze działał z timerami programowymi. Musisz tak go napisać aby inkrementacja pętli np. for itp. następowała raz prze wywołanie danej funkcji, po odliczeniu timera.
Mam nadzieje, że trochę rozjaśniłem :)

Pozdrawiam
R.L.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sty 2013, o 22:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 wrz 2012
Posty: 65
Pomógł: 0

Dzięki Lemosek, też już po napisaniu mego posta doszedłem do wniosku, że raczej to nie zadziała tak jak sugerowałem :) Tak jak sugerujesz będę to musiał przepisać i dokładniej przeanalizować działanie.

Bardzo Dziękuję za wstępne rozjaśnienie!

------------------------ [ Dodano po: 17 minutach ]

Tak więc widzę, że raczej to co napisałem na początku nie zadziała... jednak w czasie przepisywania nasunęła mi się jedna myśl. Jeśli mamy pętlę while(1), a w niej np:

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

To i tak LED_1 nie będzie migała z częstotliwością 100Hz, bo nastąpi "zawieszenie" tej procedury na rzecz opóźnień 2 x 500ms. Czyli mój plan na "wielozadaniowość" nie zadziała... tak? :|



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sty 2013, o 22:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Witam,
bardzo się cieszę, że moja sugestia się komuś przydała :D.
Nie przejmuj się niepowodzeniami, ja też kiedyś jak zaczynałem to próbowałem podobnych wynalazków i jakoś nie chciało działać. :D.

Jak programujesz to pamiętaj, że nigdy nie używaj delay w przerwaniach i pętli głównej. W pętli głównej na podstawie timerów programowych wywołuj dane zdarzenia np. obsługa LCD, IR itp. w zależności od potrzeb. Pętla główna ma się "kręcić" bez zbędnych przerw.

Odnośnie PWM programowego to nie łatwiej i pewniej wykorzystać przerwanie od timera. Pomyśl jak działa PWM ( f jest stałe, zmienia się współczynnik wypełnienia). Jeśli więc w przerwaniu przeanalizujesz wartość zmiennej dajmy na to pwm (zawierającej zadany współczynnik wypełnienia) i przez taki czas będziesz utrzymywał stan wysoki a prze resztę niski. Powinno działać.

Odp. dokładnie tak :D Spójrz wyżej, co napisałem na temat pętli głównej. Nie możesz jej zbędnie zatrzymywać np. prze delay. Bo wtedy nici z pseudo działania równoległego.

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

który powinien rozjaśnić :D

Pozdrawiam
R.L.

Kod wstawiamy przy pomocy "[syntax=c] " - Zielony J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sty 2013, o 11:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 wrz 2012
Posty: 65
Pomógł: 0

Dziękuję Bardzo R.L. :) będę próbował i mam nadzieję, że uda mi się zrealizować to co zamierzam. Jak coś to dam znać czy się udało :)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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