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



Teraz jest 23 cze 2018, o 14:31


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 10 cze 2018, o 14:37 
Online
Nowy

Dołączył(a): 08 mar 2018
Posty: 3
Pomógł: 0

Witam
Chce wygenerować bardzo krótkie 2 impulsy na timerze chodzi mi o ok 1us a potem 1us przerwa i znowu 1us impuls. Stosując przerwanie niestety wyjście z obsługi przerwania trwa ponad 4us przy zmianie stanu na pinie wiec ten sposób odpada chyba że ktoś wie jak to rozwiązać za pomocą przerwania.
Zdecydowałem ze pobawię się flaga od przerwania nie wiem czy dobrze to rozumiem ale chce zrobić tak że gdy nastąpi przepełnienie to bit od flagi ma mi zerować pin wyjściowy. Nie znalazłem działających od razu przykładów w internecie wiec na ich podstawie stworzyłem coś swojego ale nadal nie działa. Stany na pinie sprawdzam analizatorem logicznym Poniżej kod może ktoś mnie nakieruje co źle robię.
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: 10 cze 2018, o 14:41 
Offline
Moderator
Avatar użytkownika

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

dla czasów typu 1us nie bierzesz w ogóle pod uwagę tego co się dzieje w asemblerze, jednak warto go liznąć panie kochany i umieć zajrzeć do pliku *.lss aby przeliczyć takty rozkazów w przerwaniu i po to aby się dowiedzieć co to jest PROLOG i EPILOG przerwania w asemblerze jak chodzi o język C

_________________
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: 10 cze 2018, o 14:50 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 06 mar 2015
Posty: 16
Pomógł: 0

Wg. mnie to przerwanie nie może zadziałać, ponieważ zakomentowałeś linijki 13 i 14.

_________________
Moja stronka http://www.avrboss.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2018, o 15:07 
Online
Nowy

Dołączył(a): 08 mar 2018
Posty: 3
Pomógł: 0

Co ma Pan na myśli że mam nie brać pod uwagę tego co się dzieje w assemblerze ?
Linijki mam za komentowane dlatego że na obsłudze przerwania minimalny czas uzyskałem 4,7us wiec za mało wtedy zacząłem czytać o fladze ale nadal nie wiem jak to zrobić. Preskaler mam ustawiony na 1024 na probe czy przerwanie od flagi w ogole chce działać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2018, o 16:34 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 336
Pomógł: 79

makdonald napisał(a):
Chce wygenerować bardzo krótkie 2 impulsy na timerze ... ok 1us

Dlaczego koniecznie na timerze? Przy tych czasach trwania impulsów to będzie dosyć kłopotliwe. Nie podałeś kluczowej informacji, jakie masz taktowanie mikrokontrolera, ale nawet zakładając maksymalne 16MHz, to tylko 16 taktów zegara, więc nie będzie łatwo.
makdonald napisał(a):
...chodzi mi o ok 1us a potem 1us przerwa i znowu 1us impuls...

... no a później jaka minimalna przerwa przed następnymi dwoma impulsami?
makdonald napisał(a):
może ktoś mnie nakieruje co źle robię
makdonald napisał(a):
może ktoś mnie nakieruje co źle robię

No właśnie kolega Mirek już napisał, jaki robisz błąd - nie bierzesz pod uwagę tego, że np. każda procedura obsługi przerwania trochę trwa. Samo wejście i powrót z procedury to ok. 8 taktów, do tego prolog i epilog, które zajmują minimum z 10 taktów zegara i już masz więcej niż 16 taktów. A gdzie miejsce na kod? A jak dodasz nieco kodu, to prolog i epilog mogą się wydłużyć, bo będzie trzeba więcej rejestrów odłożyć na stos. Jeśli piszesz procedurę obsługi przerwania w C, to może ona nie być zbyt optymalna... itd.

Ogólnie koncepcja rozwiązania jest nieodpowiednia z powodów, które podałem wyżej, dlatego Ci to nie działa. Zdecydowanie prościej byłoby to zrobić jako opóźnienie blokujące np. na kilku(nastu) instrukcjach NOP asemblera, czy nawet na _delay_us(). Oczywiście należałoby uwzględnić fakt, że wykonanie kodu związanego ze zmianą stanu pinu zajmie też kilka taktów. Robiąc to na timerze niewiele zyskasz, bo mikrokontroler i tak będzie zajęty obsługą przerwań.

Gdyby się bardzo uprzeć przy tym timerze, to być może udałoby się to zrobić, ale moim zdaniem raczej trzeba by wykorzystać sprzętowy generator z wykorzystaniem timera, włączyć go na czas tych dwóch impulsów, a później wyłączyć w procedurze obsługi drugiego przerwania, najlepiej napisanej w asemblerze, aby uzyskać maksymalną wydajność. Należy jednak wziąć także pod uwagę, że ewentualne inne przerwania używane w programie mogą pokrzyżować nasze plany, choćby ze względu na możliwe pewne opóźnienia w wykonywaniu przerwań spowodowane brakiem priorytetów przerwań i wywłaszczania w tych mikrokontrolerach.

_________________
Miksowanie kodu C i ASM przy użyciu GCC



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2018, o 17:03 
Online
Nowy

Dołączył(a): 08 mar 2018
Posty: 3
Pomógł: 0

Chyba się trochę nie zrozumieliśmy to że wejście i wyjście z obsługi przerwań trwa dużo dłużej niż potrzebne mi czasy to wiem i napisałem to na samym początku, po czym spytałem czy może ktoś zna jakiś magiczny sposób żeby to dało się zrobić (nie brałem pod uwagę wstawki z asemblera). Temat z obsługą przerwania uważam za zamknięty.
Dlatego wstawiłem kod z za komentowaną obsługa przerwania bo temat założyłem po to aby się dowiedzieć jak uzyskać efekt taki aby wykorzystując flagę od przerwania ona resetowała mi właśnie po ok 1us stan na pinie a nie wykorzystując obsługę przerwania. Jestem raczej laikiem w AVRach i dlatego pisze na tym forum.
Pacjent: Atmega32 na wewnętrznym taktowaniu 8 MHz
Nie upieram się na timer bo wiedziałem że bd problemy ale myślałem ze się uda.
Zrobiłem już tak jak kolega wyżej napisał najprostsze operacje na delayach i działa to powiedziałbym w granicach błędów.
Jednakże jeżeli ktoś ma czas i chęci opisać mi tutaj czy jest to realne zrobić takie czasy wykorzystując flagę z rejestru TIFR to byłbym zadowolony bo na delayach to tak trochę nie profesjonalnie mi się wydaje a poza tym w BBu Pan Mirek nie zachęca do stosowania funkcji delay.
Czekam na odp
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2018, o 17:27 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 1460
Pomógł: 71

Przede wszystkim to popatrz w PDFa jak wygląda stabilność wewnętrznego generatora.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2018, o 18:27 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 336
Pomógł: 79

Jak kolega micky napisał, dużej dokładności przy wewnętrznym oscylatorze RC raczej nie uzyskasz. Poza tym taktowanie 8MHz znacznie podnosi stopień trudności, nie jestem pewien czy napisanie ISR w asm pomoże. Jakaś szansa może jest z wykorzystaniem wewnętrznego generatora (pod warumkiem, że możesz wykorzystać PD7 zamiast PC5), ale to by wymagało dobrej znajomości AVR i być może zastosowania kilku trików, a napisałeś, że jesteś laikiem w AVRach. W tej sytuacji osobiście nie potrafię w kilku zdaniach wytłumaczyć Tobie, jak można spróbować to zrobić.

Nie napisałeś też jeszcze, co przed i po wygenerowaniu tych impulsów. Czy program będzie wykonywał jeszcze jakieś zadania? Czy będziesz korzystał z innych przerwań? To dość istotne kwestie decydujące o powodzeniu lub niepowodzeniu przedsięwzięcia.

Jeśli nie korzystasz z przerwań lub możesz je zablokować na czas generowania impulsów, najlepszym rozwiązaniem będzie jednak zrealizowanie opóźnień blokujących (time-wasting), tak jak napisałem wcześniej (o ile kolega Mirek na to pozwoli ;)). Moim skromnym zdaniem nie ma w tym nic nieprofesjonalnego przy tak krótkich opóźnieniach. Poza tym, jak już wspomniałem, programowa zmiana stanu pinu też zajmuje kilka taktów, więc przy 8MHz może nawet NOP-y nie będą potrzebne.

Na koniec dodam jeszcze, że rozwiązanie ze sprawdzaniem flagi w pętli głównej programu spowodowałoby najprawdopodobniej, że czasy impulsów będą mało powtarzalne (szczególnie przy taktowaniu 8MHz), a jeśli w pętli głównej dojdzie jeszcze jakiś kod, to rozwiązanie w ogóle nie zda egzaminu.

_________________
Miksowanie kodu C i ASM przy użyciu GCC



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2018, o 19:16 
Offline
Moderator
Avatar użytkownika

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

andrews napisał(a):
o ile kolega Mirek na to pozwoli

:lol: ... a co ja mam do pozwalania ;) ... to żeby nie używać delayów - to nie znaczy żeby sprowadzać problemy do absurdu ;) Kilka delayów do wygenerowania jakiejś krótkiej sekwencji impulsów i to jeszcze długości kilku us - to wręcz nawet nie można nazwać techniką blokującą ...

Poza tym zamiast tych delayów można (ale o tym chyba koledzy wyżej pisali) użyć właśnie timera tyle że nie w przerwaniu a w ten sposób aby za jego pomocą odmierzać te czasy no ale tu też - liczyć się będzie sposób taktowania ... i pomysł na taktowanie wewn. oscylatorem przy tak krótkich czasach i jeszcze wysokich wymagań co do tak krótkich czasów - to pomysł bardzo mało trafiony.

Toż od razu w jednym czy drugim wypadku myśli się w takiej sytuacji o zewn kwarcu - a w przypadku tak krótkich impulsów to jeszcze o kwarcu z większą częstotliwością - 16MHz to tak na początek bym wziął ;)

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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: tom_zas 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