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



Teraz jest 25 kwi 2026, o 09:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 3 mar 2015, o 22:21 
Offline
Nowy

Dołączył(a): 14 lip 2012
Posty: 16
Pomógł: 0

Witam,

Usilnie próbuję zinkrementować wartość zmiennej w przerwaniu od timera 0A, lecz z niewiadomych mi przyczyn dla mnie nie chce mi to zadziałać. Próbowałem już z volatile i bez przed definicją zmiennej. Środowisko WinAVR.

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


Samo przerwanie wywołuje się poprawnie, ponieważ zmianę stanu pinów widzę na analizatorze stanó logicznych.

Pozdrawiam,
Dragas



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 22:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 lut 2014
Posty: 68
Lokalizacja: Częstochowa
Pomógł: 3

Sei(); powinno znajdować się chyba w funkcji głównej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 22:32 
Offline
Nowy

Dołączył(a): 14 lip 2012
Posty: 16
Pomógł: 0

sei() jest w main'ie, pisałem, że przerwanie działa prawidłowo, tylko nie inkrementuje się timer0x w przerwaniu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 22:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Używanie "cli" i "sei" w ten sposób w przerwaniu jest zbędne, gdyż mikrokontrolery ATmega mają jednopoziomowy system przerwań, a więc już w momencie wejścia w procedurę obsługi przerwania, możliwość przyjmowania kolejnych przerwań pozostaje zablokowana, aż do ukończenia całej funkcji przerwania.

Zmienna wydaje się być modyfikowana poprawnie. Może sam odczyt powoduje problem - skąd wiesz że zmienna nie jest inkrementowana?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 22:39 
Offline
Moderator
Avatar użytkownika

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

po pierwsze polecenia cli() i sei() w ramach obsługi przerwania są bez sensu - wywal je.

po drugie po co inicjalizujesz zmienną globalną zerem ? timer0x = 0; ? - poczytaj sobie o zmiennych globalnych

po trzecie w języku nie podaje się specyfikatora volatile na zasadzie totolotka - czyli "może pomoże albo niepomoże", a w tym przykładzie OCZYWIŚCIE musi być - zakładając że korzystasz z tej zmiennej również w pętli głównej programu - no ale ... ale nie pokazałeś jak wygląda twoja główna funkcja programu ... a to tam pewnie masz pan babola

_________________
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: 3 mar 2015, o 22:39 
Offline
Nowy

Dołączył(a): 14 lip 2012
Posty: 16
Pomógł: 0

Jeśli dałem if'a z warunkiem (timer0x == 0) stan wyjścia się zmieniał, lecz kiedy dałem (timer0x > 0) lub 11 tam jak jest powyżej, to stan się już nie zmieniał na wyjściu.

Na chwilę obecną pętla główna jest pusta.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 22:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Rozumiem że nie masz debugera sprzętowego, ale rozwiązaniem jest zawsze UART dzięki któremu w prosty sposób możesz mieć podląd na co tylko chcesz np. na wartość zmiennej. Ewentualnie ustawienie jednego z portów jako wyjściowy, podłączenie do niego jednej lub kilku diod i bezpośrednie przypisanie np. "PORTA = timer0x;".

Pokaż kompletny program razem z funkcją główną i jej zawartością w niedziałającej wersji...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 22:51 
Offline
Nowy

Dołączył(a): 14 lip 2012
Posty: 16
Pomógł: 0

1. Układ wytrawiłem i polutowałęm w SMD prawie 2 lata temu, lecz naszła mnie myśl, aby to przerobić i dodać funkcje.
2. Nie mam przejściówki UART<-> USB pod ręką, mam wyprowadzoną tylko 1 diodę na PC1.

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 3 mar 2015, o 22:58 przez Dragas, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 22:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 lut 2014
Posty: 68
Lokalizacja: Częstochowa
Pomógł: 3

W przerwaniu w warunku masz za dużo jedno 'I' ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 22:58 
Offline
Nowy

Dołączył(a): 14 lip 2012
Posty: 16
Pomógł: 0

Poprawiłem, przy kopiowaniu pewnie wcisnąłem przypadkowo :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 22:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Ok w takim razie usuń sterowanie diodą w przerwaniu i w pętli głównej programu napisz "PORTC ^= !timer0x<<1;". Nie wiem czy masz coś podpięte do pozostałych pinów portu C stąd taka ostrożna konstrukcja. Jeżeli nic to śmiało możesz zapisać "PORTC = timer0x;".

Jeżeli dysponujesz analizatorem logicznym to możesz sprawdzić stan na wyjściu.

Odblokowałeś dwa źródła przerwań (TIMSK0 = (1<<2) | (1<<1);), a w kodzie masz tylko jedną procedurę obsługi do "COMPA", a gdzie "COMPB"...?
Możesz dopisać w kodzie: "ISR (BADISR_vect) {}" lub "ISR (TIMER0_COMPB_vect) {}", albo wyłączyć przerwanie "COMPB" (TIMSK0 = (1<<1);).


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 23:08 

Pomógł: 0

Włączasz nieobsługiwane przerwanie. Domyślny "bad_interrupt" handler skacze pod adres 0 pamięci, co w uproszczeniu, resetuje procek ;)

Kurcze. Ubiegli mnie jak się pdf ściągał ;)



Ostatnio edytowano 3 mar 2015, o 23:09 przez wwojtek, łącznie edytowano 1 raz

Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2015, o 23:09 
Offline
Nowy

Dołączył(a): 14 lip 2012
Posty: 16
Pomógł: 0

Tylko PORTC ^= !timer0x<<1; dał efekt takie
Obrazek

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

Problem rozwiązany!
Nie wiedziałem, że pomimo, że przerwanie teoretycznei działało, to brak innego przerwania mogło powodować ten problem.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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