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



Teraz jest 29 mar 2024, o 15:18


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 
Autor Wiadomość
PostNapisane: 25 lis 2019, o 17:26 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

Cześć.
Ostatnio miałem przerwę od "kabelków" (tak moja żona nazywa moją zabawę z zestawem ATB) i postanowiłem utrwalić sobie wyliczanie Timerów i obsługę przerwań.
Wybrałem sobie Timer1 w Atmedze32. Taktowanie 110592 zewnętrznym kwarcem.
Wybrałem przerwanie do tego timera (mam nadzieję,że poprawne) i niestety dioda nie miga co sekundę. Ustawiłem Timer1 w trybie Normal, czyli zwykłego licznika.
Czy widzicie gdzieś błąd w moim banalnym kodzie? :(
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Bardzo proszę o pomoc :)
Dodam,że wszystko testuję na zestawie ATB, żeby nie szukać problemów z połączeniami.

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2019, o 17:31 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

if(licznik)

Nie powinno być

if( ! licznik)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2019, o 17:33 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

no niestety tak też nie działa

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2019, o 17:36 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

Nie działa bo zmienna liczy od 0 do 255 i dopiero jak się przekręcić będzie Led tog czyli za 255 sekund

Zmień całość, timer masz ustawiony co sek (nie sprawdzalem czy dobrze) , jak
Wstawisz samo led tog to będziesz miał zmianę stanu co sek czyli 1s się świeci 1s nieswieci I tak wokoło.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2019, o 17:40 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

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


to też nie włącza diody, a powinno przy parzystych liczbach. Przynajmniej tak mi się wydaje ;)

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2019, o 17:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lis 2015
Posty: 219
Pomógł: 20

Nie masz za duzo tych srednikow ;? Przy #define masz jeden a pozniej dodajes kolejne przy kolejnym # define a nastepny dalej w kodzie.

W przerwaniu od timera chyba powinienes aktualizowac wartosc poczatkowa licznika



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2019, o 18:10 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

wojciechgorzolka napisał(a):
i niestety dioda nie miga co sekundę.

Nie napisałeś, czy w ogóle miga, kiedy używasz _delay_ms().
wojciechgorzolka napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Po pierwsze zauważ, że robisz to tylko raz, a nie po każdym przepełnieniu licznika. W efekcie czas zliczania będzie około 1,5 razy dłuższy
Po drugie zdecydowanie lepiej użyć w takiej sytuacji trybu CTC.

I co najważniejsze:
wojciechgorzolka napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Bit CS12 nie jest w rejestrze TCCR1A, tylko TCCR1B. Timer prawdopodobnie wcale się nie uruchamia :(

PS
Zmienna licznik w przerwaniu jest zbędna. Wystarczy odpowiednio skonfigurować timer i w przerwaniu tylko zmieniać stan wyjścia sterującego diodą.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2019, o 18:52 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

dziękuję za podpowiedź. Wiem,że tryb CTC byłby lepszy. Ale wykorzystałem tryb zwykłego licznika tylko i wyłącznie dla celów edukacyjnych. :)
Chcę przerobić wszystkie tryby i Timery,żeby opanować ten temat.

------------------------ [ Dodano po: 27 minutach ]

dioda miga po delayach

------------------------ [ Dodano po: 48 minutach ]

Andrews dziękuję za wykrycie mojego błędu. Miło,że chciało Ci się zajrzeć do noty, faktycznie pomyliłem nazwę rejestrów
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Ma być rejestr TCCR1B
Dioda już miga, co prawda nie co sekundę, ale miga. Szukam dalej co źle zrobiłem,że nie miga co sekundę :)
Dla mnie nie jest to jeszcze takie oczywiste :)

------------------------ [ Dodano po: 52 minutyach ]

Andrews dziękuję za wykrycie mojego błędu. Miło,że chciało Ci się zajrzeć do noty, faktycznie pomyliłem nazwę rejestrów
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Ma być rejestr TCCR1B
Dioda już miga, co prawda nie co sekundę, ale miga. Szukam dalej co źle zrobiłem,że nie miga co sekundę :)
Dla mnie nie jest to jeszcze takie oczywiste :)

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2019, o 20:00 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

Poprawiłem procedurę obsługi przerwania na taką formę i teraz dioda miga co sekundę :)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lis 2019, o 16:55 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

Mam jeszcze pytanie. Założenie jest następujące:
Dioda mignie pięć razy i ma się włączyć buzer.
Czy ifa powinienem napisać w pętli głównej, czy w przerwaniu?

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lis 2019, o 18:32 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

W pętli głównej. Rozbudowywanie kodu w przerwaniu "może być przyczyną wielu groźnych chorób". A tak poważniej. Kod w przerwaniu powinien być jak najkrótszy. Aktualizacja jakiejś zmiennej, a później analiza jej w pętli głównej. Zobacz co się stanie jak w programie będzie więcej przerwań i kod każdego będzie rozbudowany.

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lis 2019, o 19:58 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

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

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2019, o 19:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

hejo Wojtek,
Coś w kierunku tak, jak kolega "andrews' napisał.
spróbuj w pętli głównej wpisać:
raz
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

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

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

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

taka myśl, powinno wyłączać i włączać przerwanie.
sprawdż. ;)
a w przerwaniu już tylko TOGLOWANIE.

pozdro. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2019, o 13:54 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

ok dzięki.
A teraz mam kolejne pytanie. 16-sto bitowy timer można bez problemu ustawić tak, aby przerwanie wykonywało się dokładnie co sekundę, Ale co w przypadku gdy chcę użyć Timera 8 bitowego w trybie normal? Jeśli dzielę częstotliwość 11059200 przez preskalery, to zawsze mi wyjdzie wartość większa niż 255. I jak temu (kurza stopa) zaradzić? Czy mam ustawić Przerwanie , które się będzie wykonywać 100 razy na sekundę, a później w przerwaniu zliczać do sekundy?

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2019, o 14:27 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Dokładnie tak


Autor postu otrzymał pochwałę

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2019, o 14:39 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

no ok, tyko jak to policzyć?:) 11059200/1024/100? Czy tak to mam zrobić?
Jak robię podział 11059200/1024 =10800 i ta wartość według mnie już mnie dyskwalifikuje do kolejnego podziały, bo 8 bitów maksymalnie równa się 256. I co tu poradzić?:(

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2019, o 15:09 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

co to jest? dziwne linki z dziwnymi gadżetami dla panów i pań? O co chodzi?

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2019, o 15:13 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

Chyba komuś się na konto włamali.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2019, o 17:30 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

Poprawiłem kod. korzystając z BB ( tematu z multipleksowaniem).
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ustawiłem timer1 8bit
tryb zwykłego licznika
kwart 11059200Hz
Atmega32

Po wgraniu kodu na oscyloskopie pojawiła mi się wartość przerwania idealnie równa 100Hz.
Dlaczego nie 200Hz skoro:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Niby dobrze uruchomiło się przerwanie, tylko dlaczego 100Hz, a nie 200Hz :)
Czy pomyliłem gdzieś rejestry przy ustawianiu Timera, lub napisałem błędną nazwę przerwania?

Ok, widzę,że pomyliłem się przy wyliczaniu wartości rejestru TCNT2
Według mnie powinno być tak:
11059200/1024 preskaler/100Hz-1= 107.
wartość licznika zliczającego 255-104=148
Po wpisaniu tej wartości w rejestr TCNT2 w ustawieniach timera i po wpisaniu wartości 147 w przerwaniu, oscyloskop pokazuje mi przerwanie w częstotliwości 50Hz. Jednak nadal nie rozumiem dlaczego oscyloskop nie pokazuje mi w przerwaniu częstotliwości 100Hz:(
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2019, o 19:01 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

Wgraj sobie MkAvrCalculator tam masz wygodny kalkulator timerów

Obrazek

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2019, o 20:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Cześć Wojtek,
a przyjrzyj się ...
skoro przerwanie uruchamiasz 200 razy na sekundę,
a w przerwaniu zmieniasz TOG.. (na przeciwny),
to ile razy na sekundę "mrygnie" dioda?
no przecież że 100. :) ale dwieście razy zmienia stan na przeciwny.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lis 2019, o 00:56 
Offline
Użytkownik

Dołączył(a): 14 sie 2016
Posty: 905
Pomógł: 39

wojciechgorzolka napisał(a):
co to jest? dziwne linki z dziwnymi gadżetami dla panów i pań? O co chodzi?

micky napisał(a):
Chyba komuś się na konto włamali.

Niestety :oops:
Sprawa już wyjaśniona, obyło się bez różowego paska na tyłku jakkolwiek dwuznacznie to brzmi, zwłaszcza patrząc na to co wyszło z mojego konta.

Ze swojej strony mogę tylko przeprosić za zaistniałą sytuację i mieć nadzieje, że już nigdy do tego nie dojdzie.

_________________
Moje porady są błędne,nie czytać,zbanować od razu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lis 2019, o 09:09 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

Dzięki za podpowiedzi. Zaraz zerknę na kalkulator, bo zupełnie o nim zapomniałem. Darku, Ty jak zawsze masz rację ;) Dzięki

_________________
Nikt nie mówił,że będzie łatwo...



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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