Skocz do zawartości

Arduino i timery - problem ze zrozumieniem preskalerów


farmaceuta

Pomocna odpowiedź

Staram sie od kilku dni zrozumiec chociaz w podstawowym zakresie dzialanie timerow/328p(ardu)...no i myslalem ze jakos to zalapalem z teorii, ale w praktyce to cuda niewidy...wogole nie chce dzialac mi ten timer2..ten sam kod,ale z roznym preskalerem dziala nie tak jak powinno byc

volatile uint32_t x = 0;

void setup() {
pinMode(13, OUTPUT);
                                
  TCCR2B |= (1<<CS22) | (1<<CS21) | (1<<CS20);  //preskaler na 1024
 // TCCR2B |=  (1<<CS22) | (1<<CS21);  //preskaler na 256
 // TCCR2B |= (1<<CS22);  //preskaler na 64
 //TCCR2B |= (1<<CS21);  //preskaler na 8
   
  TIMSK2 |= (1<<TOIE2);    //wlaczenie przerwania od przepelnienia
                         
  sei();                 // przerwania globalne wlacz
}

void loop() {

if (x == 61)  {
  digitalWrite(13, HIGH);
}
if (x == 122)  {
  digitalWrite(13, LOW);
  x = 0;
}
}

ISR (TIMER2_OVF_vect)
{
  x++;
 }

czyli wedlug tego kodu po zmianie na nizszy preskaler powinienem otrzymac szybsze miganie led , niby tak sie dzieje (z pominieciem 8), ale napewno nie tka jak by wynikalo ze wzorow... 8 miga wolniej niz na 64...co tu sie dzieje? wedlug obliczen powinno to wygladac tak...

preskaler    ilosc przerwan(x) na/s    zmiana stanu(bledna) led/Hz
1024             61                       0.5
256              244                      2
64              976                       4(?)
8               7812                      2(???????)
0               62500

probowalem z timer1..to samo, w sensie dziala tez z "przypadkowa" zmiana stanu led jak wyzej w "tabeli" ...juz nic mi do glowy nie przychodzi..:-/ jezeli ktos mialby jakies sugestie to chetnie wyslucham...byc moze arduino wymaga uzycia jeszcze ktoregos rejestru od timera?. Juz nic nie wiem..

PS. teamt timera zaczalem w innym watku(myslalem ze to bedzie "raz dwa"), ale jednak chyba dluzej mi z tym zejdzie wiec nie chcialem do konca tamtego tematu zasmiecic, a byc moze to tu przyda sie komus w przyszlosci...jesli moderator mialby mi to za zle to bardzo przepraszam za zamieszanie i prosze o usuniecie tematu(itp).

Pozdrawiam serdecznie;-)

Link do komentarza
Share on other sites

(edytowany)
32 minuty temu, _LM_ napisał:

Hej a czemu ty znowu zgadujesz. Dzielniki są rozpisane w nocie katalogowej

Nic nie zgaduje...tym razem zajrzalem do noty i preskaler wedlug dokumentacji ustawiony..celowo nawet umiescilem w kodzie wszystkie cztery zeby bylo jasne ze dobre bity ustawiam...😉

doczytalem (w podobnych przypadkach) ze istnieje mozliwosc, ze fusebity moga byc ustawione na wewnetrzny zegar...stad moje "bledne" obliczenia...i teraz tak, faktycznie dla preskalera 1024/256/64 jesli do obliczen podloze 8Mhz to wyniki prawidlowe..dla 8 natomiast nie dziala...

Dodam ze sprawdzane na Uno i Pro mini...to samo

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)
43 minuty temu, _LM_ napisał:

A to ciekawostka. Sprawdzę to później 

Raczej to prawda bo na innym forum kolega mial taki problem jak ja...czyli chcial migac led co 1s..a migalo co 8s...ktos mu tam powiedzial ze fusebity pewnie,..ustawil i zaczelo dzialac prawidlowo...tylko nawet jesli to ok. No ale ten preskaler 8 to calkiem od schematu odbiega..dzieki za pomaganie😉

Aha...korzystam z timera2 (8-bit) probowalem z timerem1 oczywiscie po wczesniejszej zmianie rejestrow/bitow z "jedynka"

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

Ej a ta twoja dioda nie mruga czasem zbyt szybko? Skopiowałem twój program( co prawda na atmegę32 ) i widzę że przy CS11 dioda mruga tyle że z dużą częstotliwością 

Link do komentarza
Share on other sites

7 minut temu, _LM_ napisał:

Ej a ta twoja dioda nie mruga czasem zbyt szybko? 

Nie...juz sprawdzalem to 100 razy...liczylem nawet przez serial monitor zmienna x...wszystkie 3 preskalery dzialaja prawidlowo dla obliczen 8Mhz...(preskaler 8 dziala wolno, bez preskalera wcale dioda nie zaswieci) miedzy innymi znalazlem taka informacje ze po wgraniu bootloadera trzeba ustawic te fuse byte..np tutaj.. http://hobbyspace.pl/wartosci-fuse-bit-arduino/

tylko tak..robi sie to programatorem Usbasp tak? (pobieram AVR studio to sie zaraz dowiemy co tam mam ustawione)

Link do komentarza
Share on other sites

I jest pewna rzecz o której powinieneś wiedzieć (choć znów to powiem: być może Arduino zrobi to za programistę) otóż stosując w przerwaniach zmienne które mają rozmiar większy od 8bit należy odczytywać je (w main i innych funkcjach) w sposób atomowy. Do tego służy biblioteka

#include <util/atomic.h>

A program w main będzie miał postać:

		ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
		{
			if (x == 610) {
				//digitalWrite(13, HIGH);
				PORTC |= (1 << PC2);
			}
			if (x == 1220) {
				//digitalWrite(13, LOW);
				PORTC &= ~(1 << PC2);
				x = 0;
			}
		}

Atomic block działa tak że na czas odczytu zmiennej blokuje przerwania a następnie przywraca je do stanu z przed tegoż bloku. Dlaczego?

Chodzi tutaj o dostęp do zmiennej większej niż 8bitów mikrokontroler musi to zrobić w dwóch etapach: najpierw odczytywana jest starsza część zmiennej a potem młodsza, może się zdarzyć że podczas odczytu wystąpi przerwanie i wtedy zmienna będzie miała zupełnie inną wartość.

Edytowano przez _LM_
  • Pomogłeś! 1
Link do komentarza
Share on other sites

8 minut temu, farmaceuta napisał:

preskaler 8 dziala wolno, bez preskalera wcale dioda nie zaswieci

Bez prescalera w sensie wszystkie bity wyzerowane? Wtedy jest to możliwe bo w ten sposób zatrzymuje się timer

Link do komentarza
Share on other sites

1 minutę temu, _LM_ napisał:

Bez prescalera w sensie wszystkie bity wyzerowane? Wtedy jest to możliwe bo w ten sposób zatrzymuje się timer

Bez preskalera w sensie podzial przez 1 ale zegar uruchomiony...bodajze bit CS20 w timer2...doczytalem ze zera zatrzymuja prace zegara, wiec tego bledu nie popelniam..

 

6 minut temu, _LM_ napisał:

Tak z tym że nie potrzebujesz AVR studio, wystarczy zwykły programik do ładowania wsadu.

Przeczytalem rowniez ze przez AS bede mial do wyboru fuse..wiec nie powinienem popelnic bledu podczas wpisywania niewiadomo czego co moze skutkowac zgonem procka..

Link do komentarza
Share on other sites

11 minut temu, _LM_ napisał:

Po prostu nie dotykaj bitu SPIEN

Znalazlem wlasnie liste tych bitow i pomalutku czytam co jest co... Ale nie bede grzebal tak na hardcora jak nie umiem...na spokojnie narazie sprobuje odczytac co tam jest...

 

10 minut temu, _LM_ napisał:

Kurcze aż poszukam jakiegoś m328 bo to jest niemożliwe żeby nie działało

dlatego bylem zdziwiony wlasnie tymi czestotliwosciami rozniacymi sie od obliczen...dodam ze probowalem jeszcze uruchomic tryb CTC...wszystko dokladnie jak w przykladach itp. tutaj wogole nie dziala...(?🤔?)

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.