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



Teraz jest 9 kwi 2026, o 18:43


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
Autor Wiadomość
PostNapisane: 10 paź 2014, o 22:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 lip 2014
Posty: 30
Pomógł: 2

Witam.
Na początek przedstawie kod dla procesora Atmega8 (taktowany 16MHz):

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


Na jednym z pinów muszę uzyskać przebieg CLOCK dla sterownika (częstotliwość ma dochodzić do 500k HZ). Problemem jest odliczanie odpowiedniej liczby kroków. Obecny sposób się nie sprawdza, ponieważ sterownik dostaję ich raz za dużo, raz za mało. Dodatkowo muszę mieć czas na obsługę poleceń z UARTa. Wiecie może jak to lepiej rozwiązać?

P.S. Przerwanie oraz funkcje, makra itp do obsługi UARTa pochodzą od Pana Mirka z BlueBook'a.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2014, o 07:11 
Offline
Użytkownik

Dołączył(a): 23 lip 2014
Posty: 39
Pomógł: 1

Jak chcesz mieć clock 500kHz to sobie timer w trybie pwm odpal. W przerwaniu od timera (tego od pwm) incrementuj twój licznik. Chyba że chcesz tylko na konkretny czas odpalac to zrób mechanizm heart beat o którym Mirek z milion razy mówił. I co jakiś czas (odliczony przed heart) wlacz lub wylacz timer od pwm. A uart swoją droga standardowo, czasu na bank starczy.

Edit:
Zastanawiam się ile czasu zajmie incrementowanie w przerwaniu zmiennej unsigned long int, coś czuje że dłużej niż zwykłego uint8_t , ale mogę się mylić. Pytanie czy uP wyrobi się w przerwaniu incrementujac taka zmienną.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2014, o 08:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 lip 2014
Posty: 30
Pomógł: 2

Jest to zmienna 32 bitowa, wiec na pewno zajmie więcej cykli. Przerwanie wywołuje się obecnie co 64 cykle. Przydałoby mi sie sprzętowe odliczanie, ale timery/countery avr raczej tego nie posiadają :[ Największym problemem jest chyba typ zmiennej. Odliczanie czasu raczej odpada. Kroki dekrementuje, ponieważ każdy avr ma porównanie z 0. Dzięki za sugestie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2014, o 08:35 
Offline
Użytkownik

Dołączył(a): 23 lip 2014
Posty: 39
Pomógł: 1

Masz f=500kHz czyli 2us. Pytanie ile kroków musisz zliczac. Bo mozesz ustwic odpowiedni prescaler dla timera 1 (16bit) i 65535 wartości zliczysz (odczytujesz TCNT1). Jak ustawisz czas na 1us to masz 65535us jak ustawisz na 2us to masz 65535x2 ze skokiem co 2us. Więc masz sprzętowe odliczanie.
W związku z tym że masz stała częstotliwość i wypełnienie fast pwm wystarczy.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2014, o 08:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 lip 2014
Posty: 30
Pomógł: 2

Hmmm. Brzmi interesująco, sprawdzę to :D No kroki będą czasami nawet powyżej 100 000. Dzięki za pomysł :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2014, o 18:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 lip 2014
Posty: 30
Pomógł: 2

Próbowałem wykonać to z dwoma timerami, Timer1 w CTC i Timer2 w CTC. Niestety dalej sterownik dostaje więcej kroków niż powinien;/

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


Chciałem tak zrobić, by używając funkcji TIMER1_Start(kroki) ustawiać ile kroków ma wykonać napęd (zmienna kroki). Niestety, jak np. robię TIMER1_Start(10000) to sterownik wykonuję około 16 000 kroków, a TIMER1_Start(1000) 1400 :/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2014, o 20:01 
Offline
Użytkownik

Dołączył(a): 23 lip 2014
Posty: 39
Pomógł: 1

1. Odpal timer 2 w fast pwm na wypełnieniu 50% i f=500kHz.
2. Odpal timer 1 (16bit) w trybie normal z przerwaniem co 2us. 3. 3. 3. Uruchamiasz oba timery naraz, i w pętli głównej porownujesz TCNT1 z Twoja liczba kroków jak są równe stopujesz pwm i timera1.
4. Przed ponownym uruchomieniem zerujesz TCNT1.

W procedurze obsługi przerwania nic nie robisz bo nie musisz bo pwm działa sam z siebie a timer1 i tak incrementuje swój licznik z automatu.
Dlaczego upierasz się przy ctc.
Moze ktoś jeszcze się wypowie, może ja głupoty koledze wciskam.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2014, o 20:16 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Nie zgodzę się z kolegą. W pętli głównej to program nie wiadomo kiedy jest i pogubisz kroki. Wszystko powinno być automatycznie. CTC jest dobre i dla timera 1 i dla timera 2. Zrobiłbym to tak, że sygnałem 500 kHz taktujesz timer 1. Wyjście OC2 łączysz też z wejściem T1 i odpowiednio konfigurujesz timer 1 na mały preskaler i taktowanie zewnętrzne.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2014, o 21:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 lip 2014
Posty: 30
Pomógł: 2

Pisząc program z dwoma timerami myślałem tak:
-Timer2 daje mi 250k Hz,
-Timer1 dla OCR1A=0 ma też 250k Hz,
-OCR1A traktuje jako liczbę kroków.
Dobrze?

------------------dodano------

Krauser mógłbyś trochę jaśniej wytłumaczyć Twój pomysł? :P

------------------dadano 2 ------
darius456 obecnie TIMER2 jest tak ustawiony, że na wyjściu OC2 mam przebieg o częstotliwości 250k Hz i wypełnieniu 50%. Częstotliwość obliczona dzięki wzorom z datasheetu. Natomiast pin jest w trybie toogle, czyli zmienia swój stan na przeciwny za kazdym razem, gdy licznik timera się wyzeruje. Dla mnie było to łatwiejsze w wykonaniu, niż ustawianie odpowiedniego wypełnienia w pwm/fast PWN etc :P


P.S. Jak to robicie, że macie ładne "Dodano po x minutach." ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2014, o 00:49 
Offline
Użytkownik

Dołączył(a): 23 lip 2014
Posty: 39
Pomógł: 1

No i o to mi chodziło... Co głowa to nowa koncepcja. Jutro się ustosunkuje do powyższego posta gdyż mam za duzo promil a może już procentów. Pozdrawiam

Cytuj:
Wyjście OC2 łączysz też z wejściem T1 i odpowiednio konfigurujesz timer 1 na mały preskaler i taktowanie zewnętrzne.
To jest wg. mnie przerost formy nad treścią, to się da zrealizować całkowicie software.

Skoro jeden timer masz jako ctc z odpowiednią częstotliwościa to ok, drugi natomiast powinien działać jako licznik kroków/czasu. Jeśli wykorzystasz timer 16bit z czasem 2us to zliczasz niejako kroki. Jeżeli wektory przerwań od obu timerow będą puste, bo mogą być z racji tego że jeden timer hadrwarowo robi pwm a drugi hardwarowo zwiększa swój licznik, to procedura obslugi przerwania zajmie HYBA 2 skoki czyli chyba 4 cykle zegara. Skoczy do procedury przerwania.... ona jest pusta więc odrazu z niej wyskoczy. Zatem program główny będzie cały czas latać po pętli while(1) (co każde przerwanie od dowolnego timera wyskoczy z pętli głównej na 4x62.5ns) i nie zgadzam się z kolega że pogubimy jakieś kroki. Może się tak zdążyć gdy podczas liczenia kroków obsluzysz przerwanie naprzyklad od uart, bo wtedy wyskoczysz z pętli głównej. Jeśli porównanie dwóch liczb 16bit , mowie tu o TCNT1 oraz żądanej liczby kroków, będzie dość krótkie to można wrzucić to do procedury obsługi przerwania Timera1 i na s 100% nic nie ucieknie.
Jak już pisałem chyba nie ma jednej słusznej drogi, każde rozwiązanie ktore zadziała będzie dobre. Powodzenia

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2014, o 09:32 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Gelten napisał(a):
Krauser mógłbyś trochę jaśniej wytłumaczyć Twój pomysł?

Timerem 1 zliczasz impulsy które generuje timer 2. Jak do tej pory zliczałeś impulsy zegarowe tak teraz zliczasz dokładnie to co chcesz. Na pewno nie pomylisz się w obliczeniach.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2014, o 12:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 lip 2014
Posty: 30
Pomógł: 2

darius456 w pętli głównej programu jest jeszcze ten problem, że jeżeli będziemy porównywać np liczbę 0x01FF z TCNT1, które w obecnej chwili ma 0x01FF, najpierw program sprawdzi młodszy bit (chyba, może też najpierw najstarszy), wystąpi zwiększenie TCNT1 w wyniku czego otrzymamy 0x0200, i program porównując starszy bajt, dojdzie do wniosku, że to są dwie różne liczby. Musiałbym wyłączać na czas sprawdzania oba timery, przez co zmniejszyłaby się końcowa częstotliwość.

Krauser teraz widzę, że mam taką opcje w bitach Clock Select Timera1, musiałem być bardzo zmęczony by tego nie zauważyć. Dzięki za naprowadzenie :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2014, o 16:16 
Offline
Użytkownik

Dołączył(a): 23 lip 2014
Posty: 39
Pomógł: 1

wg. mnie porównanie będzie szybsze niż pojedyncze przerwanie timera.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2014, o 22:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 lip 2014
Posty: 30
Pomógł: 2

darius456 zauważ, że wykorzystując przerwanie podaje mu ilość kroków, startuje timer i tyle. Nie mam zablokowanej pętli głównej, jak skończą się skoki to w przerwaniu wyłączam timer i tyle. Nie muszę co chwila sprawdzać licznika, timer robi to sam :P



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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