Go4Expert

Go4Expert (http://www.go4expert.com/)
-   Assembly Language Programming (ALP) Forum (http://www.go4expert.com/forums/assembly-language-programming-forum/)
-   -   timer interrupt help (http://www.go4expert.com/forums/timer-interrupt-help-t9738/)

SENAN 3Apr2008 15:42

timer interrupt help
 
Hey
what im tryin to do is set up a timer to overflow every2 ms so this code will sample an ecg wave at 500Hz. Cant get my head around how to do this and any help would be greatly appreciated.

Thanks
Code:

$MOD52

        rd1 equ P0.0                  ;Read signal P0.0
        wr1 equ P0.1                  ;Write signal P0.1
        cs equ P0.2                  ;Chip Select P0.2
        intr equ P0.3                ;INTR signal P0.3

        adc_port EQU P2              ;ADC data pins P2
        adc_val EQU 30H              ;ADC read value stored here
       
        org 0H

start:                                        ;Start of Program
        acall conv                    ;Start ADC conversion
        acall read                                ;Read converted value
        mov P3,adc_val                ;Move the value to Port 3
        sjmp start                                ;Do it again

conv:                            ;Start of Conversion
        clr cs                        ;Make CS low
        clr wr1                        ;Make WR1 Low
        nop
        setb wr1              ;Make WR High
        setb cs                      ;Make CS high

wait:
        jb intr,wait                  ;Wait for INTR signal
        ret                          ;Conversion done

read:                            ;Read ADC value
        clr cs                        ;Make CS Low
        clr rd1                        ;Make RD1 Low
        mov a,adc_port                ;Read the converted value
        mov adc_val,a                ;Store it in local variable
        setb rd1                      ;Make RD1 High
        setb cs                      ;Make CS High
        ret                          ;Reading done

END


erislover 9Aug2008 07:00

Re: timer interrupt help
 
Timers are usually pretty complicated, loaded with features. For the most simple of uses, you will need to calculate how many clock cycles constitute two milliseconds. Depending on the processor, this might not be period*frequency. The 18F PICs, for example, operate at 1/4th the oscillator frequency. For a 32MHz oscillator, then, the PIC will operate at 8MHz. 0.002*8MHz is 16000 cycles. Choose a 16-bit timer, and you will need to load it with 0xFFFF - 16000 = 49535. Then it will overflow in 16000 counts, or 2 ms.

Simple idea with polled interrupts:

0) make sure the interrupt for this timer is not active. It should reset this way if your program isn't doing anything else you've not mentioned. If it is doing other things, be sure you're not using it for something else, or choose some other timer.
1) stop the timer. Load 2ms_count into the timer. Clear the interrupt flag. Start the timer. (check your datasheet for the exact order of operations.)
2) wait for overflow flag to be set. If not set, goto 2.
3) start ADC conversion. This usually takes some time, maybe you can get away with a small nop-loop.
4) read the value and do whatever with it.
5) goto 1.


All times are GMT +5.5. The time now is 12:48.