ERROR MIKROBASIC
Posted: 14 Mar 2013 10:19
GOODMORNIG,
I HAVE THIS MESSAGE FROM COMPILER:
103 433 Not enough RAM for call stack __Lib_MathDouble.mpas
HELP ME!
SEE ATTACHED CODE:
program frequenzimetro
'PIC 16F877A 8MHZ CLOCK
'USE CCP1 AND CCP2 WITH TIMER1
' Lcd module connections
dim LCD_RS as sbit at RB4_bit
LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit
LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit
DIM TXT, PHI, PERIODOS, TCOSFIS as string [10]
DIM PERIODO, TCOSFI AS WORD
DIM FREQ, TIME AS FLOAT
DIM COSPHI, GRADI, RADIANTI AS FLOAT
DIM CON AS BYTE
SUB PROCEDURE TEMPI() 'display timer1 capture
WORDToStr(PERIODO, PERIODOS)
WORDToStr(TCOSFI, TCOSFIS)
Lcd_CHR(1,2,PERIODOS[0])
Lcd_CHR(1,3,PERIODOS[1])
Lcd_CHR(1,4,PERIODOS[2])
Lcd_CHR(1,5,PERIODOS[3])
Lcd_CHR(1,6,PERIODOS[4])
Lcd_CHR(1,11,TCOSFIS[0])
Lcd_CHR(1,12,TCOSFIS[1])
Lcd_CHR(1,13,TCOSFIS[2])
Lcd_CHR(1,14,TCOSFIS[3])
Lcd_CHR(1,15,TCOSFIS[4])
END SUB
SUB PROCEDURE FREQUENZA()
TIME = PERIODO * 0.0000005 '0.0000005 = FOSC/4 in seconds
FREQ = 1/TIME 'calculate of frequency
FloatToStr(FREQ, TXT)
IF PERIODO >= 50000 THEN PERIODO = 49960 TXT="--.--" END IF 'display limits 40 Hz
IF PERIODO <= 25000 THEN PERIODO = 24960 TXT="--.--" END IF 'display limits 80 Hz
Lcd_CHR(2,2,TXT[0]) 'display value
Lcd_CHR(2,3,TXT[1])
Lcd_CHR(2,4,TXT[2])
Lcd_CHR(2,5,TXT[3])
Lcd_CHR(2,6,TXT[4])
Lcd_CHR(2,7,"H")
Lcd_CHR(2,8,"z")
END SUB
SUB PROCEDURE SFASAMENTO()
GRADI = TCOSFI * 0.0000005 * 360.0 * FREQ ' DEGREEE = TIMER1(TCOSFI) * 0.0000005(FOSC/4 in seconds) * 360 * FREQUENCY
COSPHI = COS((6.283185307179*GRADI)/360.0)
floatToStr(COSPHI, PHI) 'conversion to string
IF TCOSFI >= 6770 THEN PHI="-.---" END IF 'display limits 0.500 (60 DEGREE)
IF TCOSFI <= 104 THEN PHI="1.000" END IF 'display limits 1.000 (00 DEGREE)'
Lcd_CHR(2,11,PHI[0]) 'display value
Lcd_CHR(2,12,PHI[1])
Lcd_CHR(2,13,PHI[2])
Lcd_CHR(2,14,PHI[3])
Lcd_CHR(2,15,PHI[4])
END SUB
sub procedure interrupt
if (PIR1.CCP1IF = 1) and (CON=0) then PIR1.CCP1IF = 0 TMR1L=0 TMR1H=0 CON=1 end if
if (PIR2.CCP2IF = 1) and (CON=1) then PIR2.CCP2IF = 0 LO(TCOSFI) = CCPR2L HI(TCOSFI) = CCPR2H PIE2.CCP2IE= 0 end iF
if (PIR1.CCP1IF = 1) and (CON=1) then PIR1.CCP1IF = 0 LO(PERIODO)= CCPR1L HI(PERIODO) = CCPR1H CON=0 PIE1.CCP1IE= 0 end if
end sub
main:
TRISC = %11111111
TCOSFI=0
PERIODO=0
TIME=0
FREQ=0
CON = 0
CCP1CON= 4 'RICONOSCIMENTO FRONTE DI SALITA
CCP2CON= 4 'RICONOSCIMENTO FRONTE DI SALITA
INTCON.GIE = 1 'ABILITO INTERRUPT GENERALE
INTCON.PEIE= 1 'ABILITO INTERRUPT PERIFERICHE
PIE1.CCP1IE= 1 'ABILITO INTERRUPT CCP1
PIE2.CCP2IE= 1 'ABILITO INTERRUPT CCP2
T1CON = 1
Lcd_Init() ' Initialize Lcd
Lcd_Cmd(_LCD_CLEAR) ' Clear display
Lcd_Cmd(_LCD_CURSOR_OFF) ' Cursor off
while TRUE
TEMPI
FREQUENZA
SFASAMENTO
PIE1.CCP1IE= 1 'ABILITO INTERRUPT CCP1
PIE2.CCP2IE= 1 'ABILITO INTERRUPT CCP2
CON=0
DELAY_MS(200)
WEND
END.
I HAVE THIS MESSAGE FROM COMPILER:
103 433 Not enough RAM for call stack __Lib_MathDouble.mpas
HELP ME!
SEE ATTACHED CODE:
program frequenzimetro
'PIC 16F877A 8MHZ CLOCK
'USE CCP1 AND CCP2 WITH TIMER1
' Lcd module connections
dim LCD_RS as sbit at RB4_bit
LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit
LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit
DIM TXT, PHI, PERIODOS, TCOSFIS as string [10]
DIM PERIODO, TCOSFI AS WORD
DIM FREQ, TIME AS FLOAT
DIM COSPHI, GRADI, RADIANTI AS FLOAT
DIM CON AS BYTE
SUB PROCEDURE TEMPI() 'display timer1 capture
WORDToStr(PERIODO, PERIODOS)
WORDToStr(TCOSFI, TCOSFIS)
Lcd_CHR(1,2,PERIODOS[0])
Lcd_CHR(1,3,PERIODOS[1])
Lcd_CHR(1,4,PERIODOS[2])
Lcd_CHR(1,5,PERIODOS[3])
Lcd_CHR(1,6,PERIODOS[4])
Lcd_CHR(1,11,TCOSFIS[0])
Lcd_CHR(1,12,TCOSFIS[1])
Lcd_CHR(1,13,TCOSFIS[2])
Lcd_CHR(1,14,TCOSFIS[3])
Lcd_CHR(1,15,TCOSFIS[4])
END SUB
SUB PROCEDURE FREQUENZA()
TIME = PERIODO * 0.0000005 '0.0000005 = FOSC/4 in seconds
FREQ = 1/TIME 'calculate of frequency
FloatToStr(FREQ, TXT)
IF PERIODO >= 50000 THEN PERIODO = 49960 TXT="--.--" END IF 'display limits 40 Hz
IF PERIODO <= 25000 THEN PERIODO = 24960 TXT="--.--" END IF 'display limits 80 Hz
Lcd_CHR(2,2,TXT[0]) 'display value
Lcd_CHR(2,3,TXT[1])
Lcd_CHR(2,4,TXT[2])
Lcd_CHR(2,5,TXT[3])
Lcd_CHR(2,6,TXT[4])
Lcd_CHR(2,7,"H")
Lcd_CHR(2,8,"z")
END SUB
SUB PROCEDURE SFASAMENTO()
GRADI = TCOSFI * 0.0000005 * 360.0 * FREQ ' DEGREEE = TIMER1(TCOSFI) * 0.0000005(FOSC/4 in seconds) * 360 * FREQUENCY
COSPHI = COS((6.283185307179*GRADI)/360.0)
floatToStr(COSPHI, PHI) 'conversion to string
IF TCOSFI >= 6770 THEN PHI="-.---" END IF 'display limits 0.500 (60 DEGREE)
IF TCOSFI <= 104 THEN PHI="1.000" END IF 'display limits 1.000 (00 DEGREE)'
Lcd_CHR(2,11,PHI[0]) 'display value
Lcd_CHR(2,12,PHI[1])
Lcd_CHR(2,13,PHI[2])
Lcd_CHR(2,14,PHI[3])
Lcd_CHR(2,15,PHI[4])
END SUB
sub procedure interrupt
if (PIR1.CCP1IF = 1) and (CON=0) then PIR1.CCP1IF = 0 TMR1L=0 TMR1H=0 CON=1 end if
if (PIR2.CCP2IF = 1) and (CON=1) then PIR2.CCP2IF = 0 LO(TCOSFI) = CCPR2L HI(TCOSFI) = CCPR2H PIE2.CCP2IE= 0 end iF
if (PIR1.CCP1IF = 1) and (CON=1) then PIR1.CCP1IF = 0 LO(PERIODO)= CCPR1L HI(PERIODO) = CCPR1H CON=0 PIE1.CCP1IE= 0 end if
end sub
main:
TRISC = %11111111
TCOSFI=0
PERIODO=0
TIME=0
FREQ=0
CON = 0
CCP1CON= 4 'RICONOSCIMENTO FRONTE DI SALITA
CCP2CON= 4 'RICONOSCIMENTO FRONTE DI SALITA
INTCON.GIE = 1 'ABILITO INTERRUPT GENERALE
INTCON.PEIE= 1 'ABILITO INTERRUPT PERIFERICHE
PIE1.CCP1IE= 1 'ABILITO INTERRUPT CCP1
PIE2.CCP2IE= 1 'ABILITO INTERRUPT CCP2
T1CON = 1
Lcd_Init() ' Initialize Lcd
Lcd_Cmd(_LCD_CLEAR) ' Clear display
Lcd_Cmd(_LCD_CURSOR_OFF) ' Cursor off
while TRUE
TEMPI
FREQUENZA
SFASAMENTO
PIE1.CCP1IE= 1 'ABILITO INTERRUPT CCP1
PIE2.CCP2IE= 1 'ABILITO INTERRUPT CCP2
CON=0
DELAY_MS(200)
WEND
END.