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



Teraz jest 4 gru 2024, o 21:36


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 6 lut 2012, o 19:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

Witam.

Mam mały problem z zaadoptowaniem opóźnienia programowego timera w pętli for.

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



Jak widać zamieniłem Delaya timerem programowym i o ile takie coś jak poniżej działa. I ładnie co sekundę zapala i gasi mi diodę led to po wyżej dzieją się jakieś cyrki.

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


W gwoli formalności podam że z opóźnieniem delay działa normalnie ta pętla. Procek to Atmega8 (mam od kumpla).
Poniżej kody do programowego timera.

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.


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



Zegar taktowany wewnętrznym generatorem(chyba tak się to nazywało ^^) 8 000 000Hz
Bardzo jestem ciekaw czemu to nie bangla z pętlą for.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lut 2012, o 20:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

Rozwiązałem problem za pomocą paru zmiennych i warunków if. Aczkolwiek zastanawiam się czemu to nie działa z pętlą for...
Poniżej moje obejście problemu za pomocą pętli if. Robione na szybko.

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



Z góry przepraszam za brak komentarzy aczkolwiek jak wspominałem, pisałem to na szybko.
Tak w ogóle co Panowie sądzicie o takim teoretycznym rozwiązaniu ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lut 2012, o 20:16 
Offline
Użytkownik
Avatar użytkownika

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

Ujmę to tak teoria ma nie wiele wspólnego z praktyką :)
Ale ogólnie dobre myślenie -- zawsze jakiś no delay no-nie :)

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



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

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

No właśnie mnie ciężko się wypowiedzieć o tym rozwiązaniu bo ani z opisu nie wiem do czego służy a o kompletnym braku komentarzy sam napisałeś ;) nie wspomnę o lekkim bałaganie w kodzie.

Ale tak ogólnie wydaje się że samo zastosowanie timerów programowych OK, tylko co to ma wspólnego z pętlą for() vs while() ? nie wiem za bardzo o co chodzi - jak pisałem wcześniej.

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

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

Raczej nic nie wspominałem o while() mi chodzi jedynie o to czemu nie mogę uzyskać płynnego wysterowania wypełnieniem PWM dla diody w dwóch pętlach for() przy użyciu programowych timerów(opóźnień) gdy przy użyciu '_delay_ms(10);' działa pięknie. Może teraz jaśniej trochę objaśniłem :)



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

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

Hmm musiałbym chyba próbować jakoś odpalić twój kod żeby zrozumieć czemu nie możesz uzyskać płynnego sterowania PWM, ale nie za bardzo mam możliwość i czas niestety :( Napisz chociaż w skrócie o co chodzi z tym brakiem płynności ? Zawiesza się coś czy jak ?

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

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

mi się po prostu wydaje ze źle wyliczył czas wykonania pętli i stąd brak płynności

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lut 2012, o 23:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

To tak jeśli zamieszczę OCR1A=i w if(!Timer1) to dioda wyraźnie miga i i nic poza tym. jeśli zrobię tak jak w przykładach wyżej czyli poza ifem to po prostu tak jak by się zawiesza na powiedzmy OCR1A=127.

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.



Nie wiem jak mógłbym to lepiej wytłumaczyć.



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

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

No dobrze - to tu widać twój podstawowy błąd rozumowania z tą pętlą for(). Ona w jednym i drugim przypadku wykonuje się tysiące razy szybciej niż to co jest w wywołaniu timera programowego, który odpali się co 1ms. Pomyśl. Dlatego czasem zdarzy się, że w całej pętli while trafi się wykonanie warunki if() z timerem programowym a czasem nie, stąd jakieś skokowe i całkiem przypadkowe wartości zmiennej i trafiają do OCR1A.

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

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

Tak tego nie przewidziałem aczkolwiek już coś moje myśli wokoło tego krążyły. Dziękuje za poradę problem rozwiązany aczkolwiek sądzę że to jest złe rozwiązanie bo działa tak jak funkcja delay zatrzymująca mi program w pętli puki się nie wykona. Tak też uważam że moje rozwiązanie na szybko w warunkach if które jest powyżej jest lepsze. Tak sadzę :)

Dla Ciekawskich podam jak powinien wyglądać kod. Działający kod.

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: 7 lut 2012, o 08:54 
Offline
Moderator
Avatar użytkownika

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

Nie, nie, nie panie kolego - to nadal błędne założenia co do działania timerów programowych a nawet w tym twoim programie niepotrzebne są dwa timery programowe. To że użyłeś tych dwóch co najwyżej nieco niweluje przypadkowość :( Ale program całkowicie źle działa ...

rozważ takie podejście, poniżej definicja 2 zmiennych narzędziowych a jeszcze niżej fragment działania JEDNEGO timera programowego, który realizuje ci płynne rozjaśnianie i ściemnianie ;) Idź w takim kierunku myślenia o sposobach zastosowań timerów programowych - bo ty jeszcze (co widać z poprzednich przykładów masz na razie w głowie taką prostą kalkę myślową i) cały czas kojarzysz timery programowe jako COŚ co ma wprost zastąpić _delsy_ms() ... a to nie tak ;) Całkiem inaczej ...

zobacz - po co mi pętle for() w takim przypadku ? Przeanalizuj dokładnie co ja tu zrobiłem.

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


Odpaliłem timer programowy i równo co określony czas realizuję działania. Rozdzielczość czasową na poziomie wyznaczonym przez Timer1 mam zapewnioną ;) Krótko i na temat.

Sprawdź jaki będziesz miał efekt na swojej diodzie LED.

Aha - no i teraz wyobraź sobie, że możesz w tej samej pętli while(1) odpalić drugi albo i trzeci timer programowy i na podobnej zasadzie także płynnie ale także całkowicie niezależnie jakby w jednym czasie realizować całkiem inne zadania ... i to jest największą zaletą takich mechanizmów. Przy czym każdy timer programowy może działać z własną rozdzielczością czasową!!!

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

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

Działa bez problemowo. A co do dwóch timerów to wiedziałem że wystarczy jeden. Po prostu w razie wu użyłem dwóch.

Tak też dziękuje za pomoc i przy okazji pokazanie uproszczonego zamiennika pętli for() na moje potrzeby :)



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

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

DidekxD napisał(a):
Działa bez problemowo. A co do dwóch timerów to wiedziałem że wystarczy jeden. Po prostu w razie wu użyłem dwóch.

Tak też dziękuje za pomoc i przy okazji pokazanie uproszczonego zamiennika pętli for() na moje potrzeby :)


Tylko, żebyś dobrze zrozumiał co chciałem przekazać. Bo to nie o to chodzi, że tym sposobem można wykorzystać tylko jeden timer programowy. Ty w swoich kodach próbowałeś wykorzystać je w ogóle niezgodnie z przeznaczeniem. One miały być w twoich kodach niejako ekwiwalentem funkcji _delay_ms() a tak nie można bo sam widziałeś do czego to prowadzi.

I dlatego też to co pokazałem nie jest absolutnie pokazaniem uproszczonego zamiennika pętli for(). Stosujesz niestety na razie takie jeszcze proste "kalki" myślowe (co poniekąd rozumiem) .... ale staraj się tego unikać bo to wprowadza cię w błąd coraz dalej.

Pokazałem sposób wykorzystania timera programowego do realizacji twojego celu ale w ogóle w oderwaniu od prób zastępowania czegoś w twoim kodzie. Po prostu tu podchodzimy całkiem inaczej. Wyznaczamy sobie grupy zadań, które będą się wykonywały z zadaną rozdzielczością czasową. Co nie ma nic wspólnego z zastępowaniem wszelakich pętli w tym for().

Dlatego w celu lepszego zrozumienia tego proponuję ci rozbudować ten kod np o takie zadanie.

1. ma się wykonywać to co dotychczas (rozjaśnianie i ściemnianie diody LED przez PWM)
2. na wyświetlaczu LCD ma sobie działać licznik, który będzie zliczał tyknięcia ale równo co 500ms
3. inna dioda LED ma sobie migać równo co 1 sekundę.

Jak to zrobisz to nie ma bata - połkniesz do końca bakcyla i zrozumiesz to do końca. Bo jak widzisz, mówię tu o założeniach wg których niezależnie od siebie mają się wykonywać jakby 3 różne procesy ale w tym samym czasie ;)

_________________
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: 20 lip 2012, o 18:44 
Offline
Nowy

Dołączył(a): 09 lip 2012
Posty: 5
Pomógł: 0

Witam,
nie wiem czy dobrze pytam ale czy te zadania co podałeś to są do zrobienia na jednym timerze (np. Timer0)? W tym timerze, inkrementowana jest co pewien czas (np. 100 razy na sekundę) wartość Timer1 i w pętli while(1) wykonywane jest np. zapalanie LED co 1 sekundę i PWM. Chyba to źle rozumiem :>



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lip 2012, o 19:25 
Offline
Moderator
Avatar użytkownika

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

cs3 napisał(a):
Witam,
nie wiem czy dobrze pytam ale czy te zadania co podałeś to są do zrobienia na jednym timerze (np. Timer0)? W tym timerze, inkrementowana jest co pewien czas (np. 100 razy na sekundę) wartość Timer1 i w pętli while(1) wykonywane jest np. zapalanie LED co 1 sekundę i PWM. Chyba to źle rozumiem :>


Poczytaj rozdział O Wstępie do systemów czasu rzeczywistego w pierwszej książce

http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

to zrozumiesz o co chodzi w tym zadanku 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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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