Witam Moze ktos spotkal sie z podobnym problemem, a mianowicie potrzebuje wykorzystac w moim ukladzie przerwania INT0 i INT1, niestety ale podprogram przerwania INT1 nie zostaje wykonany po podaniu odpowiedniego sygnalu. Procek to AVR 8515 (probowalem tez na ATmega8515 i takze brak reakcji) Zaznaczam ze wszystkie bity sa ustawione tak jak potrzeba, probowalem zmieniac aby przerwania byly wyzwalane od innego zbocza itp. i efekt ciagle taki sam ze INT0 dziala, a INT1 nie chce : (((
Uzywam kompilatora C - AVR Edit
Michal.
Didn't find your answer? Ask the community — no account required.
P
peters
Skoro wszystko jak potrzeba, to ja nie wiem co to moze byc. Cuda jakies chyba :)
peters
P
Piotrek Sz.
Michal snipped-for-privacy@poczta.onet.pl> napisał(a):
..
..
A my byśmy chcieli zobaczyć na własne oczy te ustawienia :-)
Pzdr. Piotrek Sz.
M
mi15
oto wycinek programu gdzie ustawiam warunki przerwania
SIGNAL(SIG_INTERRUPT0) { .... } i dla INT1 SIGNAL(SIG_INTERRUPT1) { ... } oba podprogramy sa prawie ze identyczne, zapalaja 4 lampy tyle ze jedno przerwanie powoduje zapalenie lamp w jedna strone, a drugie przerwanie lampy zapalaja sie kolejno w druga strone. Jeszcze raz zaznaczam ze INT 0 dziala i ma sie dobrze :((
nasuwa mi sie mysl czy czasem kompilator nie ma bledu !!!
J
J.F.
Na moj gust to niniejszym wlaczyles INT0, ale wylaczyles wszystkie inne .. nie ma sie co dziwic ze nie dzialaja ..
J.
P
Piotrek Sz.
I dziwisz się że masz tylko INT0.Przecierz sam ładujesz maskę dla INT1,a potem dla INT0 tym samym kasując dla INT1.W 2-giej lini brakuje "magicznago" symbolu "OR".
Pozdrawiam Piotrek Sz.
J
Jacek R. Radzikowski
I nie tylko w 2giej. We wszystkich linijkach gdzie modyfikujesz kilka razy ten sam rejestr, do drugiej i kolejnych modyfikacji ORuj wartosc rejestru z maska bitowa.
j.
P
Piotrek Sz.
..
A z tego niezbicie wynika że jesteś początkującym C-ownikiem :-) Jako ja:-)
Pzdr. Piotrek Sz.
M
mi15
o żesz qrw.... ale ze mnie lama : )))) nie wiedzialem ze trzeba wszystkie bity zmieniac w jednej linijce z ORami, uogólniając:
Wpisanie GIMSK=1<<INT0; powoduje ustawienie innych biow na zero??? zaraz zajrze do ksiazki
J
Jacek R. Radzikowski
Wpisuje do rejestru bajt z ustawionym tylko jednym bitem. Poprzednia wartosc jest zamazywana. Albo ORuj bity przy przypisaniu:
GIMSK=(1<<...) | (1<<...) | ...
albo dodaj ORa do kolejnych:
GIMSK=1<<...; /* nadpisanie GIMSK bajtem z ustawionym tylko jednym bitem */ GIMSK|=1<<...; /* ustawienie pojedynczego bitu bez zmiany wartosci pozostalych bitow w rejestrze */ GIMSK|=1<<...;
j.
M
mi15
pozostalych bitow w rejestrze */
Teraz juz kapuje : )))) Wielkie dzieki!!
J
J.F.
Na to radze uwazac - nie zawsze rejestr specjalny da sie odczytac..
J.
J
J.F.
Lama z cieba straszna :-)
A czemu mialoby dzialac inaczej ? To jest instrukcja PODSTAWIENIA.
P.S. W C sa struktury bitowe ..
J.
J
Jacek R. Radzikowski
Racja. Bezpieczniej bedzie przypisac w jednym podstawieniu. ATSD to porzadny kompilator powinien to zoptymalizowac do jednej operacji. Moze wiec dzialac nawet jesli rejestr nie daje sie czytac, ale na tym bym nie polegal przy pisaniu programu.
j.
P
Piotrek Sz.
No to żeby tak dopełnić formalności :) należy nadmienić że bity nie tylko się ustawia ale także kasuje i zmienia na przeciwny.Ciekawe jak z tym zagadnieniem kolega (autor postu) sobie z tym radzi ?
Pzdr. Piotrek Sz.
P
Piotr Wyderski
Rejestr maski przerwan to rejestr specjalnego przeznaczenia, kompilator nie ma prawa nawet o tym "pomyslec".
Pozdrawiam Piotr Wyderski
P
Piotr Wyderski
I tak i nie, tzn. standard nie okresla w ktorym miejscu zostanie przydzielone wskazane pole bitowe, wiec zapomnij o definiowaniu w ten sposob struktury rejestrow specjalnych. W tym zastosowaniu nie maja one _zadnego_ sensu. Poza tym patrzylem kiedys w jaki sposob kompilator (gcc) korzysta z pol bitowych -- zdisasemblowalem kod, popatrzylem, podnioslo mi sie cisnienie, przestalem korzystac z tego mechanizmu... :-)
Pozdrawiam Piotr Wyderski
W
Wojtek Kaniewski
ciekawe, co by wyszło po optymalizacji czegoś takiego:
for (;;) { PORTA = _BV(0); PORTA |= _BV(1); PORTA |= _BV(2); PORTA |= _BV(3); PORTA |= _BV(4); PORTA |= _BV(5); PORTA |= _BV(6); PORTA |= _BV(7); }
w.
M
mi15
Szczerze mowiac jestem troche poczatkujacym choc napisalem juz pare programow na rozne mikrokontrolery, problem polega na tym ze programuje od czasu do czasu i przewaznie w roznych jezykach. Np pisalem programy (ktore dzialaja choc sa pewnie w nich bledy) na TINY15 - asembler, PIC16F84 - asembler i C,
90s8515 - C, atmega8 - C, byly to przewaznie dosc proste programy, problem ktory tutaj poruszylem plega na tym ze zaczalem uzywac polecen z operatorami '<<' ktorych nie do konca rozumialem i tutaj wielkie dzieki dla wszystkich ktorzy przyczynili sie do tego ze teraz juz wiem o co chodzi : ) Zwykle uzywalem poprosu wpisu bajtu do rejestru typu: GIMSK = 0b00000011 lub '00000011'. W tym przypadku podpatrzylem pare cudzych programow i zastosowalem polecenia ktore inetrpetowalem na swoj sposob :))
Mam jeszcze problem z innym programem ale najpierw musze dokonczyc ten.
pozdrawiam serdecznie Michal S.
PS. ostatnio wzialem sie jeszcze za programowanie w VisualBasicu dla Excela, a na prace dyplomowa pisalem program w C++ Builder, tak wiec jak widzicie cos tam wiedzy mam ale zdecydowanie za malo doswiadczenia.
P
Piotrek Sz.
snipped-for-privacy@poczta.onet.pl napisał(a):
Jeśli Cię uraziłem to bardzo przepraszam ,nie było to moim zamiarem. Chciałem zwrócić tylko uwagę na zawiłości języka C (sam dopiero się "wgryzam") i jak to jedno małe poleconko może "anulować" nam ileśtam poprzedzających je poleceń.
Pozdrawiam Piotrek Sz. PS Ja również piszę w kilku językach i czasami mi się myli np. AmigaE(taaak jescze uzywam) z Clipperem czy FoxPro, lub asm dla 51 z asmem dla 680xx czy AVR ... :) Poprostu Wieża Babel ;-)
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.