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



Teraz jest 28 mar 2024, o 10:03


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 20 ] 
Autor Wiadomość
PostNapisane: 28 mar 2020, o 19:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

Witam chciałem w pewnym programie migać diodą za pomocą Timera . W założeniu chciałem by dioda migała co 1 sek .
Nie wiem co zrobiłem żele ale dioda mignie parę razy i koniec??

Atmega 32 1 MZ trochę ślimak

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: 28 mar 2020, o 20:36 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

Wywal obsługę diody z przerwania



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2020, o 21:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

Wywaliłem obsługę diody z przerwania ...
potem:
wrzuciłem do pętli głównej
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


niestety dalej nie miga ??????



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2020, o 21:15 
Offline
Nowy

Dołączył(a): 10 mar 2018
Posty: 8
Pomógł: 0

Zmienna int16_t powinna być klasy static oraz zainicjowana, a więc static uint16_t n=40;

------------------------ [ Dodano po: 10 minutach ]

Zmienna static istnieje między wywołaniami funkcji. To znaczy, że stanowi prywatną pamięć funkcji.
U ciebie deklaracja uint_16 n; nie wiadomo jaką ma wartość zmienna n i przy kolejnych wywołaniach obsługi przerwania posiada przypadkową wartość.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2020, o 21:56 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

Jak n zadeklarujesz w przerwaniu jakąś wartością np: n=50; to w petli zmieniając timer1=40; jaka wartość n będzie po wykonaniu if-a I ustawieniu timer1=40; i wejsciu w przerwanie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2020, o 22:12 
Offline
Nowy

Dołączył(a): 10 mar 2018
Posty: 8
Pomógł: 0

Zrób tak:
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: 28 mar 2020, o 22:12 
Offline
Moderator
Avatar użytkownika

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

Panowie mars10 i Szofer - zerknijcie do Bluebooka to zrozumiecie jak działa ten mechanizm w przerwaniu - bo na razie to niestety obaj wymyślacie niestworzone historie na temat tej zmiennej "n" ... a tu akurat ma być tak jak jest ;)

_________________
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: 28 mar 2020, o 22:17 
Offline
Nowy

Dołączył(a): 10 mar 2018
Posty: 8
Pomógł: 0

W ISR oczywiście
static uint16_t n = 0;

...sorry



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2020, o 22:30 
Offline
Moderator
Avatar użytkownika

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

mars10 --> tak ale nie żadne static, a gdybyś już nawet dawał specyfikator static ;) to powiedz mi po co przypisujesz wtedy zero ? ;) toż static powoduje, że masz tę zmienną tak jak globalną czyli inicjalizowaną zerem automatycznie. Tylko zmienne lokalne się inicjalizuje - o ile pierwszą kolejną na niej operacją nie jest właśnie inicializaja jak tutaj

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


więc tak ma pozostać ;) i tak jest NAJLEPIEJ

_________________
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: 28 mar 2020, o 22:53 
Offline
Nowy

Dołączył(a): 10 mar 2018
Posty: 8
Pomógł: 0

Masz rację Mirku. Zmienne globalne są inicjowane na zero.
Ale do dobrego stylu programowania należy unikać zmiennych globalnych, które są dostępne dla wszystkich funkcji, a to może prowadzić do błędów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2020, o 23:34 
Offline
Moderator
Avatar użytkownika

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

mars10 napisał(a):
Ale do dobrego stylu programowania należy unikać zmiennych globalnych, które są dostępne dla wszystkich funkcji, a to może prowadzić do błędów.

No tak ale co to ma wspólnego ze zmienną static uint16_t n; ? w tej procedurze obsługi przerwania - skoro nie jest ona globalna? ... zachowuje się tylko jako globalna w zakresie inicjalizacji właśnie.

_________________
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: 28 mar 2020, o 23:47 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

AKSELINEK
Nie widzę definicji zmiennej Timer1. Czy masz przy niej specyfikator volatile?
Coś pokombinowałeś też z nawiasami {}.
ISR(TIMER2_COMP_vect) powinien być poza main().



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2020, o 23:52 
Offline
Nowy

Dołączył(a): 10 mar 2018
Posty: 8
Pomógł: 0

Podstawowe zasady dobrego programu:
1. Jeżeli jakaś zmienna jest używana tylko lokalnie wewnątrz funkcji, to nie używaj w tym celu zmiennej globalnej.
2. Idealna liczba zmiennych globalnych to zero.

Pozdrawiam,



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2020, o 12:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

Dziękuje za zainteresowanie przykładem, wzorowałem się na przykładach z książki więc tam ustawienia zmiennych były poprawne.
Kolega Szofer słusznie stwierdził żeby wywalić obsługę diody z przerwania - tak też zrobiłem, wrzuciłem warunek do pętli głównej też nie poszło.
Jednak nie dokładnie skopiowałem warunek z książki i tu poprawiłem:

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

mylę że zbagatelizowałem w przykładzie działanie zmiennej sw i chyba do końca nie odrobiłem lekcji.

------------------------ [ Dodano po: 54 minutyach ]

Proszę przeanalizujcie czy dobrze rozumuje:
Wykonuje się przerwanie co 100 Hz w wykonanym przerwaniu jest stworzona zmienna lokalna n, która zanika po wykonaniu przerwania .
Wartość zmiennej globalnej Timer1 jest wpisana do n.
Jeśli n jest dodatnie to Timer 1 się zmniejsza o 1 , ale gdy po 40 razach dojdzie do 0 to spełnia się warunek w pętli if(!Timer1) i w pętli jeśli sw=0 to (!sw)=1 to zapala diodę - czy tak??
nie rozumiem natomiast co znaczy sw^=1 ??? ale następnie Timer1 otrzymuje zwiększenie wartości do 40 i sytuacja się cyklicznie powtarza.

Podpowiedzcie czy dobrze rozważam czy nie ?????



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2020, o 15:00 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

^ to operator xor
w tym przypadku:
sw^=1
to nic innego jak negacja.
Cała ta zabawa z sw jest niepotrzebna można to zrobić prościej od razu na porcie:
PORTB ^= LEDN;
Czyli negujesz jeden bit na który wskazuje LEDN;

------------------------ [ Dodano po: 6 minutach ]

AKSELINEK napisał(a):
Kolega Szofer słusznie stwierdził żeby wywalić obsługę diody z przerwania - tak też zrobiłem, wrzuciłem warunek do pętli głównej też nie poszło.

Tu wywalenie obsługi diody z przerwania nie ma nic do rzeczy.
Możesz to zrobić w przerwaniu i też musi działać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2020, o 15:18 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

[/quote]
Tu wywalenie obsługi diody z przerwania nie ma nic do rzeczy.
Możesz to zrobić w przerwaniu i też musi działać.[/quote]

MA do rzeczy bo mryganie diodą było i w petli (potem zakomentowane bo nie swieciła dioda, zapewne) i w przerwaniu także bardziej pwm się robił 50hz,



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2020, o 15:28 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Szofer napisał(a):
Tu wywalenie obsługi diody z przerwania nie ma nic do rzeczy.
Możesz to zrobić w przerwaniu i też musi działać.

MA do rzeczy bo mryganie diodą było i w petli (potem zakomentowane bo nie swieciła dioda, zapewne) i w przerwaniu także bardziej pwm się robił 50hz,


No w tym sensie, że trzeba się zdecydować w którym miejscu mrygamy, to tak ma to znaczenie.
Albo mrugamy w przerwaniu, albo w pętli głównej.
Natomiast samo mryganie w przerwaniu też jest dopuszczalne i musi działać.

------------------------ [ Dodano po: 31 minutach ]

AKSELINEK

Poniżej masz poprawiony kod twojego programu z mruganiem.
Sterownie diodą masz w przerwaniu.
Uwagi:
Jakie masz taktowanie 1Mhz? Przelicz jeszcze raz OCR2.

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: 29 mar 2020, o 17:45 
Offline
Nowy

Dołączył(a): 10 mar 2018
Posty: 8
Pomógł: 0

Mirek pisał "mars10 --> tak, ale nie żadne static......"
A własnie, że zmienna Timer1 musi być static. Lepiej podczas deklaracji od razu zainicjować ją na 50.
Sprawdź, co się stanie jak nie będzie static. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2020, o 19:20 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

mars10 napisał(a):
Mirek pisał "mars10 --> tak, ale nie żadne static......"
A własnie, że zmienna Timer1 musi być static. Lepiej podczas deklaracji od razu zainicjować ją na 50.
Sprawdź, co się stanie jak nie będzie static. ;)

Tak, jeżeli zmienna Timer1 jest zdefiniowana w przerwaniu to musi to być static.
Natomiast jeżeli, tak jak to było wcześniej, czyli jako zmienna globalna to zamiast static musi być użyty specyfikator volatile.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2020, o 20:18 
Offline
Moderator
Avatar użytkownika

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

mars10 napisał(a):
A własnie, że zmienna Timer1 musi być static.

Ależ co kolega opowiada że MUSI ;) bez sensu - dla tego przykładu nie ma to ŻADNEGO znaczenia a ja podejrzewam, że kolega tak pisze bo albo niestety nie rozumie jak działa ten mechanizm "timera programowego" albo nie do końca rozumie działania specyfikatora static dla zmiennych globalnych. Więc jak coś to dopytaj to chętnie podpowiem - zamiast wprowadzać w błąd kogoś - że tutaj musi być static. Ja tylko podpowiem, że w tym wypadku specyfikator static dla Timer1 może być ale nie musi. A ty jeśli wiesz dlaczego to spróbuj napisać jaka będzie różnica - wtedy może lepiej zrozumiesz jak to działa ok?

_________________
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: 20 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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