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.