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



Teraz jest 9 kwi 2026, o 06:30


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 17 kwi 2015, o 09:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 mar 2014
Posty: 197
Lokalizacja: Kielce
Pomógł: 3

Witam. Wykonuję pewien projekt, w którym używam Timerów programowych. Ale obliczenia nie zgadzają mi się z czasem, który faktycznie powinien wyjść.
Mianowicie dla Timerów programowych chcę uzyskać częstotliwość 100Hz.

Posiadam Atmege8 i taktuję ją częstotliwością 1843200 Hz.
Preskaler ustawiałem na wartość 1024.

Chcąc uzyskać częstotliwość 100 Hz wykonałem następujące obliczenia.

1843200 / 1024 / 100 = 18 - wartość wpisana do rejestru OCR2.

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


Więc uzyskuję częstotliwość 100 Hz. Jest to 0,01 sekundy.

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


Funkcja migania diodą w pętli while:

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



Otrzymuję 100 Hz czyli sygnał co 10ms.
Podstawiając za zmienna n wartość otrzymuję:

n = 10 0,01s*10=0,1s czyli 100 ms
n= 100 0,01*100=1s czyli 1000ms

Chce uzyskać efekt np 5 sekund:

n= 500 0,01*500=5s czyli 5000ms


Na płytce stykowej mam podłączony układ z diodą Led, po wgraniu do uC programu dioda zdecydowanie nie miga co 5 sekund. Tak ze stoperem w ręku co 10sek.

Zauważyłem powtarzalność:

Dla n=400 czas wynosi 8 sekund
Dla n=500 czas wynosi 10 sekund
Dla n=700 czas wynosi 14 sekund


Czy tak jest prawidłowo ?? (Wydaję mi się że nie) Gdzie popełniam błąd ??

_________________
BlueBook



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2015, o 09:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

Rafal9018 napisał(a):
język c
if (!Timer1){
                                                          Timer1 =100 ;
                                                          PORTC ^= LED2;
                                                                }
GeSHi


Co 1 sek. przełączasz diodę na stan przeciwny, czyli pełne mrugnięcie jest po 2 sek.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2015, o 09:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 mar 2014
Posty: 197
Lokalizacja: Kielce
Pomógł: 3

Nawet gdy robię tak:

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


Zmienna m powinna się zwiększyć co 4 sekundy. A dalej jest drugie tyle czyli 8 sekund.

_________________
BlueBook



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2015, o 09:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

W programie mkAVR Calculator w zakładce Narzędzia jest świetny program AVR Timer Kalkulator. Wybierając Twoje F_CPU 1843200Hz i pożadaną częstotliwość 100Hz (10ms) program ten podaje, że OCR2 = 179 dla preskalera 1024.
Dla F_CPU = 18432000 Hz, preskalera = 1024 i pożadanej czętstotliwości IRQ = 100Hz, zapisać trzeba tak:

OCR2 = 18432000 / 1024 / 100 - 1
OCR2 = 179 , a nie 18.

Jako F_CPU wstawiłeś 1843200 zamiast 18432000. Tutaj jest błąd.

No chyba, że faktycznie masz taktowany procosor 1843200Hz to i tak jest źle.
OCR2 - 1843200 / 1024 / 100 - 1
OCR2 = 17

------------------------ [ Dodano po: 44 minutach ]

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


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

Czyli po 1s zostanie zapalona dioda, po następnej sekundzie zgaszona, by znów po 1s została zapalona i tak w kółeczko.
Jeśli chcesz by zapalała się równo co 1s to musisz zmienić na Timer1 = 50; Wtedy dioda zostanie zapalona na 0.5s, następnie zgaszona na 0.5s i w kółeczko. :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2015, o 13:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 mar 2014
Posty: 197
Lokalizacja: Kielce
Pomógł: 3

Taktowanie to 1843200Hz, ale zapomniałem po podzieleniu odjąć 1 bo przecież liczymy od zera :D <facepalm>

Dzięki za pomoc :D

_________________
BlueBook



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 10 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