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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 9 lip 2025, o 23:20


    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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 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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO