Skocz do zawartości

Arduino i timery - problem ze zrozumieniem preskalerów


Pomocna odpowiedź

Napisano

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;-)

(edytowany)

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

 

 

Screenshot_2021-04-24-09-08-57-213_com.google.android.apps.docs.jpg

Edytowano przez _LM_

Ah i jeszcze jeden knif. Zmienna x powonna być odczytywana atomowo. Narazie spróbuj ten warunek przenieść do funkcji przerwania i sprawdź czy coś się dzieje innego 

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

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ą 

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)

(edytowany)

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
4 minuty temu, farmaceuta napisał:

robi sie to programatorem Usbasp tak?

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

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

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

Przed chwilą, farmaceuta napisał:

wiec nie powinienem popelnic bledu podczas wpisywania niewiadomo czego co moze skutkowac zgonem procka.

Po prostu nie dotykaj bitu SPIEN

  • Lubię! 1
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...(?🤔?)

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...