8052 i dziwne zachowanie przy przerwaniach. ( TUSB3210 )

Feb 27, 2005 11 Replies

witam. uzywam ukladu TUSB3210 firmy TI. narazie nie konfigurowalem zadnych endpointow itp, tylko pracuje to jako zwykly 8052. no i mam powazny problem z przerwaniami.



uzywam kompilatora keil uvision3 7.20.



napisalem program BEZ PRZERWAN, ktory odmierza mi czas 1s. wyglada to tak:



int i=0; void main(void) { TMOD = 0x01; //timer0 - tryb1 16bit timer TF0 = 0; //kasowanie bitu przepelnienia timer0 TR0 =1; //start timer0



while(1) { if(TF0) { i+=1; TF0=0; //kasuj flage przepelnienia TH0 = 0x3C; //50000 cykli do przepelnienia TL0 = 0xB0; if(i>19) { i=0; P0= ~P0; //zmien stan diod na przeciwny } } } }



wszystko dziala jak trzeba. przy kwarcu 12MHz stan portu zmienia sie co ~1s.



nastepnie napisalem program, ktory mialby zachowywac sie tak samo, ale uzywac przerwan. jego kod wyglada tak:



int i=0,k=0;


void licznik(void) interrupt 1 //przerwanie 0 { TH0 = 0x3C; //timer bedzie zliczal od 15535 TL0 = 0xB0; //czyli zostanie rowno 50000 cykli do przepelnienia i+=1; }



void main(void) {



TMOD = 0x01; //timer0 - tryb1 16bit timer TF0 = 0; //kasowanie bitu przepelnienia timer0 ET0 = 1; //wlaczenie przerwania przepelnienia timer0 EA = 1; //wlaczenie przerwan TR0 =1; //start timer0



while(1) { if (i>19) { i=0; k+=1; if (k>1000) { k=0; P0= ~P0; //zgas/zapal diody } } } }



no i tu jest problem. zeby uzyskac czas zmiany stanu portu P0 okolo 1s musze "zwolnic" dzialanie ukladu okolo 1000 razy ( zmienna k ) w stosunku do poprzedniego programu. jest to dla mnie calkowicie nielogiczne. co smieszniejsze na symulatorze program dziala poprawnie bez zmiennej k. problemy sa tylko po wgraniu do ukladu.



nie wiem gdzie szukac bledu.



moze ma ktos jakies pomysly ?



pozdrawiam



ps. tak - probowalem kasowac flage TF0 w procedurze obslugi przerwania. bez zmian.


U¿ytkownik "sawic" <sawic snipped-for-privacy@wytnij.to.poczta.onet.pl> napisa³ w wiadomo¶ci news:cvt839$39e$ snipped-for-privacy@news.onet.pl

Grypa mnie ³amie, wiêc nie chce mi siê my¶leæ dlaczego akurat 1000 razy. Sprawd¼ jaki skutek da:

volatile int i=0; volatile int k=0;

zadnych zmian. program dalej zachowuje sie tak samo. odnosnie wartosci 1000 to jest to na oko. moze 1024 ? a wtedy juz by cos moglo znaczyc. w symulatorze dziala dobrze bez zmiennej k, a wiec podejrzewam ze sam uklad moze wadliwie funkcjonowac, co jest malo prawdopodobne, ale moze jednak.

czy ktos wogole probowal cos zdzialac z tym ukladem ? bo mi juz naprawde skonczyly sie pomysly i nie wiem co dalej robic. chcialbym podzialac jakies ciekawsze rzezcy na nim, ale raczej nie moge zaczac, skoro z taka proscizna nie moge sie uporac.

pozdrawiam

wylacz optymalizacje kodu przy kompilacji; powinno pomoc

pozdrawiam Artur

a wstaw tu P0= ~P0; //zgas/zapal diody

i zobacz oscyloskopem - tak czesto przerwania lataja czy klopot jest dalsza czescia ?

a potem to bym potem wsadzil P0=i ;

J.

Sun, 27 Feb 2005 23:12:08 +0100, na pl.misc.elektronika, sawic napisał(a):

W tusb3210 IMHO rzeczywiście jest coś inaczej. Ja miałem jeszcze "lepiej", przerwanie T0 w ogóle nie chciało ruszyć. Ten sam testowy prosty programik załadowany do zwykłego 8052 chodził jak najbardziej prawidłowo. Ale potem odłożyłem temat i do dziś nie wiem co poprawić.

ArturVF500 napisał(a):

w keilu mozna ustawic optymalizacje ze wzgledu na rozmiar albo predkosc. w obu przypadkach program dalej dziala nie tak.

napisalem program w asm, gdzie juz nie mozna nic pomylic i dalej jest zle, czyli wina lezy po stronie mojego ukladu. choc to nadal dziwne bo bez przerwan zachowuje sie jak nalezy.

pozdrawiam

Jurek Szczesiul napisał(a):

ehhh no chyba i ja tak bede musial zrobic. tzn do mojego projektu przerwania nie sa mi potrzebne, ale poprostu chcialem zeby to dzialalo.

pozdrawiam

nie mam za bardzo dostepu do oscyloskopu, ale sprawdzalem juz to i zalatwiam ten problem w inny sposob.

gdy nie uzyje zmiennej k to diody sie jakby ciagle palily, ale przy szybkim machaniu calym ukladzikiem jestem w stanie powiedziec ze migaja. czyli 50000 cykli timera * 20 jeszcze moge zobaczyc. gdy zmiane stanu portu wrzuce do procedury obslugi przerwania, to nie wazne jak szybko macham calym ukladem, nie zauwazam migania diodami. wiec przerwanie wystepuje za czesto. troche ta metoda niezbyt, no ale dzielac liczbe przerwan przez 1000 ( caly czas mnie zastanawia czy nie 1024 )moge z cala pewnoscia stwierdzic ze przerwania wystepuja za czesto ;) a nie powinny.

pozdrawiam

dobra panowie problem rozwiazany. lojalnie informuje co i jak bo moze sie komus przydac.

gdy ustawia sie przerwania i tryb pracy licznika wystarczy dopisac IE=0; i juz wszystko dziala tak jak dzialac powinno.

oczywiscie jest to bez sensu bo:

-rejestr IE jest 0 gdy wlaczamy uklad,

-ustawienie bitow EA i ET0 w rejestrze IE jest jednoznaczne z tym ze NIC nie powinno zaklocic dzialania przerwania T0, a jednak ....

w kazdym razie: IE=0; ET0 = 1; //wlaczenie przerwania przepelnienia timer0 EA = 1; //wlaczenie przerwan TR0 =1; //start timer0

i juz wszystko ok.

moze komus tym pomoge.

pozdrawiam

To jest C .. poki nie zajrzysz w wydruk z kompilatora, a lepiej w zawartosc pamieci kostki to sie nie dowiesz co tam sie ustawia a co nie :-) Jaki to kompilator ?

Ale to nie musi byc zaklocenie przerwania T0. Byc moze obslugujesz przerwanie zewnetrzne IE0 ktore ciagle sie zglasza. Teraz tylko pytanie .. wyzerowane bajty 3-10, i po zgloszeniu przerwania mamy 8 nop i trafiamy na jmp do twojej procedury ? Czy kompilator kompletnie zwariowal i wsadzil tam skok sam.

Na pewno sie ktos trafi.

J.

kompilator to keil uvison3 7.20 patrzylem w kod asm i nic tam nie bylo odnosnie rejestru IE. kompilator tego nei ruszal. w desperacji napisalem program w asm gdzie nic nie moglo sie dziac bez mojej wiedzy i dalej nie dzialalo tak jak powinno. przeczytalem specyfikacje ukladu i jak byk jest napisane ze rejestr IE jest rowny 0 w momencie wlaczenia zasilania.

wiec jest to wina ukladu, badz producenta w specyfikacji.

fakt faktem dziala i cieszy mnie ten fakt.

pozdrawiam

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required