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



Teraz jest 12 sie 2026, o 06:34


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 17 lut 2016, o 23:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2014
Posty: 150
Pomógł: 1

Witam wszystkich :)

Dzisiaj postanowiłem przerobić program z BB tak, aby można było sterować diodami RGB.
Podzieliłem główny program main.c na plik źródłowy led.c i nagłówkowy led.h. W pliku nagłówkowym zadeklarowałem funkcję void led_timer0_init (void); odpowiedzialną za ustawienie Timera0 z przerwaniem 1ms, a w pliku źródłowym umieściłem jej definicje.
Dodatkowo utworzyłem plik o nazwie keys.c i keys.h i nich ustawiłem drugi timer (Timer2) do obsługi klawiszy (zgodnie z poradnikiem http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-zwoka-czasowa-cd3.html

Opis problemu (plik main.c):

1. linia led_timer0_init();//zezwolenie na działanie timera PWM znajduje się przed linią d_timer2_init();//zezwolenie na działanie funkcji inicjalizującej pracę Timera2 - program nie działa (diody led nie przygasają i nie rozświetlają się)

2. linia led_timer0_init();//zezwolenie na działanie timera PWM znajduje się za linią d_timer2_init();//zezwolenie na działanie funkcji inicjalizującej pracę Timera2 - program działa (diody led przygasają i rozświetlają się)

Dlaczego tak się dzieje? ma znaczenie kolejnośc ustawiania timerów?


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



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





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



Ostatnio edytowano 18 lut 2016, o 09:21 przez amilo_pa, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2016, o 00:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

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

Tutaj masz błąd.
A dla samoedukacji pomyśl dlaczego tak się dzieje jak opisałeś.
...no i zrób coś z tymi kolorowymi zdaniami ;)

Pozdr.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2016, o 09:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2014
Posty: 150
Pomógł: 1

Dziękuję za tak szybką odpowiedź :)

Popraw mnie jeśli źle myślę :)
Jeżeli użyję zapisu TIMSK = (1<<OCIE2); to dokonam przesunięcia w lewo całego rejestru TIMSK w lewo - czyli w efekcie zepsuje całe ustawienia tego rejestru. Natomiast po użyciu kodu TIMSK |= (1<<OCIE2); efektem będzie wykonanie operacji logicznej OR pomiędzy rejestrem TIMSK a 7 bitem tego rejestru bez naruszenia pozostałych bitów tego rejestru. Dobrze kombinuje? :)

Obrazek



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

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

amilo_pa napisał(a):
Jeżeli użyję zapisu TIMSK = (1<<OCIE2); to dokonam przesunięcia w lewo całego rejestru TIMSK w lewo

O żesz sobie kolega teraz wymyślił .... przesunięcie rejestru

;) Widzę, że masz Bluebooka .... więc proszę poczytaj KONIECZNIE o przesunięciach bitowych i jak to działa bo bez zrozumienia tego - będziesz robił jeszcze gorsze kwiatki ....

Zrozum - zapis

Kod:
(1<<OCIE2)


to tylko WYRAŻENIE w języku C ..... więc pierwsze co musisz zrobić to zobaczyć jaka jest jego wartość panie kochany więc jak to zrobić?

jaką wartość reprezentuje OCIE2 ? no jak widać z noty 7 a więc mamy zapis

Kod:
(1<<7)


czyli ile to się równa ?

Kod:
(1<<7) = 128


czyli ?

Kod:
TIMSK = 127;


czyli ? czyli ustawiłeś pan bit OCIE2 ale skasowałeś wszystkie inne bity .... i jeśli robisz to po resecie procka to przecież nic się nie stanie bo przecież w TOIE2 było zero

ale gdybyś zrobił tak:

Kod:
TIMSK = (1<<TOIE2);
TIMSK = (1<<OCIE2);


no to najpierw ustawiłbyś bit TOIE2 a w drugiej linijce skasowałbyś TOIE2 a ustawił OCIE2

więc aby tego uniknąć warto używać operacji OR czyli

Kod:
TIMSK |= (1<<TOIE2);
TIMSK |= (1<<OCIE2);


oczywiście tu w pierwszej linijce nie jest to konieczne ale ja wolę dla bezpieczeństwa i kosztem małego nadmiaru tak właśnie ustawiać bity

a tobie jeszcze raz polecam poczytać o przesunięciach i wyrażeniach w C bo na razie coś jeszcze mocno tego nie rozumiesz ok ?


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: 18 lut 2016, o 12:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
amilo_pa napisał(a):
Jeżeli użyję zapisu TIMSK = (1<<OCIE2); to

...zapiszę do rejestru tylko (1<<OCIE2)
amilo_pa napisał(a):
TIMSK |= (1<<OCIE2);

to dopiszę (1<<OCIE2) do wcześniejszego zapisu.
W pierwszym przypadku po ustawieniu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

pozostawał tylko drugi wpis - (1<<OCIE0) zostawało wyzerowane.

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2016, o 13:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2014
Posty: 150
Pomógł: 1

Witam,

Przeczytałem, chyba zrozumiałem, zapamiętałem :) dziękuję kicajek oraz mirekk36 :)
Pozdrawiam
Piotr



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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