Skocz do zawartości

Arduino i timery - problem ze zrozumieniem preskalerów


farmaceuta

Pomocna odpowiedź

11 minut temu, Peposh napisał:

 

 ale mruganie jest zbyt wolne(kilka sekund dla clk/256). Podejrzewam, że jest to kwestia dopasowania wartości x w ifach.

"x" nie wiele ma do rzeczy...im nizszy preskaler tym szybciej ma migac...przy 8 to juz ma swiecic "ciagle"..hmm

 

14 minut temu, Peposh napisał:

 

 

@farmaceuta Skupiałem się głównie na tym, że dioda miga wolniej na 8 niż na 64 😉.

Dokladnie tej odpowiedzi potrzebowalem...czyli dziala to dokladnie jak u mnie...czyli zle...to pewnke jak zmierzysz czasy to tez bedzie jechalo jak z 8Mhz...prubowalem z Arduino 1.8.8, ale rowniez wersja 1.8.13 tak ze raczej w dwoch nie grzebanych wersjach raczej prockow nie pomylili...po tych timerach to psychiatra na mnie zarobi...he🤕

Link do komentarza
Share on other sites

@farmaceuta Jeśli używasz kodu w stylu:

TCCR2B |= (1 << CS21);  //preskaler na 8
	

to oże warto najpierw sprawdzić, jaka wartość jest w TCCR2B przed wykonaniem tej instrukcji?

Załóżmy że bit CS22 jest ustawiony na 1, czy wtedy faktycznie tym kodem ustawiasz preskaler na 8?

  • Pomogłeś! 1
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

3 minuty temu, Elvis napisał:

 

to oże warto najpierw sprawdzić, jaka wartość jest w TCCR2B przed wykonaniem tej instrukcji?

Podobno ten rejestr  jest wypelniony zerami z automatu...(ale sprawdzic moge jak najbardziej)

14 minut temu, Elvis napisał:

 

Załóżmy że bit CS22 jest ustawiony na 1, czy wtedy faktycznie tym kodem ustawiasz preskaler na 8?

Nie no jesli chce 8 to ustawiam tylko CS21 na 1 i tyle...byc moze chcialem mi tu cos wiecej przekazac a ja nie lapie do konca..😢

Link do komentarza
Share on other sites

4 minuty temu, farmaceuta napisał:

Podobno ten rejestr  jest wypelniony zerami z automatu...(ale sprawdzic moge jak najbardziej)

Po prostu sprawdź, wtedy będziesz wiedział, czy jest czy nie jest. Ja sprawdzałem i u mnie CS22 jest ustawiony.

A jeśli będzie ustawiony, to wtedy warto wrócić do programu i przeanalizować jak on działa - to bardzo dobre ćwiczenie. Bo błąd jest w linijce:

TCCR2B |= (1 << CS21);  //preskaler na 8
	

 

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

3 minuty temu, farmaceuta napisał:

Nie no jesli chce 8 to ustawiam tylko CS21 na 1 i tyle...byc moze chcialem mi tu cos wiecej przekazac a ja nie lapie do konca..😢

Chodzi o to że gdy używasz bootloadera to bity nie są zerowane. Łatwo można sprawdzić: gdy masz załadowany program przez bootloader a program nieprawidłowo się wykonuje to spróbuj go zresetować ręcznie.

Link do komentarza
Share on other sites

29 minut temu, Elvis napisał:jaka wartość jest w TCCR2B przed wykonaniem tej instrukcji?

 

Załóżmy że bit CS22 jest ustawiony na 1, czy wtedy faktycznie tym kodem ustawiasz preskaler na 8?

Jestes geniuszem!...😅 dziala!! No szkurde komu by do glowy przyszlo ze tam cos napaprane jest...obilo mi sie o oczy ze tam sa zera domyslnie w tym preskalerze itp..😈 ale ale...zeby nie bylo tak kolorowo to problem jeszcze nie zazegnany bo..

 

16 minut temu, Peposh napisał:

Częstotliwości dla 32: ok 16[Hz] , dla 8 ok 66 [Hz]

Powinna byc dwa razy wieksza!..dla 32/32....8/128...o ile teraz to nie problem sobie przeskalowac to jednak powinienem miec tych przerwan dwa razy wiecej a tak to mi rozdzielczosc ucieka...

Link do komentarza
Share on other sites

(edytowany)
43 minuty temu, _LM_ napisał:

Chodzi o to że gdy używasz bootloadera to bity nie są zerowane. Łatwo można sprawdzić: gdy masz załadowany program przez bootloader a program nieprawidłowo się wykonuje to spróbuj go zresetować ręcznie.

niestety reczny reset nie pomagal...widocznie ardu cos sobie tam ustawia na start i tyle...az z ciekawosci sprawdze pozniej co tam sie dzieje na start, teraz tylko dojsc z ta czestotliwoscia no i ponownie sprawdze tryb CTC bo wczesniej nie chodzil wcale...

ps. dziekuje WSZYSTKIM! za pomoc😉

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

7 godzin temu, _LM_ napisał:

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

Np. Jaki? Bo ten AS to tylko chyba stk500 lyka( w kazdym razie icsp mi nie lyka) a avrdude nie chce mi die zainstalowac...😕 no chcialbym tam z ciekawosci na te fusy luknac.. 

Link do komentarza
Share on other sites

W środowisku Arduino niema? Ja używam MkAVRcalc z tym że wersja demo chyba nie obsługuje m328, no ja mam pełną. W sumie nie wiem co Ci doradzić. Szukaj czegoś w rodzaju AVR fusebit programator itd... 

 

Link do komentarza
Share on other sites

Kombinowałem z tymi rejestrami i zauważyłem, że timer jest domyślnie ustawiony w trybie "PWM, phase correct". Po ustawieniu trybu normalnego udało się podwoić częstotliwość mrugania. Problem bardzo podobny do poprzedniego 😀 

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(115200);
  Serial.println("///////");

  TCCR2A &= !(1 << WGM20) | !(1 << WGM21);
  TCCR2B &= !(1 << WGM22);                              //ustawianie timera w tryb normalny- bity WGM20, WGM21, WGM22 równe zero

  TCCR2B &= !(1 << CS22) | !(1 << CS21) | !(1 << CS20); //zerowanie bitów prescalera

  // TCCR2B |= (1 << CS22) | (1 << CS21) | (1 << CS20); //preskaler na 1024
  //TCCR2B |=  (1 << CS22) | (1 << CS21); //preskaler na 256
  // TCCR2B |=  (1<<CS22) | (1<<CS20);    //128
  //  TCCR2B |= (1 << CS22); //preskaler na 64
  // TCCR2B |= (1 << CS21) | (1 << CS20); //32
  TCCR2B |= (1 << CS21); //preskaler na 8
  // TCCR2B |= (1 << CS20); //preskaler na 1

  TIMSK2 |= (1 << TOIE2);  //wlaczenie przerwania od przepelnienia
  // TIFR2 |= (1 << TOV2);

  sei();                 // przerwania globalne wlacz
}

//reszta bez zmian

 

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

(edytowany)
36 minut temu, Peposh napisał:

Kombinowałem z tymi rejestrami i zauważyłem, że timer jest domyślnie ustawiony w trybie "PWM, phase correct".

Juz sie kapnalem pol godziny temu...😂haha...i z ciekawosci zajrzalem do TCCR2A...no i wlasnie WGM20 ustawiony na 1 (bit nr. 0) jeden z trzech ustawiajacych tryb...po wyzerowaniu hula jak ma hulac...szok poprostu!! to juz chyba 4 dzien timerowy byl na dwa watki a taka pierdola...😅 na przyszlosc juz czlowiek bedzie madrzejszy i bedzie zagladal do tych rejestrow...dziekuje bardzo wszystkim za pomoc i cierpliwosc do mnie!!

dodam tylko ze tryb CTC w cudowny sposob rowniez zaczal dzialac..😉

Edytowano przez farmaceuta
  • Lubię! 2
Link do komentarza
Share on other sites

No i temu przeważnie "pluję" na to całe Arduino, niby fajne ale jak przyjdzie do zrobienia czegoś konkretniejszego to musisz się przebijać przez dokumentację żeby znaleźć co tam gdzie ktoś sobie poustawiał. Fajnie że udało się rozwiązać palące problemy sądzę że nauka nie pójdzie w las 🙂 

  • Lubię! 2
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.