PDA

View Full Version : How to set interrupt for Timer 0



chai98a
- 15th November 2006, 12:54
Now have problem with time 0 set interrupt every 34 us

Here is my code ,that is correct or not

Main:
Trisb = %11111111
Trisa = %00000000

'DECLARE SYMBOLS
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
Symbol GIE = INTCON.7 ' Global Interrupt Enable
Symbol PS0 = OPTION_REG.0 ' Prescaler Rate Select
Symbol PS1 = OPTION_REG.1 ' Prescaler Rate Select
Symbol PS2 = OPTION_REG.2 ' Prescaler Rate Select
Symbol PSA = OPTION_REG.3 ' Prescaler Assignment
Symbol TOCS = OPTION_REG.5

'SET REGISTERS

'Below is the prescaler setting you chose....
'---------------------------------------------------------
PS0 = 0
PS1 = 0
PS2 = 0
PSA = 1
'---------------------------------------------------------
TOCS = 0 'set the clock source for internal oscillator
T0IF = 0 'clear the interrupt flag
T0IE = 1 'enable tmr0 interrupt
GIE = 1 'enable Global interrupts
'Below is the offset setting you chose....
TMR0 = 223
'START PROGRAM
On Interrupt goto Int
Strobe = 1 'strobe off
latch = 1 'lactch off
clock = 1 'CLOCK OFF ACTIVE HIGH

Sin3 = 0
Sin2 = 0
SIN1 = 0
Loop:
nap 7
goto loop

mister_e
- 15th November 2006, 13:47
it's not the whole thing you posted right?

It miss the most intereting part... :(

chai98a
- 17th November 2006, 06:47
after i start debug with IDC the code will run and stop at line TMR0 = 223
and still there Now i don't know why ...
Norrmally after we run should run untill sub " loop " and replace there untill TMR0 was over full and then jump to "INT:" sub right

Pls advise too.....

Bruce
- 17th November 2006, 15:14
NAP uses SLEEP which stops the clock, which stops the timer.

mister_e
- 17th November 2006, 16:00
DOH! Seems i miss that line :(

chai98a
- 17th November 2006, 17:31
So , I did change to used ..
'--------------
While 1

wend

'--------------

But still same problem found, Who did have sample of time interrupt TMR0 pls share for me too

chai98a
- 17th November 2006, 18:33
Hi what i am worng why i cannot to simulate or debug on this file

DEFINE LOADER_USED 1
DEFINE OSC 4
'@ Device pic16F877, XT_OSC, BOD_OFF, PWRT_ON, WDT_off, PROTECT_OFF,WRT_On
INCLUDE "modedefs.bas"


Strobe Var Porta.0
Latch var Porta.1
Clock Var Porta.2
Sin3 var Porta.3
Sin2 var Porta.4
Sin1 var Porta.5
Datasin3 var word
Datasin2 var word
Datasin1 var word

Scanrow1 con 0
Scanrow0 con 17
font0 CON 40
font1 CON 57
font2 CON 74
font3 CON 91

COLUM3 VAR BYTE
COLUM2 VAR BYTE
COLUM1 VAR BYTE
COLUM0 VAR BYTE
ROW1 VAR BYTE
ROW0 VAR BYTE
font0X VAR BYTE
font1X VAR BYTE
font2X VAR BYTE
font3X VAR BYTE
S1 var bit
S2 var Bit
S3 Var bit

I var byte
'J Var BYTE
K VAR BYTE
'L VAR BYTE
'N VAR BYTE

X var byte
Z var Byte

'Pause 500
Main:
Trisb = %11111111
Trisa = %00000000
ADCON1 = 7
OPTION_REG = $55 ' Set TMR0 configuration and enable PORTB pullups
INTCON = $a0 ' Enable TMR0 interrupts

TMR0 = 0
'START PROGRAM
on interrupt goto int1

Strobe = 1'strobe off
latch = 1'lactch off
clock = 1'CLOCK OFF ACTIVE HIGH

Sin3 = 0
Sin2 = 0
SIN1 = 0
WHILE 1

WEND
end

EEPROM scanrow1,[0,0,0,0,0,0,0,0,1,2,4,8,16,32,64,128]
EEPROM Scanrow0,[1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]
EEPROM FONT0,[$00,$00,$00,$00,$00,$7C,$40,$40,$78,$40,$40,$7C,$0 0,$00,$00,$00]
EEPROM FONT1,[$00,$00,$00,$00,$00,$7C,$10,$10,$10,$10,$10,$10,$0 0,$00,$00,$00]
EEPROM FONT2,[$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0 0,$00,$00,$00]


DISABLE
int1:
T0IF = 0 'clear the interrupt flag
TMR0 = 223

STROBE = 1
FOR K = 0 TO 8
READ (FONT1+K),COLUM2
READ (FONT2+K),COLUM0
READ (SCANROW0+K),ROW0
GOSUB SCANDATASIN8BITLOWBYTE

READ (FONT0+K),COLUM3
READ (FONT1+K),COLUM1
READ (SCANROW1+K),ROW1
GOSUB SCANDATASIN8BITHIGHBYTE
LATCH = 0
PAUSEUS 50
LATCH = 1
STROBE = 0
PAUSEUS 150
STROBE = 1

next k

FOR K = 8 TO 16
READ (FONT1+K),COLUM2
READ (FONT2+K),COLUM0
READ (SCANROW0+K),ROW0
GOSUB SCANDATASIN8BITLOWBYTE

READ (FONT0+K),COLUM3
READ (FONT1+K),COLUM1
READ (SCANROW1+K),ROW1
GOSUB SCANDATASIN8BITHIGHBYTE
LATCH = 0
PAUSEUS 50
LATCH = 1
STROBE = 0
PAUSEUS 150
STROBE = 1

NEXT K
resume
enable


SCANDATASIN8BITLOWBYTE:

FOR I = 0 TO 8
S3 = colum0.0[i]
S2 = colum2.0[i]
S1 = row0.0[i]
Sin3 = S3
Sin2 = S2
SIN1 = S1
clock = 1
PAUSEUS 50
clock = 0
NEXT I
RETURN

SCANDATASIN8BITHIGHBYTE:

FOR I = 0 TO 8
S3 = colum1.0[i]
S2 = colum3.0[i]
S1 = row1.0[i]
Sin3 = S3
Sin2 = S2
SIN1 = S1
clock = 1
PAUSEUS 50
clock = 0
NEXT I
RETURN

sayzer
- 17th November 2006, 19:05
Hi chai98a,

First of all, you should have a clear structure in your programming :)

Here, I have done it for you.

There are couple of things need to be paid attention of.

1. You have EEPROM command to fill up the EEPROM with some values but you use this command with a constant inside the program. EEPROM can not be used inside the program; check the help file.

2. You did not assign any variable to TMR0 interrupt flag, but you use "T0IF"; T0IF VAR INTCON.2

3. You do not have a loop here. I guess you wanted to do something with
WHILE 1

WEND

Describe what you wanted to do.






EEPROM 0, [0,0,0,0,0,0,0,0,1,2,4,8,16,32,64,128]
EEPROM 17,[1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]
EEPROM 40,[$00,$00,$00,$00,$00,$7C,$40,$40,$78,$40,$40,$7C,$0 0,$00,$00,$00]
EEPROM 57,[$00,$00,$00,$00,$00,$7C,$10,$10,$10,$10,$10,$10,$0 0,$00,$00,$00]
EEPROM 74,[$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0 0,$00,$00,$00]


DEFINE LOADER_USED 1
@ Device pic16F877, XT_OSC, BOD_OFF, PWRT_ON, WDT_OFF, PROTECT_OFF,WRT_ON
INCLUDE "modedefs.bas"

TRISA = %00000000
TRISB = %11111111
ADCON1 = 7
OPTION_REG = $55 ' Set TMR0 configuration and enable PORTB pullups
INTCON = $A0 ' Enable TMR0 interrupts
T0IF VAR INTCON.2
on interrupt goto int1

Strobe Var Porta.0
Latch var Porta.1
Clock Var Porta.2
Sin3 var Porta.3
Sin2 var Porta.4
Sin1 var Porta.5
Datasin3 var word
Datasin2 var word
Datasin1 var word

Scanrow1 con 0
Scanrow0 con 17

font0 CON 40
font1 CON 57
font2 CON 74
font3 CON 91

COLUM3 VAR BYTE
COLUM2 VAR BYTE
COLUM1 VAR BYTE
COLUM0 VAR BYTE

ROW1 VAR BYTE
ROW0 VAR BYTE

font0X VAR BYTE
font1X VAR BYTE
font2X VAR BYTE
font3X VAR BYTE

S1 var bit
S2 var Bit
S3 Var bit

I var byte
K VAR BYTE
X var byte
Z var Byte


Main:

TMR0 = 0
Strobe = 1'strobe off
latch = 1'lactch off
clock = 1'CLOCK OFF ACTIVE HIGH
Sin3 = 0
Sin2 = 0
SIN1 = 0


' WHILE 1

' WEND

'What will happen here? What is it you wanted to do? And where is the loop?


DISABLE
int1:
T0IF = 0 'clear the interrupt flag

' TMR0 = 223
' ????

STROBE = 1

FOR K = 0 TO 8
READ (FONT1+K),COLUM2
READ (FONT2+K),COLUM0
READ (SCANROW0+K),ROW0

GOSUB SCANDATASIN8BITLOWBYTE

READ (FONT0+K),COLUM3
READ (FONT1+K),COLUM1
READ (SCANROW1+K),ROW1

GOSUB SCANDATASIN8BITHIGHBYTE

LATCH = 0
PAUSEUS 50
LATCH = 1
STROBE = 0
PAUSEUS 150
STROBE = 1

next k

FOR K = 8 TO 16
READ (FONT1+K),COLUM2
READ (FONT2+K),COLUM0
READ (SCANROW0+K),ROW0

GOSUB SCANDATASIN8BITLOWBYTE

READ (FONT0+K),COLUM3
READ (FONT1+K),COLUM1
READ (SCANROW1+K),ROW1

GOSUB SCANDATASIN8BITHIGHBYTE

LATCH = 0
PAUSEUS 50
LATCH = 1
STROBE = 0
PAUSEUS 150
STROBE = 1

NEXT K

resume
enable


SCANDATASIN8BITLOWBYTE:

FOR I = 0 TO 8
S3 = colum0.0[i]
S2 = colum2.0[i]
S1 = row0.0[i]
Sin3 = S3
Sin2 = S2
SIN1 = S1
clock = 1
PAUSEUS 50
clock = 0
NEXT I
RETURN

SCANDATASIN8BITHIGHBYTE:

FOR I = 0 TO 8
S3 = colum1.0[i]
S2 = colum3.0[i]
S1 = row1.0[i]
Sin3 = S3
Sin2 = S2
SIN1 = S1
clock = 1
PAUSEUS 50
clock = 0
NEXT I
RETURN

chai98a
- 18th November 2006, 00:14
Hi sayzer

For "while 1" we need the program waiting for time interrupt

Here is picture of ICD UI ,why stop at first lin of main: sub, try to add goto int1 at first line of main : still found the same..