farmaceuta Napisano Kwiecień 23, 2021 Udostępnij Napisano Kwiecień 23, 2021 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;-) Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Kwiecień 24, 2021 Udostępnij Kwiecień 24, 2021 (edytowany) Hej a czemu ty znowu zgadujesz. Dzielniki są rozpisane w nocie katalogowej Edytowano Kwiecień 24, 2021 przez _LM_ Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Kwiecień 24, 2021 Udostępnij Kwiecień 24, 2021 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 Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Kwiecień 24, 2021 Autor tematu Udostępnij Kwiecień 24, 2021 (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 Kwiecień 24, 2021 przez farmaceuta Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
_LM_ Kwiecień 24, 2021 Udostępnij Kwiecień 24, 2021 A to ciekawostka. Sprawdzę to później Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Kwiecień 24, 2021 Autor tematu Udostępnij Kwiecień 24, 2021 (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 Kwiecień 24, 2021 przez farmaceuta Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Kwiecień 24, 2021 Udostępnij Kwiecień 24, 2021 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ą Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Kwiecień 24, 2021 Autor tematu Udostępnij Kwiecień 24, 2021 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) Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Kwiecień 24, 2021 Udostępnij Kwiecień 24, 2021 (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 Kwiecień 24, 2021 przez _LM_ 1 Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Kwiecień 24, 2021 Udostępnij Kwiecień 24, 2021 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. Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Kwiecień 24, 2021 Udostępnij Kwiecień 24, 2021 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 Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Kwiecień 24, 2021 Autor tematu Udostępnij Kwiecień 24, 2021 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.. Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Kwiecień 24, 2021 Udostępnij Kwiecień 24, 2021 Przed chwilą, farmaceuta napisał: wiec nie powinienem popelnic bledu podczas wpisywania niewiadomo czego co moze skutkowac zgonem procka. Po prostu nie dotykaj bitu SPIEN 1 Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Kwiecień 24, 2021 Udostępnij Kwiecień 24, 2021 Kurcze aż poszukam jakiegoś m328 bo to jest niemożliwe żeby nie działało Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Kwiecień 24, 2021 Autor tematu Udostępnij Kwiecień 24, 2021 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...(?🤔?) Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!