Problema con funcion delay_ms() en mikrobasic

Que tal amigos, soy nuevo en la programación de pics.
Hace años aprendi a programar en ensamblador asi que tengo algo de nociones.
Actualmente comencé a utilizar el mikrobasic version 7 con licencia y todo.
puedo escribir sin problemas en el pic, hice un pequeño programa con instrucciones, if, while, for, etc
y trabaja perfectamente.
El problema es cuando uso la funcion Delay_ms(), cuando el microcontrolador llega a esa parte, simplemente no la ejectuta, se queda ciclado ahi. (cheque el codigo assembler que el compilador genera y lo encuentro correcto)
Intente hacer tan solo que un led encendiera y apagara " portb = not port b , pero seguia pasando lo mismo.
delay_ms(1000)"
Ya cheque en la configuracion del compilador, le di en el botón default en las propiedades del proyecto y sigue sin funcionar.
Que estará pasando?
He hecho la prueba con un 18f452 y un 18f4680. El resultado es el mismo.
Agradeceria muchisimo su ayuda. ya no se que hacer :cry:

anexo el programa:

program led blinking
main:
trisb = 0
portb = 0
Delay_ms(1000)
portb = not portb
end.

este es el codigo assembler que genera:

$0000 $EF04 F000 GOTO _main
$0008 $ _main:
;hhhh.pbas,3 :: main:
$0008 $ _main_main:
;hhhh.pbas,4 :: trisb = 0
$0008 $6A93 CLRF TRISB, 0
;hhhh.pbas,5 :: portb = 0
$000A $6A81 CLRF PORTB, 0
;hhhh.pbas,6 :: Delay_ms(1000)
$000C $0E0B MOVLW 11
$000E $6E0C MOVWF STACK_12, 0
$0010 $0EFF MOVLW 255
$0012 $6E0B MOVWF STACK_11, 0
$0014 $0EFF MOVLW 255
$0016 $6E0A MOVWF STACK_10, 0
$0018 $2E0C DECFSZ STACK_12, F, 0
$001A $D001 BRA $+2
$001C $D007 BRA $+8
$001E $2E0B DECFSZ STACK_11, F, 0
$0020 $D001 BRA $+2
$0022 $D003 BRA $+4
$0024 $2E0A DECFSZ STACK_10, F, 0
$0026 $D7FE BRA $-1
$0028 $D7FA BRA $-5
$002A $D7F6 BRA $-9
$002C $0E33 MOVLW 51
$002E $6E0B MOVWF STACK_11, 0
$0030 $0EFF MOVLW 255
$0032 $6E0A MOVWF STACK_10, 0
$0034 $2E0B DECFSZ STACK_11, F, 0
$0036 $D001 BRA $+2
$0038 $D003 BRA $+4
$003A $2E0A DECFSZ STACK_10, F, 0
$003C $D7FE BRA $-1
$003E $D7FA BRA $-5
$0040 $0E88 MOVLW 136
$0042 $6E0A MOVWF STACK_10, 0
$0044 $2E0A DECFSZ STACK_10, F, 0
$0046 $D7FE BRA $-1
;hhhh.pbas,7 :: portb = not portb
$0048 $1E81 COMF PORTB, 1, 0
$004A $ hhhh_L_0:
$004A $D7FF BRA $
 
En realidad sería:

main:
TRISB = 0
PORTB = 0
while true
portb = not portb
delay_ms(1000)
wend
end.

me parece que te faltaba el while para que se repita, sino termina el programa con un solo encendido...
A cada vuelta cambia de estado...
 
gracias por la respuesta. pero no puse el programita aqui solo por abreviar pero así lo hice correcto en el pic.
mi problema es mayor aun, ya he hecho mas cosas.. ma baje un simulador y compilador especial para el pic18F y simulo el .hex que me genera mikrobasic, y todo funciona correcto.
Incluso quemo el programa en el pic, despues conecto el pic a mi led, y no funciona.. de regreso entonces leo el pic en el programador, copio el programa que contiene el pic a la pc, despues lo simulo en mi simulador y jala perfecto.
entonces, si el programa esta bien grabado, si el simulador lo ejecuta bien, si despues de quemarlo lo copio de la memoria del pic, lo simulo y funciona bien... que mas puede ser? a menos que el pic este dañado.. pero si asi fuera.. el programador no me marcaria algun error?
 
Todo lo que dices esta muy bien, y si lees el micro y funciona en el simulador, ya no queda duda.
Por lo que comentas el pic no parece dañado...
Perdon por la pregunta, pero el MCLR está pull up? Ese fué mi primer problema con el 16f628 y el 18f452. Si no está con una resistencia a 5vcc el micro no arranca.
En el PIC18 Simulator IDE de www.oshonsoft.com no existe el circuito asociado por lo que el programa asume que está todo bien conectado y el programa arranca
En el proteus DEBES poner la resistencia a vcc, ya que si no lo haces, el micro no arranca.
Que simulador usas...?
No me imagino otro problema si el pic y el grabador están bien...
Suerte

Jalva
 
program led blinking
main:
trisb = 0
portb = 0
Delay_ms(1000)
portb = not portb
end.
Con respecto a tu programa, lo que veo es que despues del retardo de 1s cambias el estado del puerto b, pero tienes la instruccion end seguidamente, por lo que realmente el pic esta haciendo es:
Coloca el puerto b a cero, espera 1s, invierte el puerto b a uno, coloca el puerto b a cero etc etc. y dado que la transicion entre invertir el puerto b a uno y volverlo a hacer cero es de micro segundos pues nunca ves que realmente encienda, ahora en el simulador si lo hace por que estos no corren en tiempo real, pero muestra lo que realmente el pic esta haciendo aunque no lo puedas ver por lo rapido de la transicion.
La solucion mas rapida es agragar otro delay durante el estado de encendido (portb = 1) algo asi como esto:

main:
trisb = 0
portb = 0
Delay_ms(1000)
portb = not portb
Delay_ms(1000)
end.

La frecuencia de parpadeo la fijas moviendo el valor de los dos delays, por ejemplo si deseas que tu frecuencia sea de 1 segundo pues los delays deberian de ser 500 y no 1000, lo cual nos da como resultado que el led encendiera 0.5 seg y estuviera apagado otros 0.5 seg = 1Seg.


Saludos
 
gracias a todos! es la primera vez que agarro un pic, y todo por no leer. en efecto como lo comentó jalva, no tenía conectado el pin MCLR. por lo tanto el pic siempre estaba reseteandoce.
comentó que también fue uno de sus primeros problemas, bueno no me siento tan mal haha =P

gracias.
 
hola a todos bueno tengo problemas para manejar variables en el delay como se lo hace..?
delay ms(X) tal que la variable x pueda variar en funcion a un sumador externo

la variable ah manejar lo quiero hacer con el programa mikro basic
 
Última edición:
dure mas de dos horas para hacer funcionar el pic 18f4550, y nada que la simulación corría, el gran detalle es que si no se coloca la conexión del mclr el pic nunca va a funcionar, los consejos dados aqui me ayudaron a resolver el problema
 
Atrás
Arriba