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



Teraz jest 8 lut 2025, o 00:10


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 20 sty 2013, o 12:37 
Offline
Nowy

Dołączył(a): 20 sty 2013
Posty: 12
Pomógł: 0

Witam wszystkich serdecznie,

Dzisiaj pojawiłem się po raz pierwszy na forum więc wszystkich forumowiczów i pozytywnie zakręconych pasjonatów 8-bitowców pozdrawiam :D

Od wczoraj walczę z prostym programikiem, który ma służyć do nauki i zapoznania się sterowaniem serwem modelarskim przy pomocy potencjometru. Zanim pokażę kod na którym działam, powiem tylko w czym problem. Otóż gdy pobieram wartość rejestru ADCH w pętli nieskończonej w main() to wszystko działa i serwo zmienia swoje ustawienie. Jednak gdy chcę dokonywać odczytu tej wartości w procedurze obsługi przerwania, to kicha. Wygląda to tak jakby procesor w ogóle nie wchodził do tej procedury (co unaocznia mi m.in. brak zaświecenia się diody LED gdyż specjalnie do celów diagnostycznych wstawiłem kod włączający diodę gdy tylko procedura ISR() zostanie uruchomiona).

Oto kod:

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


Gdzie robię błąd? Przeglądałem notę katalogową i nie mogę znaleźć jakiegoś dodatkowego warunku by przerwanie zadziałało.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2013, o 13:22 
Offline
Użytkownik

Dołączył(a): 30 gru 2012
Posty: 49
Pomógł: 0

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

Na twoim miejscu zamiast tego utworzyłbym jakąś zmienną globalną do której przypisana jest wartość jeśli pojawi się przerwanie. Następnie w main-e w zależności jaka wartość ma zmienna ustawiłbym świecenie lub gaszenie diody.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2013, o 13:39 
Offline
Użytkownik

Dołączył(a): 26 lip 2012
Posty: 291
Lokalizacja: okolice Opola
Pomógł: 20

Wywal to z pętli while(1):
Kod:
ADCvalue = ADCH;


ponieważ teraz cały czas odczytujesz z ADCH a ma być odczytywane tylko w przerwaniu, reszta wygląda ok.

------------------------ [ Dodano po: 3 minutach ]

Oraz pierwszy start conversion, ten przed sei() usuń.

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

Jeszcze jedno z przerwania usuń start conversion,, bo działasz w trybie free running więc tylko raz startujesz i później tylko w przerwaniu odczytujesz oraz ustawiasz diode.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2013, o 14:12 
Offline
Nowy

Dołączył(a): 20 sty 2013
Posty: 12
Pomógł: 0

@KBCH
To akurat nie powinno mieć wpływu :) Ale w razie czego ustawiłem zmienną globalną volatile do obsługi sprawdzenia wejścia w ISR() i nic. Dioda się nie zaświeciła....

@krafin
Jak pewnie zauważyłeś po komentarzu w kodzie, ta wstawka z pętli głównej to działający wariant programu. Jak ją zakomentuję to wtedy serwo nie reaguje na potencjometr.
A te dodatkowe wstawki kodu - start conversion - to już rozpaczliwe próby zrobienia czegokolwiek by przerwanie zadziałało... :oops:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2013, o 16:07 
Offline
Nowy

Dołączył(a): 20 sty 2013
Posty: 12
Pomógł: 0

Uwaga - problem już rozwiązany. Błędu w kodzie właściwie nie było, ale procesor obsługując zbyt często przerwanie Timer2 (taktowanie miałem ustawione na 1MHz) nie mógł zająć się obsługą przerwania o niższym priorytecie (ADC). Po zmianie częstotliwości taktowania na wyższe (8MHz) i odpowiednim do tego ustawieniu prescalerów, już program wchodził w obsługę przerwania ADC.

Dzięki wszystkim za chęć pomocy:)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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