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



Teraz jest 5 gru 2024, o 02:59


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 21 lis 2015, o 14:36 
Offline
Nowy

Dołączył(a): 27 paź 2015
Posty: 4
Pomógł: 0

Witam.
Projektuję prosty układ na podstawie ATMegi328, jedną z części tego układu jest pasek kilku diod LED, który ma stopniowo zwiększać częstotliwość migania diod do osiągnięcia zadanej wartości w ustalonym czasie. Obsługa paska LED zrealizowana jest przez przerwanie generowane przez TIMER1 skonfigurowany następująco:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Przerwanie zrealizuje prostą funkcję switch przełączającą stany diod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Po wciśnięciu przycisku start, diody mają "rozpędzić się" do zadanej prędkości. Zrealizowałem to w następujący sposób:

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


Z kodu wynika, że wartość OCRA1 jest skokowo obniżana, co powoduje zwiększenie częstotliwości występowania przerwania. Niestety nie działa to prawidłowo, podczas przyspieszania program w przerwaniu dostaje chwilowych zwiech w losowych momentach, co skutkuje chwilowym zatrzymaniem przesuwającego się paska. Analogicznie napisałem funkcję działającą w drugą stronę, powodującą hamowanie diod, działa ona zgodnie z zamierzeniami bez żadnych zawieszeń.
Proszę o nakierowanie w znalezieniu błędu, oraz o wyrozumiałość, gdyż jest to jeden z moich pierwszych projektów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2015, o 14:46 
Offline
Moderator
Avatar użytkownika

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

krzynier napisał(a):
Proszę o nakierowanie w znalezieniu błędu

proszę

- powiedz po co używasz TIMER1_COMPB_vect ? ..... B ??? dlaczego ?

_________________
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: 21 lis 2015, o 15:14 
Offline
Nowy

Dołączył(a): 27 paź 2015
Posty: 4
Pomógł: 0

Przyznam, że nie wiem czemu użycie TIMER1_COMPB_vect mogłoby być przyczyną problemu. Taki był mój zamysł, uznałem że w wypadku mojego programu, użycie przerwania od Timera1 do sterowania paskiem diod jest najprostszym rozwiązaniem. Timer 2 mam już zajęty do obsługi wyświetlaczy siedmiosegmentowych. Dodam że działanie tego paska led przebiega zgodnie z oczekiwaniami, poza tym felernym przyspieszaniem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2015, o 15:30 
Offline
Użytkownik
Avatar użytkownika

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

mirekk36 napisał(a):
powiedz po co używasz TIMER1_COMPB_vect ? ..... B ??? dlaczego ?

Kol.Mirek nie pytał dlaczego TIMER1 wogóle, tylko dlaczego B a nie A

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2015, o 15:37 
Offline
Nowy

Dołączył(a): 27 paź 2015
Posty: 4
Pomógł: 0

Właściwie to zrobiłem to chyba z rozpędu, skopiowałem konfigurację rejestrów timera z innego programu i tak zostało:) Zmiana kanału B na kanał A nie przynosi rezultatów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2015, o 15:56 
Offline
Moderator
Avatar użytkownika

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

krzynier napisał(a):
Zmiana kanału B na kanał A nie przynosi rezultatów

A wiesz o co chodzi z tymi kanałami A i B ? ..... to pokaż po swoich zmianach teraz kod inicjalizacji twojego timera1 i kod przerwania

_________________
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: 21 lis 2015, o 16:09 
Offline
Nowy

Dołączył(a): 27 paź 2015
Posty: 4
Pomógł: 0

Być może nie do końca, nie mam zbytnio wprawy w czytaniu noty katalogowej, a najbardziej mylące są dla mnie opisy rejestrów oznaczone jako [...]register A czy [...] register B. Tak więc moja nowa inicjalizacja timera:

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


Poniżej przerwanie:

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: 21 lis 2015, o 16:21 
Offline
Moderator
Avatar użytkownika

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

No to teraz masz przynajmniej jeden problem rozwiązany (inicjalizacja przerwania jest OK) - czyli poprawnie użyte przerwanie w trybie CTC ;) .... Zatem możesz szukać już błędu spokojnie w innych częściach swojego kodu.


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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


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