PDA

View Full Version : DT-ints-18, How to ...



iw2fvo
- 6th January 2014, 08:14
Good Day to all of you in the forum,

I will like to have some direction on how to generate an interrupt ( used to call up a subroutine ) every 10 ms.
I will like to know how to set_up the system to get interrupts at a desired period
I am using PICbasic pro 2.50 and DT-ints-18. Pic is 18f4523 running at 40 MHz.
Thanks in advance for any help.
Ambrogio

HenrikOlsson
- 6th January 2014, 09:01
Hi,
Have you looked at the examples provided by Darrel on his site where you downloaded the DT-Ints files?
May I suggest you use this one (http://darreltaylor.com/DT_INTS-18/blinky.html) as a starting point. The example lets TMR1 free-run so the interrupt triggers at a given frequency (each time TMR1 overflows).

To change the frequency you reload the timer with a specific value each interrupt, so that it starts from a value other than zero.

See if you can get that example to work as is for starters.

/Henrik.

Acetronics2
- 6th January 2014, 12:30
Hi,

Steve Monfette ... aka DJ KeeWee ... aka Mr E ...
published here ( 2004 ) a phase control dimmer project where everything was shown ...

don't remember if using DT Interrupts ... but working !!!

the code ...
http://www.picbasic.ru/_fr/3/LampDim.bas

Alain

iw2fvo
- 6th January 2014, 16:34
Thanks Heirik and Acetronics2.
I will go on with your indications.
My antivirus does not allow to me to open the following :
http://www.picbasic.ru/_fr/3/LampDim.bas
Any possibility to have the files posted to me ?
Thanks,
Ambrogio
[email protected]

mackrackit
- 6th January 2014, 16:37
Right click and save as ?

iw2fvo
- 6th January 2014, 20:46
The problem is that my antivirus does not allow me to enter that link.
Thanks
Ambrogio

mackrackit
- 6th January 2014, 20:53
Will this work for you?

7188

iw2fvo
- 6th January 2014, 20:54
I have loaded the program as indicated .
No errors displayed.
I am using pbp 2.50, picf184523 @ 40 MHz speed.
I have a square wave output at porta.4 and 100 msec period ( 50 msec high and 50 msec low ).
Where does the 100 msec come from ?
How could I set different periods ?
The program is attached here.
Thanks
Ambrogio

'HSPLL OSCILLATOR HAS BEEN DEFINED IN THE PBP FOLDER > 18F4523 FILE

DEFINE OSC 40
LED1 VAR PORTA.4
INCLUDE "DT_INTS-18.bas" ' Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ' Include if using PBP interrupts

ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR1_INT, _ToggleLED1, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM

T1CON = $31 ; Prescaler = 8, TMR1ON
@ INT_ENABLE TMR1_INT ; enable Timer 1 interrupts

Main:
PAUSE 1
GOTO Main

'---[TMR1 - interrupt handler]--------------------------------------------------
ToggleLED1:
TOGGLE LED1
@ INT_RETURN

Darrel Taylor
- 7th January 2014, 01:30
>Where does the 100 msec come from ?

It comes from the formula ...
1/(OSC * 1000000 / 4 / Prescaler / 65536)
1/(40 * 1000000 / 4 / 8 / 65536) = 0.0524 Sec. = 52.4 mS
Times 2 for a full cycle = 104.8 mS

>How could I set different periods ?

If the frequency is fixed, use the Timer Template ...
http://darreltaylor.com/DT_INTS-14/TimerTemplate.html

Demon
- 7th January 2014, 03:05
Do we just change these to their 18F counterparts for 18F PICs?


INCLUDE "DT_INTS-14.bas"
INCLUDE "ReEnterPBP.bas'

Robert

iw2fvo
- 7th January 2014, 08:08
Thanks Darrel for the assistance.
I red the pic18f4523 spec and I am just a little bit confused on how write and read the timer1 counter that is 16 bit long.
What is the picbasic code to read and write that 16 bit timer/counter ?
Your responses are always sharp an relly effective: congratulation.
Best regards,
Ambrogio
IW2FVO

Dave
- 7th January 2014, 11:39
IW2FVO,
To read the timer:

variable var word
variable = tmr1

To write the timer:
tmr1 = variable

Its just that simple....

iw2fvo
- 7th January 2014, 14:08
thanks,
if I write tmr1= 64 then the compiler gives me :
>> error 113..... pbpp18.lib580 : symbol not previously defined (tmr1 ) and then the same message but lib588, lib927, lib 933.
So the point is still : how to read / write TMR1 ?
Any help is appreciated.
Thanks
Ambrogio

Demon
- 7th January 2014, 14:17
Is post #10 above the issue?

Robert

HenrikOlsson
- 7th January 2014, 14:25
Hi,
It's easy but I'm afraid it's not THAT easy - there is no TMR1 register (hence the error). Instead TMR1 consists of TWO 8bit regsiters, TMR1L and TMR1H.

The straight forward way to write it is to do

TMR1L = 0
TMR1H = 0
And the straight forward way to read it is

myVar VAR WORD
myVAR.HighByte = TMR1H
myVAR.LowByte = TMR1L
When reading TMR1 this way there's a slight posibillity that TMR1L overflows right in between reading TMR1H and TMR1L giving you a wrong result. To prevent that the easiest way is to simply STOP the timer before reading it. If that's not possible there are other ways to cater for that - and there are tricks that allows you to read it in one go if needed but lets keep it as simple as possible for now.

/Henrik.

Darrel Taylor
- 7th January 2014, 16:48
If you are using the Timer Template, then there's no reason to read or write to the Timer directly. It is handled for you by the template.

If you are not using the template, you should at least use the Timer Reload routine from the template.
To maintain a constant frequency that also accounts for interrupt latency, the reload value must be ADDED to the current value in the Timer.

Just reloading a value into the Timer will give a frequency output, but accuracy and consistency will suffer.

There are other ways to ADD the reload value to the Timer, but you must know exactly how many instructions it takes to do the addition.
The routine in the template is already known to take 8 instruction cycles.
The template automatically adjusts for that amount of time.

With the template, if you tell it you want 100hz ... you get 100.0 Hz.

With all of that said ... you still haven't revealed whether you want a Fixed frequency or Variable frequencies?
It makes a huge difference.

iw2fvo
- 7th January 2014, 18:17
Thanks to everybody for the assistance.
yes, I need a fixed frequency so I can use the timer tamplate. >> Is this table applicable to pic18f4523 ?
Additional question:
>> what is the purpose of bit_7 ( rd16 ) in the t1con register? How to use it ?
>> what is the purpose odf the RESETFLAG? yes/no in the DT _int ?
Regards,
Ambrogio

Darrel Taylor
- 7th January 2014, 18:48
The table is applicable to all PIC's, but it doesn't include the higher OSC frequencies of the 18F's.

If your interrupt frequency is greater than 160 Hz (80 Hz Full Cycle), you don't need to worry about the table.
Just set Prescaler to 1 and Freq to your frequency.

The RD16 bit buffers the highbyte of the Timer so that both bytes can be read or written without stopping the Timer.
The Timer Template will not work with RD16 set.

With interrupts that require you to manually clear the interrupt flag, setting RESETFLAG to YES will allow DT_INTS to clear it for you.

iw2fvo
- 7th January 2014, 20:41
Thanks again Darrel for the great assistance.
regards,
Ambrogio
IW2FVO
North Italy