??? 03/13/09 06:47 Read: times |
#163405 - keep interrupts short ... in time .. and more Responding to: ???'s previous message |
I suppose this explanation needs engsish skils, better than mine, but hope You will understand. So, see commented code below.
.equ port_e, 0xF901 .equ port_def_pgm, 0xF903 .equ alarm, 0x00 .equ count, 0x40 .equ LED_PORT, P1.0 ; i assume Your P1.0 can drive led. ;====================== ;Vector table ;====== usually this begins at addr 0, i dont know what is You micro, ;and why You start from 2000h ; .baseaddr equ 2000h .ext0vectoraddr equ baseaddr+3h .tim0vectoraddr equ baseaddr+0Bh .org baseaddr ljmp main .org ext0vectoraddr vectorex0_isr: ljmp ex0_isr .org tim0vectoraddr vectort0_isr: ljmp t0_isr ;....... ;....... other interrupts vector "LJMP"s ;===================== ;rellocatable code .org baseaddr+100h main: mov dptr, #port_def_pgm mov a, #128 movx @dptr, a mov dptr, #port_e mov a, #0xFF movx @dptr, a mov tmod,#0x01 clr tr0 clr tf0 mov th0,#0x00 mov tl0,#0x00 setb ex0 setb et0 setb ea setb it0 ;Falling Edge interrupt mov ip, #0 ;Timer0 is lower priority than ExtInt0 !!!think mov a, #0 loop: movx @dptr, a inc a jnb alarm,loop_1 ;NEW line setb LED_PORT ;NEW line loop_1: ljmp loop ;So You wait for inerrupts .... ;========= ex0_isr: push PSW ;!!!! allways do it push acc ;not needed - Your routine doesnt uses acc push dph ;same push dpl ;same mov count, #250 setb tr0 clr LED_PORT ;NEW line jmp ex0_isrend ;NEW line jnb alarm, * ;Without new lines - Now You stay here and wait timer0 ro set this bit. ;But You stay in interrupt with highest priority. Other interrups ;cant be called(hardware) until "reti" is executed. ;It is possible to make this workable, but is wrong practice. ;BTW, this routine doesnt make something usefull, i understand - ;this is excercise, AND this is main reason for troubles. ;My advise - light on some LED here, and do "reti". ; In main loop check "alarm" and turn off LED if settled. ;And - stayng here for time count* ex0_isrend: pop dpl ;not needed if not pushed pop dph ;same pop acc ;same POP PSW reti ;======== t0_isr: push PSW ;allways do it mov th0,#0x00 mov tl0,#0x00 ;not needed , timer interrupts just when tl=th=0 ;loading tl,th is needed when You plane shortest timer thicks . ;nex day, i suppose. ;here You need that "push"es- push ACC,DPL,DPH mov a, count movx @dptr, a ;????where is writen value of "count" djnz count, t0_end setb alarm ;If You want to stop timer (and interrupt), simply do "CLR TR0" ;here t0_end: ;here You need that "pop"s Pop PSW reti BTW, staying in EXT0_ISR and waiting is main error. Time between enter and exit (if program works, after changing IP priority reg.) is = count*Timer0interrupt_interval. And this is allmost ethernity. regards |
Topic | Author | Date |
Interrupts and timers | 01/01/70 00:00 | |
keep interrupts short ... in time .. and more | 01/01/70 00:00 | |
Thanks about the info | 01/01/70 00:00 | |
some thoughts | 01/01/70 00:00 | |
After a week of deep work with it![]() | 01/01/70 00:00 |