|
|
View previous topic :: View next topic |
Author |
Message |
hexfet13 Guest
|
I2C & INTERRUPT |
Posted: Mon Jul 16, 2007 4:55 pm |
|
|
Hi at all.
I'm using an i2c rtc and the program stop after the execution of initialization routine because the translation of instruction i2c_start() is the seguent:
.................... i2c_start();
064E: BSF 29.4
064F: MOVF 29,W
0650: BSF 03.5
0651: MOVWF 07
0652: MOVLW 04
0653: MOVWF 77
0654: DECFSZ 77,F
0655: GOTO 654
0656: BCF 03.5
0657: BSF 29.3
0658: MOVF 29,W
0659: BSF 03.5
065A: MOVWF 07
065B: MOVLW 03
065C: MOVWF 77
065D: DECFSZ 77,F
065E: GOTO 65D
065F: BCF 03.5
0660: BCF 07.4
0661: BCF 29.4
0662: MOVF 29,W
0663: BSF 03.5
0664: MOVWF 07
0665: MOVLW 04
0666: MOVWF 77
0667: DECFSZ 77,F
0668: GOTO 667
0669: BCF 03.5
066A: BCF 07.3
066B: BCF 29.3
066C: MOVF 29,W
066D: BSF 03.5
066E: MOVWF 07
066F: BCF 03.5
0670: CLRF 28
0671: BTFSC 0B.7
0672: BSF 28.7
0673: BCF 0B.7
In the last line, bit 7 in register 0B (INTCON) is cleared, so global interrupt id disabled( and never enabled after in the code).
It is correct this kind of translation?
I'm using pch 4.032 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jul 16, 2007 8:17 pm |
|
|
Post a really short little test program that shows the problem. Limit the
code to 10 lines. Post all #include, #fuses, and #use statements.
The program should be compilable without errors. (i.e., post all variable
declarations as well). |
|
|
hexfet13 Guest
|
|
Posted: Tue Jul 17, 2007 3:43 am |
|
|
I've compiled my project now, and the compiler output is the seguent:
>>> Warning 216 "C:\Programmi\PICC\Projects\18F452-RS232.c" Line 174(0,1): Interrupts disabled during call to prevent re-entrancy: (@I2C_WRITE_1)
>>> Warning 216 "C:\Programmi\PICC\Projects\18F452-RS232.c" Line 174(0,1): Interrupts disabled during call to prevent re-entrancy: (@I2C_READ_1)
>>> Warning 216 "C:\Programmi\PICC\Projects\18F452-RS232.c" Line 174(0,1): Interrupts disabled during call to prevent re-entrancy: (glcd_WriteCmd2)
>>> Warning 216 "C:\Programmi\PICC\Projects\18F452-RS232.c" Line 174(0,1): Interrupts disabled during call to prevent re-entrancy: (glcd_WriteByte)
Interrupt occur every 10 ms(programmed on tmr0).
Actually i call adc_read()( that read adc value) every 30ms and refresh_clk() every 1s, both from interrupt routine.Could be this the cause of disabled Interrupts?
How i can modify my code to read adc every 30ms and refresh time on lcd every 1s (should i call both out of interrupt routine)?
a piece of code is the seguent
#include <16F877A.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define CONTRAST 50
#define DS1337_SDA PIN_C4
#define DS1337_SCL PIN_C3
#use i2c(master, sda=DS1337_SDA, scl=DS1337_SCL)
#include <default_param.h>
#include <inizialize.h>
#include <interface.h>
int con=CONTRAST; //lcd contrast
int i_clk=0;
//**** test
char mis_string[4];
//****
#int_rtcc //
void timer_zero() { // interrupt every 10ms
set_tmr0(); // set correct tmro value
key=get_key(); // reading keys
get_adc(); /* read adc value (the value is stored in a variable measure
defined as int16 in inizialize.h */
if(i_clk++==100){ // every 1000ms
refresh_clk(); // this procedure read time from RTC and update it on lcd
i_clk=0;
}
if (!(i_clk%33)){
glcd_gotoxy(1,0,0x00);
glcd_putc("Measure:");
sprintf(mis_string,"%4lu",measure);
glcd_putstr(mis_string); // display a strung on lcd
}
}
void main()
{
:loop
goto loop;
} |
|
|
rnielsen
Joined: 23 Sep 2003 Posts: 852 Location: Utah
|
|
Posted: Tue Jul 17, 2007 8:33 am |
|
|
Quote: | Actually i call adc_read()( that read adc value) every 30ms and refresh_clk() every 1s, both from interrupt routine.Could be this the cause of disabled Interrupts?
How i can modify my code to read adc every 30ms and refresh time on lcd every 1s (should i call both out of interrupt routine)?
a piece of code is the seguent
|
It's not a good idea to call a function from inside an ISR(Interrupt). ISR's should be short and simple. Have one of the timers set a flag every 30ms and another flag at 1s. Then, have each flag serviced from within the main() body. I believe calling these routines, from within the ISR, is causing your problem.
Ronald |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|