ERROR MIKROBASIC

Beta Testing discussion on mikroBasic PRO for PIC.
Post Reply
Author
Message
ravimpianti
Posts: 19
Joined: 19 Aug 2011 06:03

ERROR MIKROBASIC

#1 Post by ravimpianti » 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.

User avatar
dejan.odabasic
mikroElektronika team
Posts: 2649
Joined: 30 Apr 2012 14:20

Re: ERROR MIKROBASIC

#2 Post by dejan.odabasic » 21 Mar 2013 18:13

Hello,

Max call stack depth on PIC16F MCUs is eight.
Cos function alone have eight levels, having the interrupt function pushes it over the edge.

You should consider switching to PIC18F, since call stack depth on PIC18F MCUs is 32.
The other solution would be to call cos function only from main function.

Best regards.

Post Reply

Return to “mikroBasic PRO for PIC Beta Testing”