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



Teraz jest 10 lut 2026, o 12:23


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 25 lis 2015, o 23:17 
Offline
Nowy

Dołączył(a): 01 lis 2014
Posty: 2
Pomógł: 0

Witam, na forum udzielam się pierwszy raz, zazwyczaj staram się dojść do rozwiązania problemu sam, jednak tym razem proszę o wyjaśnienie pewnej kwestii.
Chcę zbudować zapłon o regulowanym kącie wyprzedzenia do mojego motocykla. Użyłem Atmegi 8 na razie nie mam jeszcze oscylatora więc całość pędzi na 1 MHz (Wyliczone na 16MHz).
Piszę w Atmel Studio.
Do wykrywania położenia wału użyłem transoptora szczelinowego, atmega mierzy czas trwania 1/4 obrotu wału. Pomiar rozpoczyna się pół obrotu przed GMP.
Program który już napisałem działa tak:
1.Zmienne deklaracje, timer 1 tryb normalny, zezwolenie na przerwania od Input Capture i przepełnienia
2.Program w pętli głównej sprawdza flagę
3.Przy wystąpieniu przerwania od ICP program uruchamia timer (preskaler 1) oraz zmienia zbocze uruchamiające kolejne przerwanie
4.Przy wystąpieniu kolejnego przerwania od ICP (koniec pomiaru) program zapisuje wartość rejestru ICR1 do zmiennej, ustawia flagę wyk. pomiaru i zmienia zbocze uruchamiające kolejne przerwanie ICP.
5.Program sprawdza flagę, zeruje ją, wykonuje obliczenia i wartość czasu którą mikrokontroler ma czekać wpisuje do rejestru porównania OCR1A. Następnie włącza przerwanie od porównania OCR1A i wyłącza przerwanie od ICP
6.W przerwaniu od porównania OCR1A program wyłącza timer, wyłącza przerwania od porównania OCR1A, włącza przerwania od ICP oraz będzie rozłączał obwód cewki, na razie tylko zmienia stan diody.

Do sedna - wyłączenie przerwania od ICP po obliczeniach i włączenie go w przerwaniu od porównania OCR1A powoduje że to przerwanie nadal nie jest włączone. Skutkiem jest to że program wykonuje się tylko jeden raz. Rozwiązaniem jest nie wyłączanie przerwania ICP. Jednak zastanawiam się dlaczego tak się dzieje. Dlaczego program nie jest w stanie odblokować przerwania ICP w przerwaniu od porównania?
Możliwe że mój tok rozumowania jest błędny i inny czynnik wpływa na taką pracę programu

Jestem początkujący, byłbym wdzięczny za wszystkie uwagi c.d. kodu i jego działania.
Zamieszczam kod:

Cytuj:
#define F_CPU 1000000L <---- skoro kolega jest z nami na forum od 2014 roku to powinien wiedzieć że TEGO NIGDY NIE PISZE SIĘ w kodzie ... a szczególnie na tym forum nie prezentujemy takich kodów z tym wpisem - tępimy to ogniem i mieczem i proszę na przyszłość o tym pamiętać ok ? Jeśli kolega chce się z tym męczyć to proszę .... ale nie wklejać tego na tym forum - mirekk36



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: 26 lis 2015, o 20:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 wrz 2013
Posty: 47
Pomógł: 1

Proszę skasować post. Niechcący nie tu napisałem. Przepraszam

_________________
Złoty Szpadel od Pana Mirka! Dziękuję.



Ostatnio edytowano 26 lis 2015, o 21:37 przez norniiica, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lis 2015, o 21:06 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

bart1120 napisał(a):
Jestem początkujący, byłbym wdzięczny za wszystkie uwagi c.d. kodu i jego działania.
volatile uzywaj tylko dla zmiennych, które są używane zarówno przez funkcje obsługi przerwania i kod główny np. ilo_prz. Z kolei edge może być zmienną lokalną przerwania, ale wtedy należy dodać static, a właściwie to nie jest potrzebna bo możesz sprawdzać bit ICES1
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

Ten wzór jest błędny, bo powinno być mnożenie razy 65536, a to samo zrobi przesunięcie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Dragonus Cracovus: Biomagia



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

Dołączył(a): 01 lis 2014
Posty: 2
Pomógł: 0

Co dokładnie zmienia dopisanie tych liter, bo mniemam że określają one typ stałej jako unsigned long. Nie powinienem w takim razie zrobić tego dla wszystkich stałych? Co do mnożenia to zapewne literówka którą skopiowałem, a mnożenie kompilator powinien sam zoptymalizować jako przesunięcie bitowe, czyż nie?

Edit:
Dziękuję za uwagi dotyczące kodu.

Edit 2:
Czy w takim razie dzielnie i op. modulo w liście warunków też powinny być przez 65536?



Ostatnio edytowano 26 lis 2015, o 21:28 przez bart1120, łącznie edytowano 1 raz

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

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

bart1120 napisał(a):
czyż nie?

A jednak "czyż nie" ....

poczytaj sobie o tzw domyślnej promocji do int przez kompilator:
http://atnel.pl/domyslna-promocja-do-typu-int.html

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

Strefa czasowa: UTC + 1


Kto przegląda forum

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