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



Teraz jest 10 mar 2025, o 09:20


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 
Autor Wiadomość
PostNapisane: 7 gru 2016, o 13:00 
Offline
Nowy

Dołączył(a): 18 lut 2015
Posty: 10
Pomógł: 0

Witam. Próbuję napisać program na atmega32 - co ma robić program to na razie nie jest istotne - chodzi o to, że timer0 w trybie CTC nie zawsze działa dobrze.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Mianowicie while(opoznienie_1ms<=500); co któreś naciśnięcie przycisku generuje opóźnienie 250ms zamiast 500ms (pomiar przeprowadzony na oscyloskopie).
Co może być nie tak? Według mnie powinno być wszystko ok.
Z góry dziękuję za pomoc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2016, o 13:11 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

dejmos napisał(a):
chodzi o to, że timer0 w trybie CTC nie zawsze działa dobrze

Timer na 100% działa dobrze, za to kolega źle napisał program i tak należy do tego podejść. Ciężko mi analizować tak napisany kod, ale tylko na pierwszy rzut oka rzuca się właśnie brak ATOMIC_BLOCK


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2016, o 13:44 
Offline
Nowy

Dołączył(a): 18 lut 2015
Posty: 10
Pomógł: 0

Dziękuję za szybką odpowiedź. Mam nadzieję, że o to chodzi :) Bo pomogło.

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 jeszcze dołożyć wywołanie obsługi 3 wyświetlaczy 7-seg w tym przerwaniu ale wtedy już nawet ATOMIC_BLOCK nie pomaga.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2016, o 14:23 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

Na prawdę - patrząc na to jak kolega pisze kod, na problemy z multipleksowaniem itp - polecam książkę:

http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

Myślę, że bardzo dużo może ona wnieść do nauki programowania w C

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2016, o 14:58 
Offline
Nowy

Dołączył(a): 18 lut 2015
Posty: 10
Pomógł: 0

Dziękuję za krytykę. Chodzi o to, że to co przedstawiłem jest wyrywkiem dużo większej całości więc może dlatego jest takie niespójne. Nigdy nie używałem ATOMIC_BLOCK więc dlatego pytam czy o to chodziło. Co do multipleksowania to myślę, że orientuję się w temacie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2016, o 16:01 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

Cytuj:
Dziękuję za krytykę.

Nie zrozum mnie źle, ja nie krytykuję - widzę tylko w jaki sposób pisany jest kod i tu mi w ogóle nie chodzi o niespójność ... ale jak mówię, to była tylko luźna propozycja. Ja natomiast nie mam na tyle czasu aby analizować kod na forum, który również nie jest pisany zgodnie z zasadami dobrego pisania kodu. Ale może ktoś inny będzie miał czas i ochotę się nad tym pochylić, ja podpowiedziałem na szybko to co mogłem.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2016, o 20:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

W przerwaniu można ustawić np. zmienna volatile którą będzie odczytywać np. co sekundę albo i rzadziej funkcja obsługująca wyświetlacz. Ważne, żeby ta funkcja była nie za często wywoływana, bo LCD lubią blokować i jest z tego katastrofa.... I nie naraz trzy, tylko po kolei, np. co sekundę kolejny LCD.
W ten sposób będzie wilk syty i owca cała, czyli wyświetli się coś i przerwanie nie zablokuje procesora.

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2016, o 07:44 
Offline
Nowy

Dołączył(a): 18 lut 2015
Posty: 10
Pomógł: 0

mirekk36 napisał(a):
widzę tylko w jaki sposób pisany jest kod

mirekk36 napisał(a):
który również nie jest pisany zgodnie z zasadami dobrego pisania kodu

Dziękuję za odpowiedz. Mam nadzieję, że nie nadużywam cierpliwości Pana, ale chciałbym żeby mi Pan podpowiedział w którym miejscu coś jest napisanie nie w taki sposób jak powinno? Z góry dziękuję za odpowiedź.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 gru 2016, o 11:48 
Offline
Użytkownik

Dołączył(a): 19 sty 2014
Posty: 83
Pomógł: 2

Chociażby w niewłaściwy sposób używasz timerów, równie dobrze mógłbyś dać tam delay.
A używanie w ten sposób w jaki jest zaprezentowane powyżej uniemożliwi Ci multipleksowanie.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 gru 2016, o 12:42 
Offline
Nowy

Dołączył(a): 18 lut 2015
Posty: 10
Pomógł: 0

Dziękuję za odpowiedź. Ja wiem o tym, że tak opóźnień się nie daje :) to jest tylko testowy program który miał mi posłużyć do sprawdzenia timera (generowanie przebiegu prostokątnego) i umieszczenia go tutaj na forum w celu zobrazowania problemu zaś cały program ma ponad 1500 linii i kilkanaście flag ustawianych w 5 różnych przerwaniach. Zdziwiło mnie to, że wrzucenie do przerwania wywołania funkcji obsługujące dwa przyciski tak bardzo zaburza jego pracę, że co jakiś czas funkcja generująca opóźnienie 500ms generuje opóźnienie około 250ms. Konkretnej odpowiedzi nie uzyskałem zaś zostałem skrytykowany za jakość pisanego kodu. Chociaż wg mnie styl pisania dla programisty jest jak jego "odcisk palca" i każdy pisze jak mu jest wygodnie bo dla kompilatora chyba nie ma różnicy czy ktoś sobie zdefiniuje takie czy inne makra, czy da nawias w tej samej linijce co pętla czy też pod nią, czy zastosuje wcięcia czy też nie. Każdy powinien pisać tak jak uważa jeżeli tylko się w tym odnajduje. Dlatego krytyka za pisanie kodu nie zgodnie z zasadami trochę mnie zdziwiła.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 gru 2016, o 13:42 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

dejmos napisał(a):
Chociaż wg mnie styl pisania dla programisty jest jak jego "odcisk palca"

Oj masz rację, w 100% masz rację i od razu widać np kto jak źle pisze i nie trzyma się dobrego stylu programowania

dejmos napisał(a):
i każdy pisze jak mu jest wygodnie

Masz rację i NIKT ci tego nie zabroni - rób jak chcesz ... ale ... ale sobie zapamiętaj, że:

1. Ja poprzez swoje wszystkie książki i poradniki UCZĘ jak pisać w tzw "dobrym stylu programowania" w języku C (to jest pewien zbiór prostych w sumie zasad, które ułatwiają życie nie tylko gdy pracujemy w zespole ale również nam samym - początkującym szczególnie. I szczególnie gdy po jakimś czasie wracamy do własnego kodu - żeby go szybciej sobie przypomnieć i zrozumieć) ... Ty sobie nawet trudu nie zadałeś żeby poszukać co to jest "dobry styl pisania kodu" albo żeby podpytać i nawet jak widzę tego kompletnie nie rozumiesz a co gorsze nawet nie chcesz się dowiedzieć - nauczyć - trudno twoja sprawa NIKT ci nie zabroni

2. To jest forum które pomaga wielu ludziom, w tym początkującym, którzy się uczą a zatem to nie dziwne że wskazuję kody na forum, które są niestety paskudnie napisane pod tym względem

3. To jest forum na którym się UCZYMY i kody przeglądają początkujące osoby i muszą wiedzieć co i jak

4. U nas na forum jest taka ZASADA - że jak wstawiamy kod to warto go pokazać właśnie żeby był napisany w dobrym stylu - żeby inni mogli szybko zrozumieć w czym rzecz. Ja np, gdy widzę, że ktoś nie stosuje w ogóle zasad dobrego stylu to nawet nie zagłębiam się w kod i nie pomagam ponieważ TU WŁAŚNIE WYCHODZI - widzisz pan - że nie piszesz sam dla siebie - tylko ZADAJESZ pytania innym i jeśli piszesz kod byle jak to nie dziw się, że mało osób w ogóle zainteresuje się twoim problemem - większość osób oczekuje szacunku, tak tak - gdy zadajesz pytanie to mógłbyś postarać się przynajmniej nauczyć się podstaw tego dobrego stylu pisania albo ....

albo wykazać chęć nauki - nie zaś pisać bajek o swoich odciskach palców ...

dejmos napisał(a):
bo dla kompilatora chyba nie ma różnicy czy ktoś sobie zdefiniuje takie czy inne makra


żebyś się nie zdziwił czasem ;) ... Nawet nie wiesz ile błędów można uniknąć stosują dobry styl programowania - nie zdajesz sobie z tego sprawy bo NIGDY tego nie robiłeś - więc proszę cię nie dziw się

dejmos napisał(a):
Dlatego krytyka za pisanie kodu nie zgodnie z zasadami trochę mnie zdziwiła.


Nie dziw się - bo to jest PODSTAWA - i przypominam po raz kolejny - nie piszesz sam dla siebie skoro zadajesz pytanie na forum i pokazujesz tak napisany kod a piszesz do tego że:

dejmos napisał(a):
Każdy powinien pisać tak jak uważa jeżeli tylko się w tym odnajduje.

Bo to jest jedna z najgorszych bzdur ...

ale UWAGA! na koniec - bo pewnie nawet nie wiesz o czym mówię odnośnie stylu dobrego programowania bo pewnie ani nie masz żadnej mojej książki ani pewnie nie oglądałeś moich poradników - to podam ci kilka przykładów, żebyś nie myślał że styl dobrego pisania kodu oznacza, że chodzi o to że ktoś ZAWSZE napisze od razu sprawdzony i działający KOD - to byłaby bzdura ;)

1. to może najmniejszy problem ale na tym forum nie używamy kocich makr _BV() więc zamiast pisać

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


pisz np:

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


nie bój się przesunięć bitowych ;) ... ale ok to pikuś

--------------------------

2. NA POCZĄTKU kodu piszemy ZAWSZE ciało funkcji main() a dopiero dalej pod nią definicje innych funkcji. Za to na górze nad main() piszemy tylko deklaracje (nagłówki) tych funkcji poniżej main() - chodzi o to żeby ZAWSZE SZYBKO i najłatwiej było znaleźć GŁÓWNĄ funkcję programu - jego miejsce STARTOWE zamiast się przedzierać w kodzie przez szereg funkcji i to jeszcze bez BEZ ŻADNYCH KOMENTARZY jak u ciebie

-----------------------------------

3. piszemy komentarze w kodzie to PODSTAWA - PODSTAW - chociażby minimalne ale kod bez komentarzy jest kodem od razu do śmietnika

---------------------------------

4. Jeśli piszesz kod w języku AVR GCC to stosuj typy przewidziane w tym języku a zatem uint16_t a nie unsigned int

-------------------------------------------------

5. Widać że nie znasz też do końca jeszcze podstaw C dlatego polecałem ci książkę ... a z tego wynika kolejny babol który robisz czyli

dejmos napisał(a):
volatile unsigned int opoznienie_1ms=0;


po co inicjalizujesz ZEREM zmienne globalne ? jeśli wiadomo ze standardu języka C że one są inicjalizowane ZEREM domyślnie ? a więc kolejne zamieszanie w twoim kodzie

--------------------------

6. nazwy MAKR w C pisz DUŻYMI literami - bo lepiej później odróżniają się w kodzie pomiędzy nazwami różnych funkcji i zmiennych, które warto z kolei pisać małymi literami. Albo tzw stylem wielbłądzim - jeśli wiesz co to jest a jeśli nie - to zajrzyj do wikipedii co to jest styl wielbłądzi i dlaczego się go stosuje do nazw. Ty natomiast robisz jeszcze gorzej bo jedne makra piszesz małymi literami a inne dużymi a więc już w ogóle wprowadzasz totalny MISZ-MASZ


-------------------------------

7. gdy piszesz funkcję bez argumentów stosuj dla porządku void czyli np

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


i robisz tak nawet w swojej funkcji main( void ) w kodzie ale już dalej znowu niekonsekwencja bo w pozostałych nie ma tego void w miejscu argumentów


-----------------------------------------------

8. stosuj przerwy chociaż JEDNĄ kurczę linię pomiędzy sekcjami programu a już szczególnie pomiędzy definicjami funkcji a nie wszystko ciurkiem się ciągnie jak rozgotowany makaron

-------------------------------------------

9. kompletnie nie zwracasz uwagi na ważne w sumie szczegóły np:
Cytuj:
#include<avr\io.h>
#include <avr/interrupt.h>

mów sobie co chcesz ale to to już jest MASAKRA ... i co więcej nawet jakby ktoś z forum chciał szybko skopiować i wkleić do siebie twój kod żeby coś sprawdzić to to może raz działać a raz nie działać. A i tobie po roku czy dwóch np gdy weźmiesz inny kompilator to nagle to przestanie działać i co ? Nie dość że różne ukośniki to jeszcze tu spacja, tam bez spacji ... całość wtedy wygląda TRAGICZNIE ... no tragicznie

-------------------------

10. UNIKAJ JAK OGNIA wywoływania funkcji z procedur obsługi przerwań bo sobie sam robisz masakrę amerykańską piłą tarczową na przyszłość - czy wiesz jaki to ma wpływ na stos czy nie za bardzo się orientujesz ? .... Być może nie orientujesz się w ogóle jak wygląda cykl życia funkcji - i wtedy może to doprowadzać do tragicznych baboli w kodzie w przyszłości ....

----------------------

11. nie stosuj takich zapisów

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


tylko takie żeby było jaśniej

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


---


mógłbym tak jeszcze dalej pisać o twoim kodzie ale myślę, że tych kilka przykładów być może natchnie cię do tego żebyś w końcu zastanowił się co to znaczy styl dobrego pisania kodu i że warto się go uczyć chłopie

na koniec żeby nie być gołosłownym - i żeby ci pokazać, że ja nie krytykuję - bo krytykiem nie jestem - tylko zwracam uwagę na WAŻNE aspekty uczenia się programowania, że nie mam zamiaru ci dogryzać albo przygadywać - to poświęcę się i proszę pokażę ci jak powinien wyglądać ten twój kod z pierwszego postu (NIE WAŻNE CZY ŹLE DZIAŁA CZY DOBRZE!!!) ważne żebyś sobie porównał i chociaż spróbował zrozumieć o czym mówię i na co ci zwracam uwagę - czego warto się uczyć - zamiast dziwić i focha strzelać

troszkę dla przykładu dodałem komentarzy ale ty ZOBACZ JAK POPRAWIŁEM inicjalizację timera i jak podzieliłem kod

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


i jak mi powiesz, że to nie jest po 1000-kroć czytelniejsze od tego co ty pokazałeś - to .... to szkoda gadać

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 gru 2016, o 14:10 
Offline
Nowy

Dołączył(a): 18 lut 2015
Posty: 10
Pomógł: 0

Dziękuję bardzo. Teraz już wiem o co chodzi. Chciałbym się troszeczkę wytłumaczyć. Przyzwyczaiłem się, że zawsze funkcję main mam na samym końcu chociaż posiadanie jej na początku jest dużo lepsze. Przesunięć bitowych się nie boję i używam i nie wiem dlaczego ale przyzwyczaiłem się do makra _BV - po prostu zawsze go używałem to tak na usprawiedliwienie. I tu też się zgodzę, że łatwiej się czyta kod gdy używamy przesunięć. Typy zmiennych - rzeczywiście raz używam uint8_t raz char tutaj ewidentnie jest moja wina. Co do wywoływania funkcji w przerwaniu ... zazwyczaj tego nie robię i zdziwiło mnie że taką masakrę z opóźnieniami robi taka mała funkcja .... muszę o tym doczytać. Dziękuję za zwrócenie na te kwestie uwagi większość wynika z moich przyzwyczajeń część z niewiedzy. Postaram się te złe nawyki u siebie eliminować i doczytać pewne rzeczy. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 gru 2016, o 14:24 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

No i właśnie tylko o to chodzi - żeby zwrócić uwagę na takie w gruncie rzeczy drobiazgi - i stosować się do tego - a sam zobaczysz że szybko się przyzwyczaisz i docenisz to wkrótce.

z tym wywoływaniem funkcji w przerwaniu to nie chodzi o jakieś opóźnienia drastyczne bo to nie są duże opóźnienia - skok do funkcji i odłożenie na stosie kilku elementów ... Tu chodzi właśnie bardziej o dbanie o zajętość stosu. Ja nie mówię przy tym, że nigdy tak nie można - bo można - ale .... ale trzeba mieć DOKŁADNĄ świadomość cyklu życia funkcji i właśnie takie zagadnienia od podstaw oraz wiele innych wyjaśniam w swojej niebieskiej książce. Bez tej wiedzy o takich podstawach - początkujący później właśnie nieświadomie wciąż powielają pewne błędy.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2016, o 10:12 
Offline
Nowy

Dołączył(a): 18 lut 2015
Posty: 10
Pomógł: 0

Witam. Nie będę zakładał drugiego wątku tylko pociągnę już istniejący. Mianowicie chodzi o to, że w kodzie poniżej funkcja void opoznienie_1ms(uint16_t czas_opoznienia_1ms) generuje opóźnienia poprawnie tylko do 255ms powyżej tej wartości opóźnienia są generowane jako 255ms. Wygląda tak jakby kompilator traktował zmienną czas_opoznienia_1ms i zmienną timerH jako uint8_t a nie jak to jest zadeklarowanie uint16_t i dla wartości powyżej 255 wstawiał 255. Co jest nie tak? Bo wg mnie wszystko powinno być ok. Z góry dziękuję za odpowiedź.



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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2016, o 10:26 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

łaaaaał - no teraz tak napisany kod to MIODZIO ! ... aż miło popatrzeć i szkoda nie podpowiedzieć czegoś

jaką częstotliwością taktujesz procka ? to ważne pytanie bo .... widzę teraz ładnie z kodu - że ustawiasz działanie timera2 na 50 kHz ! ... czy sprawdzałeś sobie czy w ogóle wyrabia ci się to czasowo ? to bardzo wysoka częstotliwość - przelicz sobie ilość rozkazów asm kodu w procedurze obsługi przerwania w pliku *.lss ... bo mogę się mylić ale na moje oko to robi się już kiszka - szczególnie jeśli jeszcze być może wolno taktujesz procka

druga sprawa - zrobiłeś ładnie Atomic block ale nie na to co głównie potrzeba

Cytuj:
ATOMIC_BLOCK(ATOMIC_FORCEON)
{
TCNT2=0;
timerH=0;
pomocnicza=0;
}
while(timerH <= czas_opoznienia_1ms);


Zobacz to co na czerwono to porównywanie zmiennej 16-bitowej która jest napędzana w przerwaniu - a więc w trakcie porównania może dojść do przerwania i ... ? .... i klops

to while powinno być w ramach Atomic Block

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2016, o 11:07 
Offline
Nowy

Dołączył(a): 18 lut 2015
Posty: 10
Pomógł: 0

Dziękuję za odpowiedź. Procesor taktowany jest zegarem 8MHz więc myślę że powinien dać radę. Mogę w sumie zwolnić 100 krotnie wywołanie przerwania od timera2 i wtedy procek na pewno da sobie radę. tylko w przyszłości będą mi potrzebne interwały krótsze niż 1ms i dlatego wolałbym zostawić to tak jak jest. Najdziwniejsze jest to, że pozbycie się ATOMIC_BLOCK powoduje, że funkcja działa dobrze.
Co do asemblera to nie wiem dlaczego ale dla trybu CTC jest vektor3 a dla trybu OVERFLOW jest vektor4 zaś w moim pliku *.lss jest tylko wektor 4 i ma postać
Kod:
000000b4 <__vector_4>:
  b4:   1f 92          push   r1
  b6:   0f 92          push   r0
  b8:   0f b6          in   r0, 0x3f   ; 63
  ba:   0f 92          push   r0
  bc:   11 24          eor   r1, r1
  be:   8f 93          push   r24
  c0:   9f 93          push   r25
  c2:   80 91 a0 00    lds   r24, 0x00A0
  c6:   90 91 a1 00    lds   r25, 0x00A1
  ca:   01 96          adiw   r24, 0x01   ; 1
  cc:   90 93 a1 00    sts   0x00A1, r25
  d0:   80 93 a0 00    sts   0x00A0, r24
  d4:   80 91 8f 00    lds   r24, 0x008F
  d8:   8f 5f          subi   r24, 0xFF   ; 255
  da:   80 93 8f 00    sts   0x008F, r24
  de:   80 91 8f 00    lds   r24, 0x008F
  e2:   84 36          cpi   r24, 0x64   ; 100
  e4:   58 f0          brcs   .+22        ; 0xfc <__vector_4+0x48>
  e6:   10 92 8f 00    sts   0x008F, r1
  ea:   80 91 90 00    lds   r24, 0x0090
  ee:   90 91 91 00    lds   r25, 0x0091
  f2:   01 96          adiw   r24, 0x01   ; 1
  f4:   90 93 91 00    sts   0x0091, r25
  f8:   80 93 90 00    sts   0x0090, r24
  fc:   9f 91          pop   r25
  fe:   8f 91          pop   r24
 100:   0f 90          pop   r0
 102:   0f be          out   0x3f, r0   ; 63
 104:   0f 90          pop   r0
 106:   1f 90          pop   r1
 108:   18 95          reti

Można przyjąć, że problem połowicznie został rozwiązany tylko dlaczego ATOMIC_BLOCK wprowadza takie problemy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2016, o 11:10 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

dejmos napisał(a):
Można przyjąć, że problem połowicznie został rozwiązany tylko dlaczego ATOMIC_BLOCK wprowadza takie problemy.

Nie wiem o czym mówisz - ja pisałem tobie o włączeniu do atomic block a ty piszesz że w ogóle usunąłeś - nie wiem co robisz

dejmos napisał(a):
. tylko w przyszłości będą mi potrzebne interwały krótsze niż 1ms

to się robi inaczej ... wtedy można ustawić timer z odpowiednią częstotliwością i zliczać same tyknięcia timera w TCNT0

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2016, o 11:56 
Offline
Nowy

Dołączył(a): 18 lut 2015
Posty: 10
Pomógł: 0

Chodzi o to, że jeżeli robię coś takiego:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Funkcja nie działa i to by było logiczne bo program zatrzymuje się na pętli while przy wyłączonych przerwaniach i warunek
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

zawsze będzie spełniony bo timerH nie będzie inkrementowany.
W poprzedniej wersji gdy w ATOMIC_BLOCK znajdowało się tylko zerowanie zmiennych "timerH" i "pomocnicza" oraz rejestru TCNT2 funkcja działała dobrze tylko do 255ms. I to mnie zaskoczyło dlaczego tylko do 255? Co takiego dziwnego wprowadza ATOMIC_BLOCK, że zmianna deklarowana jako 16 bitowa jest traktowana jako 8 bitowa?
Po zastanowieniu należało by zrobić coś w rodzaju:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i takie rozwiązanie działa i w tym przypadku zmienne traktowane są już jako 16 bitowe.
Co do możliwości generowania interwałów przy pomocy tyknięć TCNT2 nie pomyślałem. Będę musiał to zastosować.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2016, o 12:01 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

dejmos napisał(a):
Co takiego dziwnego wprowadza ATOMIC_BLOCK, że zmianna deklarowana jako 16 bitowa jest traktowana jako 8 bitowa?

A skąd powziąłeś taką wiedzę ? .... Atomic block zatrzymuje przerwania żeby operacje sprawdzenia zmiennych więcej niż 8-biowe które wykonywane są w wielu rozkazach asm nie mogły być przypadkowo przerwane przez przerwanie .....

Gdy zmienna jest 8-bitowa to większość porównań z uwagi na strukturę AVR może być wykonywana atomowo w jednym cyklu a więc nie może zostać taka operacja atomowa jak to się mówi, być przerwana w trakcie, przez przerwanie

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2016, o 12:24 
Offline
Nowy

Dołączył(a): 18 lut 2015
Posty: 10
Pomógł: 0

No właśnie o to chodzi, że generalnie wiem co robi ATOMIC_BLOCK. A to co opisałem to nie jest żadna wiedza powzięta z internetu czy książek. Procesor + oscyloskop i wychodzi, że funkcja w postaci:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

generuje poprawne opóźnienia dla zmiennej "czas_opoznienia_1ms" z zakresu od 1 do 255 powyżej tej wartości zmienna "czas_opoznienia_1ms" przyjmuje wartość 255.
A funkcja w postaci:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

działa poprawnie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2016, o 12:37 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

toż pisałem tobie wyżej żebyś włączył sprawdzanie wartości timerH do atomic block

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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