Sub Procedure no fue declarado MikroBasic

estoy intentando hacer una subrutina, miro la ayuda y figura tal cual yo lo escribo, tambien vi varios foros escribiendo de la misma forma que yo, pero al compilar me tira el siguiente error

Código:
16:1 E-3 Identifier 'Sub' was not declared lee2adc.pbas
91:4 E-4 Syntax error: Expected 'end' but '.' found lee2adc.pbas
92:1 E-4 Syntax error: Expected '.' but '' found lee2adc.pbas

esta imagen es usando sub procedure (no dar importancia al "escribo:" solamente queria que me tire el error de sub procedure)

Sinttulo-2-1.jpg



y si pongo el codigo como este me hace cualquier cosa

Código:
program lee2adc
dim text as char[20]
dim ld,li as integer
dim ldt,lit as string[4]
dim i,a,b,j as byte
dim paso as byte[9]
paso[1]=%00000001
paso[2]=%00000011
paso[3]=%00000010
paso[4]=%00000110
paso[5]=%00000100
paso[6]=%00001100
paso[7]=%00001000
paso[8]=%00001001





main:
ANSEL = %00000011          ' PIN A0 A1 como analogicos
ANSELH = 0                 ' todos los demas digitales
ADCON1= 0x80
TRISD = 0
PORTD = 0
TRISB = 0                   ' PORTB is output
Lcd_Init(PORTB)             ' Initialize LCD on PORTB
Lcd_Cmd(Lcd_CURSOR_OFF)     ' Turn off cursor
text = "Seguidor Solar"
Lcd_Out(1, 1, text)         ' Print text at LCD
Delay_ms(1000)
Lcd_Cmd(Lcd_Clear)


i=0
j=0
a=0
b=8
gosub leer
                         if fabs(ld-li) >= 5 then
                            if ld<li then
                               Lcd_cmd(lcd_clear)
                               Lcd_Out(1,1,"LD<LI")
                               Delay_ms(300)
                               gosub escribo
                               for i = 0 to 7
                               a=a+1
                               PORTD = paso[a]
                               delay_ms(5)
                               PORTD=%00000000
                               gosub leer
                               gosub escribo
                               if fabs(ld-li) <= 5 then
                                 Break
                               end if
                               next i
                              else
                              Lcd_cmd(lcd_clear)
                              Lcd_Out(1,1,"LD>LI")
                              Delay_ms(300)
                               gosub escribo
                               for j = 7 to 0
                               b=b-1
                               PORTD = paso[b]
                               delay_ms(5)
                               PORTD=%00000000
                              gosub leer
                               gosub escribo
                               if fabs(ld-li) <= 5 then
                                  Break
                               end if
                               next j
                            end if
                            else
                            Lcd_Out(1,1,"son iguales")
                            delay_ms(500)
                            goto main
                    end if
                    
leer:
ld = ADC_Read(0)
wordtostr(ld,ldt)
Delay_ms(100)
li = ADC_Read(1)
wordtostr(li,lit)
return

escribo:
Lcd_cmd(lcd_clear)
Lcd_Out(1,1,"ld:")
Lcd_Out(2,1,"li:")
lcd_out(1,5,ldt)
lcd_out(2,5,lit)
return
end.
 
Última edición:
prueba esto...
Código:
program lee2adc
dim text as char[20]
dim ld,li as integer
dim ldt,lit as string[4]
dim i,a,b,j as byte
dim paso as byte[9]
paso[1]=%00000001
paso[2]=%00000011
paso[3]=%00000010
paso[4]=%00000110
paso[5]=%00000100
paso[6]=%00001100
paso[7]=%00001000
paso[8]=%00001001






ANSEL = %00000011          ' PIN A0 A1 como analogicos
ANSELH = 0                 ' todos los demas digitales
ADCON1= 0x80
TRISD = 0
PORTD = 0
TRISB = 0                   ' PORTB is output
Lcd_Init(PORTB)             ' Initialize LCD on PORTB
Lcd_Cmd(Lcd_CURSOR_OFF)     ' Turn off cursor
text = "Seguidor Solar"
Lcd_Out(1, 1, text)         ' Print text at LCD
Delay_ms(1000)
Lcd_Cmd(Lcd_Clear)


i=0
j=0
a=0
b=8

[COLOR="Red"]Main:[/COLOR]
gosub leer
                         if fabs(ld-li) >= 5 then
                            if ld<li then
                               Lcd_cmd(lcd_clear)
                               Lcd_Out(1,1,"LD<LI")
                               Delay_ms(300)
                               gosub escribo
                               for i = 0 to 7
                               a=a+1
                               PORTD = paso[a]
                               delay_ms(5)
                               PORTD=%00000000
                               gosub leer
                               gosub escribo
                               if fabs(ld-li) <= 5 then
                                 Break
                               end if
                               next i
                              else
                              Lcd_cmd(lcd_clear)
                              Lcd_Out(1,1,"LD>LI")
                              Delay_ms(300)
                               gosub escribo
                               for j = 7 to 0
                               b=b-1
                               PORTD = paso[b]
                               delay_ms(5)
                               PORTD=%00000000
                              gosub leer
                               gosub escribo
                               if fabs(ld-li) <= 5 then
                                  Break
                               end if
                               next j
                            end if
                            else
                            Lcd_Out(1,1,"son iguales")
                            delay_ms(500)
                            goto main
                    end if
              [COLOR="red"]Goto Main   [/COLOR]   
leer:
ld = ADC_Read(0)
wordtostr(ld,ldt)
Delay_ms(100)
li = ADC_Read(1)
wordtostr(li,lit)
return

escribo:
Lcd_cmd(lcd_clear)
Lcd_Out(1,1,"ld:")
Lcd_Out(2,1,"li:")
lcd_out(1,5,ldt)
lcd_out(2,5,lit)
return
end.

y el error que marca no es que no este declarado sino que esta mal declarado o fuera de lugar...
 
Última edición:
ya lo arregle habia que ponerlo asi

Código:
program lee2adc
dim text as char[20]
dim ld,li as integer
dim ldt,lit as string[4]
dim i,a,b,j as byte
dim paso as byte[9]

sub procedure escribo()
Lcd_cmd(lcd_clear)
Lcd_Out(1,1,"ld:")
Lcd_Out(2,1,"li:")
lcd_out(1,5,ldt)
lcd_out(2,5,lit)
end sub

sub procedure leer()
ld = ADC_Read(0)
wordtostr(ld,ldt)
Delay_ms(100)
li = ADC_Read(1)
wordtostr(li,lit)
end sub

sub procedure pasos()
paso[1]=%00000001
paso[2]=%00000011
paso[3]=%00000010
paso[4]=%00000110
paso[5]=%00000100
paso[6]=%00001100
paso[7]=%00001000
paso[8]=%00001001
end sub

sub procedure initmain()
ANSEL = %00000011          ' PIN A0 A1 como analogicos
ANSELH = 0                 ' todos los demas digitales
ADCON1= 0x80
TRISD = 0
PORTD = 0
TRISB = 0                   ' PORTB is output
Lcd_Init(PORTB)             ' Initialize LCD on PORTB
end sub


main:
pasos()
initmain()
Lcd_Cmd(Lcd_CURSOR_OFF)     ' Turn off cursor
text = "Seguidor Solar"
Lcd_Out(1, 1, text)         ' Print text at LCD
Delay_ms(1000)
Lcd_Cmd(Lcd_Clear)


i=0
j=0
a=0
b=8
leer()
                         if fabs(ld-li) >= 5 then
                            if ld<li then
                               Lcd_cmd(lcd_clear)
                               Lcd_Out(1,1,"LD<LI")
                               Delay_ms(300)
                               escribo()
                               for i = 0 to 7
                               a=a+1
                               PORTD = paso[a]
                               delay_ms(5)
                               PORTD=%00000000
                               leer()
                               escribo()
                               if fabs(ld-li) <= 5 then
                                 Break
                               end if
                               next i
                              else
                              Lcd_cmd(lcd_clear)
                              Lcd_Out(1,1,"LD>LI")
                              Delay_ms(300)
                               escribo()
                               for j = 7 to 0
                               b=b-1
                               PORTD = paso[b]
                               delay_ms(5)
                               PORTD=%00000000
                               leer()
                               escribo()
                               if fabs(ld-li) <= 5 then
                                  Break
                               end if
                               next j
                            end if
                            else
                            Lcd_Out(1,1,"son iguales")
                            delay_ms(500)
                            goto main
                    end if
                    

end.
 
tenia algunos problemas parecidos si tu codigo no excede los 5k mejor usa el demos de la version pro de microbasic. si tienes que usar posteriormente descriptores verifica que estos sean de extencion .mbas
 
el descriptor es lo mismo que una libreria, pero te advierto que en ese caso tendras que volver a instalar la version que tienes.
yo compre la licencia original y mas nunca tuve problemas con este compilador pero cuando use la version que creo que estas usando se me daño que nunca descubri el error y solo me funcionaba bien si lo hacia en ensamblador
 
:unsure: perdon que me meta..

pero en ese codigo es bastante claro que esta mal la logica...

con la correccion se parcho el problema pero la logica segun yo sigue mal... es decir...

cuando... fabs(ld-li) < 5 entonces se va a "congelar" el micro porque no tiene un ciclo indeterminado...

antes se cumplia esa condicion y se iba a subprocedimientos que no habia sido llamados y por eso el error, en el nuevo codigo se subieron esos subprocedimiento y se "arreglo" pero va a ejecutar el fin del programa con el END....

si la logica o flujo es correcto asi, entonces en el primer codigo bastaba con poner un End antes del procedimiento o etiqueta leer:...
 
Última edición:
Hola soy nuevo aqui y ya q estamos en el tema de Mikrobasic, quiziera saber porque me tira error esta parte

2z9kw9z.png


PHP:
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 valordesdeadc, voltajelcd as float
dim txt as string[16]
trisa=7
inicio:
adcon1=%00000000
while true
Lcd_Init()
lcd_Cmd(_LCD_CLEAR)
Lcd_Cmd(_LCD_CURSOR_OFF)

valordesdeadc=ADC_read(0)
lcd_out(1,4,"voltaje")
voltajelcd=valordesdeadc*0.004892367-0.01000354
floatToStr(voltajelcd,txt)
lcd_out(2,5,txt)
delay_ms(500)
wend
goto inicio
end.

...y bueno espero que me ayuden!!!
Gracias.
 
:unsure: perdon que me meta..

pero en ese codigo es bastante claro que esta mal la logica...

con la correccion se parcho el problema pero la logica segun yo sigue mal... es decir...

cuando... fabs(ld-li) < 5 entonces se va a "congelar" el micro porque no tiene un ciclo indeterminado...

antes se cumplia esa condicion y se iba a subprocedimientos que no habia sido llamados y por eso el error, en el nuevo codigo se subieron esos subprocedimiento y se "arreglo" pero va a ejecutar el fin del programa con el END....

si la logica o flujo es correcto asi, entonces en el primer codigo bastaba con poner un End antes del procedimiento o etiqueta leer:...

si tenes razon falta un go to para que vuelva al principio, pero igual este no es el codigo final.

antes no andaban los sub porque estaba mal ubicada la declaracion de las variables de los pasos



Hola soy nuevo aqui y ya q estamos en el tema de Mikrobasic, quiziera saber porque me tira error esta parte

http://i50.tinypic.com/2z9kw9z.png

PHP:
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 valordesdeadc, voltajelcd as float
dim txt as string[16]
trisa=7
inicio:
adcon1=%00000000
while true
Lcd_Init()
lcd_Cmd(_LCD_CLEAR)
Lcd_Cmd(_LCD_CURSOR_OFF)

valordesdeadc=ADC_read(0)
lcd_out(1,4,"voltaje")
voltajelcd=valordesdeadc*0.004892367-0.01000354
floatToStr(voltajelcd,txt)
lcd_out(2,5,txt)
delay_ms(500)
wend
goto inicio
end.

...y bueno espero que me ayuden!!!
Gracias.

proba poniendo el trisa=7 despues del main
 
Última edición:
Atrás
Arriba