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



Teraz jest 8 sty 2025, o 16:46


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 13 wrz 2016, o 14:58 
Offline
Nowy

Dołączył(a): 21 sie 2014
Posty: 5
Pomógł: 0

Mikrokontroler to Attiny25 pracujący na wewnętrznym oscylatorze 8MHz.

Potrzebuję funkcji opóźnień rzędu mikrosekund. Do tego celu napisałem następują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.


Przy okazji znajdują się tam przerwania od timera1 do następnej części programu. Na wyjściu pinu LED powinien być PWM o wypełnieniu 6% i f = 5kHz. I owszem jest ale tylko gdy wyłączę preskaler w timerze0. Timer1 w żaden sposób nie wpływa na parametry przebiegu wyjściowego. Nie mogę się doszukać problemu w datasheecie, tzn jaki wpływ ma preskaler timera0 na pracę reszty układu. Możliwe też, że popełniłem gdzieś błąd którego nie widzę. Czy spotkał się ktoś z takim problemem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 wrz 2016, o 15:07 
Offline
Użytkownik

Dołączył(a): 10 lip 2015
Posty: 334
Pomógł: 32

Bo do opóźnień które ty wprowadzasz dodają się opóźnienia związane z obsługa przerwania (oprócz samego kodu przerwania jest jeszcze prolog i epilog) które jest wywoływane 200x w ciągu jednego obiegu pętli. Pomyśl nad wykorzystaniem sprzętowego PWM.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 wrz 2016, o 15:43 
Offline
Nowy

Dołączył(a): 21 sie 2014
Posty: 5
Pomógł: 0

Rzeczywiście, po zmienieniu preskalera timera0 na 1024 wygląda to o wiele lepiej. Użyłbym PWM, gdyby nie to, że potrzebuję różnych częstotliwości.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 wrz 2016, o 18:31 
Offline
Użytkownik

Dołączył(a): 10 lip 2015
Posty: 334
Pomógł: 32

A to jakiś problem zmieniać rejestr?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 wrz 2016, o 18:33 
Offline
Nowy

Dołączył(a): 21 sie 2014
Posty: 5
Pomógł: 0

Dodałem odczyt z ADC który ma się wykonywać co ok. 10ms wyzwalany porównaniem z rejestrem OC0A timera0. Do tego funkcja która powinna pozwolić odczekać określoną liczbę ms. Niestety dioda nie chcę migać, jest ciągle wyłączona. Nie mam już najmniejszego pojęcia co to może być.

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: 13 wrz 2016, o 19:23 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam,

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


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


Reszty w sumie dokładnie nie sprawdzałem.

Pozdrawiam, QuadMan.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 wrz 2016, o 19:32 
Offline
Nowy

Dołączył(a): 21 sie 2014
Posty: 5
Pomógł: 0

Pozostałość po wcześniejszych testach, już poprawione. Chodzi o to, że gdy włączony jest timer0 tzn gdy TIMSK |= (1<<OCIE0A) to funkcja ms() odmierzająca czas nie działa, program wiesza się na jej pierwszym spotkaniu, a przecież to powinny być dwie niezwiązane ze sobą rzeczy, skoro to timer1 odpowiada za tą funkcję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 wrz 2016, o 20:15 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam ponownie.

kertoiP napisał(a):
Pozostałość po wcześniejszych testach, już poprawione. Chodzi o to, że gdy włączony jest timer0 tzn gdy TIMSK |= (1<<OCIE0A) to funkcja ms() odmierzająca czas nie działa, program wiesza się na jej pierwszym spotkaniu, a przecież to powinny być dwie niezwiązane ze sobą rzeczy, skoro to timer1 odpowiada za tą funkcję.


No... w końcu załapałem :-).

Przecież w ostatnim kodzie, który zaprezentowałeś nie masz procedury obsługi przerwania od compare match dla timera 0, a przecież te przerwania występują, bo... je włączyłeś.

Pozdrawiam, QuadMan.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 wrz 2016, o 20:39 
Offline
Nowy

Dołączył(a): 21 sie 2014
Posty: 5
Pomógł: 0

Wielkie dzięki! Już działa, taki błąd a jednak umknął. Tak to jest jak się za długo gapi na swój kod.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Majestic-12 [Bot] 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