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



Teraz jest 18 gru 2024, o 18:41


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 
Autor Wiadomość
PostNapisane: 27 maja 2015, o 18:09 
Offline
Nowy

Dołączył(a): 18 kwi 2014
Posty: 24
Pomógł: 0

Witam. Chciałbym przedstawić problem a może pytanie.
W projekcie korzystam z 4 przerwań z czego:
1 jest wywoływane zawsze co 10 msekund. INT1
2 jest wywoływane co 250 msekund. INT0
3 jest wywoływane co 4 ms. Jest to pomiar długości impulsu za pomocą przerwania od przechwycenia. ICP
4 jest wywoływane co 4 ms. TIMER2 OVF



Sygnał który mierzę ma napewno stałą częstotliwość.
Jednak czasem na 500 pomiarów zdaży się, że zamiast poprawnego pomiaru mam go podwojonego. Zawsze większy dwa razy więc wskazuje to na , że przerwanie jest pomijane.

Cały problem rozwiązuje się gdy zezwole w każdej procedurze przerwania na globalne zezwoleniena nie. Sei() jednak to nieprofesjonalne.

Problem tkwi w tym, że dane o długości impulsu są bardzo ważne, gdyż steruje na podstawie nich pewnym urządzeniem.

Kod załącze jeśli będzie potrzebny, interesuje mnie wyjaśnienie takiego zjawiska!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2015, o 19:52 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Przerwanie od ICP ma najmniejszy priorytet z wymienionych przerwań, więc w przypadku gdy wszystkie zbiegną się w jednym momencie zostanie wykonane jako ostatnie. Jeżeli łączny czas wykonania wszystkich przerwań przekroczy 4ms to oczywiście nastąpi "zgubienie' zdarzenia ICP. Co prawda 4ms to bardzo długi czas (64k taktów@16MHz) ale co tam masz w procedurach obsługi przerwań to tylko Ty wiesz ;-)

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2015, o 19:56 
Offline
Nowy

Dołączył(a): 18 kwi 2014
Posty: 24
Pomógł: 0

Wiem, że istniałaby taka opcja jednak przeliczyłem czasy każdej obsługi przerwań i maksymalny czas jaki poświęcam na przerwanie to 6 usekund więc jest niemożliwe! aby tak się to przedłużyło. Jednak po dodaniu sei() wszystko działa prawidłowo, nie gubi przerwania.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2015, o 20:02 
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

Przyglądnij się konfiguracji INTx czy czasem nie ma wyzwalania poziomem.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2015, o 20:08 
Offline
Nowy

Dołączył(a): 18 kwi 2014
Posty: 24
Pomógł: 0

Zdarza się to czasem raz na 1000 pomiarów a czasem z siedem :(
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Projekt stoi przez to już dobre 2 miesiące.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2015, o 20:34 
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

Wypróbuj ustawienie bitu ICNC1: Input Capture Noise Canceler, ICR1 powinien być odczytywany na początku, a jeśli zmieniasz zbocze to dobrze byłoby zerować flagę przerwania ICF1

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2015, o 21:32 
Offline
Nowy

Dołączył(a): 18 kwi 2014
Posty: 24
Pomógł: 0

Wypróbuje ten bit. "ICR1 powinien być odczytywany na początku" co chciałeś przez to powiedzieć ? Reaguje tylko na jedno zbocze.

Dziwi mnie fakt, że po zezwoleniu na przerwania w przerwaniu wszystko śmiga :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2015, o 22:11 
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

Cytuj:
ICR1 powinien być odczytywany na początku" co chciałeś przez to powiedzieć ?

Na początku funkcji obsługi tego przerwania, wtedy nawet jak w trakcie wskoczy kolejny pomiar to wynik wcześniejszy będzie zachowany a aktualny będzie w ICR1.
Cytuj:
Dziwi mnie fakt, że po zezwoleniu na przerwania w przerwaniu wszystko śmiga

To by sugerowało to, że inne przerwania trwają za długo, ale jak sam piszesz tak nie jest.
Użycie sei na początku przerwania nie odblokowuje jednak przerwań najszybciej jak to możliwe. Jest tak ponieważ funkcja obsługi przerwania zawiera prolog, który można zobaczyć podglądając kod w asemblerze. Jeśli zależy nam na czasie zamiast ISR używa się ISR_NOBLOCK.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2015, o 07:50 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Krauser napisał(a):
To by sugerowało to, że inne przerwania trwają za długo, ale jak sam piszesz tak nie jest.

No właśnie. Jakoś trudno sobie wyobrazić inną przyczynę. Może w pętli głównej jest blokujący proces trwający >4ms wykonywany przy wyłączonych przerwaniach? Ale wtedy włączenie przerwań w ISRach raczej nic by nie dało. Może następuje niekontrolowane wyzerowanie flagi ICF1 zanim TIMER_CAPT_vect się wykona? I znów uwaga j.w.
Ja w takiej sytuacji podłączył bym analizatorek logiczny i popatrzył jak wykonują się przerwania.

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 maja 2015, o 22:26 
Offline
Nowy

Dołączył(a): 18 kwi 2014
Posty: 24
Pomógł: 0

Rozwiązano !
Wszystko przez instrukcje "zerowania" flagi TOV2.

TIFR |= ( 1 << TOV2 )
Ta operacja zeruje nam flage TOV2 ale też inne flagi w tym rejestrze, które przed tą operacją były ustawione.

TIFR &= ( 1 << TOV2 )
Ta operacja zeruje nam tylko i wyłącznie flage TOV2 nie wpływając wcale na pozostałe.

:)



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

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

Cytuj:
TIFR &= ( 1 << TOV2 )
Ta operacja zeruje nam tylko i wyłącznie flage TOV2 nie wpływając wcale na pozostałe.


Ta operacja nic nie robi .... :(

Kasowanie flag przerwań w AVR panie kochany to USTAWIANIE BITU .... czyli to: TIFR |= ( 1 << TOV2 ) (jest poprawne)

------------------------ [ Dodano po: 1 minucie ]

Konradev2 napisał(a):
Ta operacja zeruje nam flage TOV2 ale też inne flagi w tym rejestrze, które przed tą operacją były ustawione.

To już są twoje raczej mocne hmm jakby to nazwać żeby nie urazić - wymysły? .... operacja ta służy tylko i wyłącznie do ustawienia jednego bitu

_________________
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: 30 maja 2015, o 22:42 
Offline
Nowy

Dołączył(a): 18 kwi 2014
Posty: 24
Pomógł: 0

Jaaaaa. Odpisał mi sam Mirek :) Czuję się zaszczycony.

Mireczku zobaczmy co stanie się jeśli wykonam taką operacje:

TIFR |= ( 1 << TOV2 )

Stan Rejestru TIFR przed zerowaniem flagi TOV2:

0 1 1 0 0 0 0 0 Jak widać ustawione są flagi od: przechwycenia ICP i przepełnienia Timera2.

Chcemy wyzerować tylko flagę TOV2.

0 1 1 0 0 0 0 0 | 0 1 0 0 0 0 0 0 0 = 0 1 1 0 0 0 0 0

I do Rejestru TIFR wysyłamy teraz " 0 1 1 0 0 0 0 0 ". Flagi kasowane są 1 więc zostaną wyzerowanie obydwie flagi!

Stan Rejestru TIFR po zerowaniem flagi TOV2:

0 0 0 0 0 0 0 0

TIFR &= ( 1 << TOV2 )

Stan Rejestru TIFR przed zerowaniem flagi TOV2:

0 1 1 0 0 0 0 0 Jak widać ustawione są flagi od: przechwycenia ICP i przepełnienia Timera2.

Chcemy wyzerować tylko flagę TOV2.

0 1 1 0 0 0 0 0 & 0 1 0 0 0 0 0 0 0 = 0 1 0 0 0 0 0 0

Do Rejestru TIFR wysyłamy teraz " 0 1 0 0 0 0 0 0 ". Flagi kasowane są 1 więc zostanie wyzerowana tylko jedna flaga-> TOV2

Stan Rejestru TIFR po zerowaniem flagi TOV2:

0 0 1 0 0 0 0 0



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 maja 2015, o 23:13 
Offline
Moderator
Avatar użytkownika

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

Cytuj:
I do Rejestru TIFR wysyłamy teraz " 0 1 1 0 0 0 0 0 ". Flagi kasowane są 1 więc zostaną wyzerowanie obydwie flagi!

Mylisz się panie kolego i to mocno ;) bo tobie się wydaje - że wszystkie czynności są realizowane po kolei - tymczasem to BYŁBY TOTALNY BEZSENS. Pomijam już, że jest to tłumaczone na jedną instrukcję asemblera sbi ;) ale też nie do końca pewnie jeszcze rozumiesz język C - jak to działa od środka, a więc panie kochany zobacz:

Kod:
TIFR |= ( 1 << TOV2 )


to znaczy ni mniej ni więcej tylko to:

Kod:
TIFR = ( TIFR | ( 1 << TOV2 ) );


pomyśl teraz .... o TYCH NIEBIESKICH NAWIASACH - to jest WYRAŻENIE ! i ono NAJPIERW MUSI BYĆ OBLICZONE - żeby wynik mógł trafić do rejestru TIFR, a więc w trakcie realizacji tego całego wyrażenia - rejestr TIFR poza tym, że został odczytany - nie BYŁBY NAWET RUSZONY ! .... tylko wartość odczytana byłaby wzięta pod uwagę, a ty sobie wymyślasz że gdzieś tam po drodze coś trafi do rejestru.

A teraz uważaj - zaglądaj do pliku *.lss po kompilacji i wszędzie gdzie korzystasz z takich wyrażeń do ustawiania czy kasowania pojedynczych bitów jak np:

Kod:
reg |= (1<<bit);

reg &= ~(1<<bit);


to są one tłumaczone na pojedyncze (i atomowe) rozkazy asemblera!

Kod:
sbi

cbi


zapoznaj się z tymi rozkazami w asemblerze .....

Nieco inaczej jest gdy w C chcemy zrealizować jednoczesną zmianę KILKU bitów np:

Kod:
reg |= (1<<bit1) | (1<<bit2)


wtedy w asemblerze będzie to mniej więcej (tylko obrazowo ci pokażę)

Kod:
temp = reg

temp |= (1<<bit1) | (1<<bit2)

reg = temp


widzisz ? tu też po drodze nie zmienią się inne bity - więc nie wymyślaj historii ;) ... tylko zawsze podglądaj asemblera ok ?

_________________
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: 30 maja 2015, o 23:31 
Offline
Nowy

Dołączył(a): 18 kwi 2014
Posty: 24
Pomógł: 0

Może mój kompilator to stary dziadek :D Zobacz, użycie takiej operacji:

TIFR = ( TIFR | ( 1 << TOV2 ) )

gdziekolwiek powoduje u mnie taki kod assemblera:

127a: 88 b7 in r24, 0x38 ; 56
127c: 80 74 ori r24, 0x40 ; 64
127e: 88 bf out 0x38, r24 ; 56


A użycie takiej operacji:

TIFR = ( TIFR & ( 1 << TOV2 ) )

gdziekolwiek powoduje u mnie taki kod assemblera:

127a: 88 b7 in r24, 0x38 ; 56
127c: 80 74 andi r24, 0x40 ; 64
127e: 88 bf out 0x38, r24 ; 56


I urządzenie nie "gubi" już żadnego przerwania, bo nie jest zerowana ta flaga, która nie powinna być zerowana.

Jestem także świadom, że najpierw pobieramy wartość z rejestru do jakiegoś rejestru, robimy operacje na tej wartości i potem odsyłamy ją z powrotem do rejestru, z którego ją pobraliśmy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 maja 2015, o 23:47 
Offline
Moderator
Avatar użytkownika

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

Konradev2 napisał(a):
Mireczku co do sbi cbi to nie byłby taki pewny.

ok no nie mówię że w KAŻDYM wypadku - dlatego podałem ci to drugie rozwiązanie i właśnie ono tu wystąpiło ;)

co zaś się tyczy tej twojej wypowiedzi, to jak mówiłem robisz OGROMNY błąd :(
Konradev2 napisał(a):
A użycie takiej operacji:

TIFR = ( TIFR & ( 1 << TOV2 ) )

gdziekolwiek powoduje u mnie taki kod assemblera:

127a: 88 b7 in r24, 0x38 ; 56
127c: 80 74 andi r24, 0x40 ; 64
127e: 88 bf out 0x38, r24 ; 56


sam sobie przeanalizuj ten kod ale zanim to zrobisz zajrzyj do noty PDF procka:
Obrazek

więc PO PIERWSZE nie można skasować flagi w AVR przez zapis ZERA do bitu flagi - trzeba USTAWIĆ TEN BIT ! rozumiesz ? ;) wpisać tam JEDYNKĘ

ale ok - ty tak w ogóle tą operacją
TIFR = ( TIFR & ( 1 << TOV2 ) )

robisz niestety cuda na kiju i TYLKO WYDAJE ci się, że w ogóle zerujesz ten bit :(

0b0x010101 - odczytany TIFR
0b01000000 AND - wartość 0x40
-----------------------------------
0b0x000000 -----> widzisz co trafi do TIFR u ciebie ? ty zamiast próbować (wg twojego niby pomysłu) skasować bit TOV2 .... to ty go pozostawiasz takim jakim był - a za to próbujesz zerować inne bity w tym rejestrze. Ale niestety ZONK - ta operacja nie przyniesie w AVR skutku :( bo programowo NIE WYZERUJESZ tych pozostałych bitów za pomocą maski 0b01000000 (którą sobie stworzyłeś (1<<TOV2) .....

teraz jaśniej ?

------------------------ [ Dodano po: 1 minucie ]

Konradev2 napisał(a):
I urządzenie nie "gubi" już żadnego przerwania, bo nie jest zerowana ta flaga, która nie powinna być zerowana.

Zatem to już tylko twoje hmmm jakby to powiedzieć subiektywne wrażenie - tzn ja broń boże nie oceniam czy gubi czy nie - w ogóle w to nie wnikam bo nie byłem w stanie śledzić tematu ale jak zauważyłem taki PODSTAWOWY błąd hmm DWA błędy jakie robisz - jeden z operacjami logicznymi a drugi z pomysłem na "ala" zerowanie flagi - które jej nie zeruje tylko maskuje ;) no to zwróciłem uwagę

_________________
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: 30 maja 2015, o 23:57 
Offline
Nowy

Dołączył(a): 18 kwi 2014
Posty: 24
Pomógł: 0

Jestem w pełni świadom tego, że flagi zeruje się poprzez wpisanie do niej 1! To wiem.

Cytuj:
0b01000000 -----> widzisz co trafi do TIFR u ciebie ? ty zamiast próbować (wg twojego niby pomysłu) skasować bit TOV2 .... to ty go pozostawiasz takim jakim był - a za to próbujesz zerować inne bity w tym rejestrze.


Nie chcę zerować innych bitów w tym rejestrze. Chcę wyzerować flagę TOV2 i jeśli bit ten był " 1 " to po operacji AND z jedynką także będzie " 1 ". Ta " 1 " zostanie wysłana do TIFR i wpisując " 1 " na tą " 1 " która już była dokonam wyzerowania flagi.


Za przeproszeniem sprawdzałem na każdym etapie działania takiej operacji co się dzieje ze zmiennymi i rejestrami i wszystko jest tak jak ma być :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2015, o 00:09 
Offline
Moderator
Avatar użytkownika

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

Konradev2 napisał(a):
i jeśli bit ten był " 1 " to po operacji AND z jedynką także będzie " 1 "

A jeśli nie był jedynką ?

Coś kolega nie rozumie jakby (tak mi się wydaje) operacji logicznych w tym wypadku.... Bo czym się różni wg ciebie to

andi r24, 0x40

od

ori r24, 0x40

????

------------------------ [ Dodano po: 1 minucie ]

Cytuj:
Za przeproszeniem sprawdzałem na każdym etapie działania takiej operacji co się dzieje ze zmiennymi i rejestrami i wszystko jest tak jak ma być

Jeszcze raz mówię - absolutnie nie wnikam w to czy tobie program działa czy nie - bo nie śledziłem wątku i nie mam zielonego pojęcia uważam tylko - że jeśli akurat niby pomogło

andi r24, 0x40

bo nie działało z

ori r24, 0x40

to jak widzisz wygląda to niestety na PLACEBO

_________________
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: 31 maja 2015, o 00:23 
Offline
Nowy

Dołączył(a): 18 kwi 2014
Posty: 24
Pomógł: 0

Wykonując to:

TIFR = ( TIFR | ( 1 << TOV2 ) )

0 1 1 0 0 0 0 0 <- stan rejestru TIFR przed zerowaniem flagi TOV2:
| 0 1 0 0 0 0 0 0
0 1 1 0 0 0 0 0 <- nie mógłbym wysłać tego do TIFR bo flagi są zerowane " 1 " a tu jedynki mam na TOV2 i ICF1. Wyzerowałoby mi OBYDWIE te flagi.

Wykonując to:

TIFR = ( TIFR & ( 1 << TOV2 ) )

0 1 1 0 0 0 0 0 <- stan rejestru TIFR przed zerowaniem flagi TOV2:
& 0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0 <- to mógłbym wysłać do TIFR bo flagi są zerowane " 1 " a tu jedynkę mam na TOV2.
Wyzeruje mi tylko flagę TOV2.



Puenta!!
ORI spowodowałoby przeniesienie jedynki z innej flagi, która już jest w TIFR do danej wysyłanej na TIFR, którą zeruje poszczególne flagi( a chcę zerować tylko jedną, wybraną flagę ) .

Może się nie rozumiemy, albo ja tak ciężko tłumaczę :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2015, o 00:38 
Offline
Moderator
Avatar użytkownika

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

Kurczę no i masz rację .... mnie zgubiło to sbi i cli (ale tak najczęściej jest w przypadku odwoływania się do portów) .... a w przypadku FLAG masz CAŁKOWITĄ rację - że nie można zrobić

reg |= (1<<flag);

masakra ;) że na to nie zwróciłem uwagi teraz i w ogóle ostatnimi czasy - a kiedyś sam z tym walczyłem, i dopiero teraz sobie przypomniałem jak się to powinno prawidłowo robić, podam ci jeszcze inny sposób, który przy okazji zaoszczędzi jednej instrukcji asemblerowej ;) bo nie trzeba wczytywać zawartości rejestru flag ;) zobacz

TIFR = (1<<TOV2);

sprawdź proszę ;)

_________________
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: 31 maja 2015, o 00:44 
Offline
Nowy

Dołączył(a): 18 kwi 2014
Posty: 24
Pomógł: 0

Nie przejmuj się :) Ważne, że osiągneliśmy cel :)

A czy przypadkiem to:

TIFR = (1<<TOV2);

nie USTAWI mi flagi TOV2 czyli, że wywoła przerwanie z poziomu programu, i czy w ogóle w AVR można wywołać przerwanie poprzez ręczne ustawienie flagi ?


Ogólnie czuje się zaszczycony :) rozmawiać z takim konstruktorem!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2015, o 00:50 
Offline
Moderator
Avatar użytkownika

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

Konradev2 napisał(a):
A czy przypadkiem to:

TIFR = (1<<TOV2);

nie USTAWI mi flagi TOV2


No zobacz teraz masz idealnie zgodnie z notą PDF, wrzucamy JEDYNKĘ tylko do wybranego bitu, czyli prawidłowo kasujemy flagę. Wpisywane zera są IGNOROWANE, więc nie ruszą pozostałych flag ;)

Konradev2 napisał(a):
czyli, że wywoła przerwanie z poziomu programu

No nie wywoła bo zgodnie z cytatem wyżej - właśnie ta JEDYNKA SKASUJE tą flagę - czyli zrobi to samo co wcześniejsze

andi r24, 0x40

o ile w rejestrze była wcześniej jedynka (czyli jak mówię - nie potrzeba wczytywać nawet zawartości rejestru tylko ŁUP! walnąć jedynką w wybrany bit a w pozostałe walnąć zera, które nie ruszą innych flag)

Konradev2 napisał(a):
z takim konstruktorem!

Weź przestań - zupełny amator jestem ;) ale lubię to co robię.

------------------------ [ Dodano po: 2 minutach ]

No i ja też się cieszę, że ta dyskusja wyniknęła - bo i mi się przypomniało .... a tak ? przecież nawet ostatnio w poradniku mówiłem o kasowaniu flagi z operatorem |= ..... wprawdzie w prostych przypadkach gdy nie ma takiego zagrożenia - że występuje wiele przerwań, które jeszcze muszą się nie blokować - to nic się nie stanie .... Nie mniej jednak warto sobie wbić do głowy - jak prawidłowo te flagi kasować więc i dla mnie to korzystnie wpłynie na REFRESH w mojej pamięci (ulotnej) jak widać :lol:

_________________
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: 31 maja 2015, o 00:54 
Offline
Nowy

Dołączył(a): 18 kwi 2014
Posty: 24
Pomógł: 0

Czyli flagi można tylko kasować. Ok. Także rozwiązano. Rozwiązanie problemu niech zostanie dla potomnych, bo natrafią na taki problem, gwarantuję :D

Najważniejsza jest masa pomysłów i oczywiście CZAS. Także Mirku czekam na kolejne poradniki :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2015, o 01:29 
Offline
Moderator
Avatar użytkownika

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

Tak na podparcie moich słów w razie czego - też dla obserwatorów tej dyskusji:

http://www.atmel.com/webdoc/AVRLibcRefe ... tbits.html

Konradev2 napisał(a):
i czy w ogóle w AVR można wywołać przerwanie poprzez ręczne ustawienie flagi ?

Za pomocą tych flag to chyba nie - to są sprzętowo ustawiane flagi a programowo można je tylko kasować poprzez zapis tej nieszczęsnej jedynki w sposób opisany powyżej ;)

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

Strefa czasowa: UTC + 1


Kto przegląda forum

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