Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?
16/03/2014 #2721
Moderador

Avatar de D@rkbytes

ferdy575 dijo: Ver Mensaje
¿Quisiera saber sí es posible crear un programa en basic dónde yo pueda escoger varias funciones y éstas estén en asm?
Si se puede, pero si quieres usar las variables dentro de un bloque en ensamblador en otra parte del programa, se tienen que usar diferente, "poniendo un guión bajo" para que el compilador distinga los punteros.

Mira este ejemplo en donde muestro como hacer lo que necesitas: Post #2379

Suerte.
16/03/2014 #2722

Avatar de papirrin

D@rkbytes dijo: Ver Mensaje
Si se puede, pero si quieres usar las variables dentro de un bloque en ensamblador en otra parte del programa, se tienen que usar diferente, "poniendo un guión bajo" para que el compilador distinga los punteros.

Mira este ejemplo en donde muestro como hacer lo que necesitas: Post #2379

Suerte.
en tu codigo:
Código:
Loop100Ms
	decfsz	_Cnt1,F
	goto	$+2
	decfsz	_Cnt2,F
	goto	Loop100Ms
	goto	$+1
	nop
	return
porque pones el Goto $+1 y delante un nop seguido del return, ¿que no seria lo mismo poner?:
Código:
Loop100Ms
	decfsz	_Cnt1,F
	goto	$+2
	decfsz	_Cnt2,F
	goto	Loop100Ms
	return
o ¿cual es el fin de ponerlos?
16/03/2014 #2723
Moderador

Avatar de D@rkbytes

papirrin dijo: Ver Mensaje
en tu codigo:
Código:
Loop100Ms
    decfsz    _Cnt1,F
    goto    $+2
    decfsz    _Cnt2,F
    goto    Loop100Ms
    goto    $+1
    nop
    return
porque pones el Goto $+1 y delante un nop seguido del return, ¿que no seria lo mismo poner?:
Código:
Loop100Ms
    decfsz    _Cnt1,F
    goto    $+2
    decfsz    _Cnt2,F
    goto    Loop100Ms
    return
o ¿cual es el fin de ponerlos?
Como son rutinas anidadas, los nop cuentan como ciclos de instrucción.
Si omites los nop, el retardo generado no será tan preciso.
06/04/2014 #2724

Avatar de Alcocer Garcia Felix Davi

Lcd perrito en movimiento
Esta es la simulacion de un perrito en una lcd usando un algoritmo conocido , el perrito se desplaza de derecha a izquierda y viceversa , tengo la duda de por q no sale el cuerpo completo del perrito aqui adjunto el programa , la simulacion y el libro donde lo saque gracias.
Archivos Adjuntos
Tipo de Archivo: rar lcd perrito.rar (325,7 KB (Kilobytes), 68 visitas)
06/04/2014 #2725

Avatar de papirrin

en la configuracion del pic en proteus ponle que corra a una velocidad de 1MHz. teoricamente en la realidad no deberia pasar.
Imágenes Adjuntas
Tipo de Archivo: jpg Dibujo.JPG (46,2 KB (Kilobytes), 14 visitas)
06/04/2014 #2726

Avatar de Alcocer Garcia Felix Davi

bueno papirrin te agradezco el comentario pero como es eso de que en la realidad eso no sucederia??
06/04/2014 #2727

Avatar de papirrin

es que en esa simulacion el pic a 8MHZ envia mas rapido los datos al LCD y se satura. en la realidad el LCD es mucho mas veloz.

si en la realidad pasa prueba con los retardos:

DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us
09/04/2014 #2728


Tambien poedes entrar en la configuracion del LCD en proteus ponle que corra a una velocidad de 20MHz y listo puedes verlo correr a la velocidad que es, claro tienes que volver a colocarle la velocidad al pic, espero me entiendan.
11/04/2014 #2729


Saludos amigos listeros, estoy realizando unos programas en picbasic pro para el 16F628A y tengo una gran duda con las siguientes líneas de programa que no logro entender.
Espero su valiosa ayuda. Gracias de antemano.

Aquí parte del programa:
.....
eprom1="0"

PAUSE 100
READ 0, eprom1
IF eprom1=255 THEN grabar_clave
GOTO Bienvenida

grabar_clave:
Write 0, n1
....

Se supone que eprom1 vale cero. ¿Entonces qué quiere preguntar cuando eprom1=255?
Yo me he dado cuenta que al inicio del programa (con la memoria limpia) siempre se ejecuta "grabar_clave", logrando de esta manera en forma inicial guardar los datos iniciales en n1, n2... en la memoria eeprom para luego introducirlos como la clave.
Pero lo que no entiendo es. ¿Por qué con el IF está preguntando si eprom1=255, por qué no dice otro valor?
Ahora si se ejecuta inicialmente "grabar_clave" es por qué el IF dio un SI.
¿Pero cómo puede dar un SI, si dice que eprom1 (que vale 0) será igual a 255?

Saludos.

Terminator
11/04/2014 #2730

Avatar de papirrin

No cuando inicia asigna el codigo ascii a eprom1 como lo tienes, el que parece ser 48 necesitas quitar las comillas asi:
Código:
n1 var byte
eprom1 var byte

eprom1=0
'aqui siiii... eprom1 vale 0
PAUSE 100
'no tiene sentido que antes declares a eprom1=0 si haces la lectura de la eeprom
READ 0, eprom1
'aqui si no se ha grabado la eeprom con n1 , eprom1 vale 255
IF eprom1=255 THEN grabar_clave
GOTO Bienvenida

grabar_clave:
??? aqui a n1 nunca le dices cuanto vale?
Write 0, n1
pause 10

' debes poner una pausa de 10ms para que complete la grabacion
siempre entra al iniciar porque la memoria por defecto esta en 255 (FF)
12/04/2014 #2731

Avatar de papirrin

Solicito apoyo en picbasicpro + ASM , requiero de hacer un retardo de 100ms en mitad de un codigo, segun yo va asi y me gustaria que me lo revizaran.
FOsc= 20Mhz
Ciclo instruccion .2uS

pseudocodigo:
Código:
 
Define Osc 20
cnt1             var byte
cnt2             var byte
cnt3             var byte

main:
  .
  .
  .
 cnt1=249
 cnt2=3
 Cnt3=100
 asm
 ;retard0 de 100 ms
retardo  
  nop  ;.2uS
  nop  ;.4uS
  nop  ;.6uS
  decfsz  _cnt1,f ;.8uS
  goto    retardo ; 1uS
  decfsz  _cnt2,f ; 250uS*4=1mS
  goto    retardo
  decfsz  _cnt3,f;1ms*100=100mS
  goto    retardo
 endasm 
   .
   .
   .
 Goto main
en lo que me confundo mucho es en la cuenta de los ciclos decfsz
12/04/2014 #2732
Moderador

Avatar de D@rkbytes

papirrin dijo: Ver Mensaje
Solicito apoyo en picbasic pro + ASM , requiero de hacer un retardo de 100ms en mitad de un código.
FOsc= 20Mhz
Ciclo instrucción .2uS
Prueba con este código de retardo (100Ms. @ 20MHz.)
Código:
retardo
    movlw    0x03
    movwf    _cnt1
    movlw    0x18
    movwf    _cnt2
    movlw    0x02
    movwf    _cnt3
retardo_0
    decfsz    _cnt1,f
    goto    $+2
    decfsz    _cnt2,f
    goto    $+2
    decfsz    _cnt3,f
    goto    retardo_0
    goto    $+1
    return
papirrin dijo: Ver Mensaje
en lo que me confundo mucho es en la cuenta de los ciclos decfsz
Mira por aquí: http://www.golovchenko.org/cgi-bin/delay

Suerte.
12/04/2014 #2733

Avatar de papirrin

Gracias Darkbytes

no hay problema que asigne los valores a las variables fuera del retardo no? para que no me "gaste" los microsegundos al declararla, puesto que hago una activacion de interrupcion asi:

pseudocodigo:
Código:
 cnt1=3 'asigno valores de retardo
 cnt2=24
 Cnt3=2
 TMR0L=0
 HIGH GIE  'activo interrupcion
 input F_Port 'cambio puerto a entrada
 asm
retardo  
  decfsz _cnt1,f
  goto $+2
  decfsz _cnt2,f
  goto $+2
  decfsz _cnt3,f
  goto retardo
  goto   $+1
  goto   $+1
  goto   $+1
 endasm  
 output F_Port 'cambio como salida el puerto 
 T0_High = TMR0L ' tomo lectura de tiempo
12/04/2014 #2734
Moderador

Avatar de D@rkbytes

papirrin dijo: Ver Mensaje
Gracias Darkbytes

¿No hay problema que asigne los valores a las variables fuera del retardo? Para que no me "gaste" los microsegundos al declararla, puesto que hago una activacion de interrupcion asi:
Si existe problema si asignas los valores fuera del bucle de retardo ya que se requiere reasignar los valores cada vez que se ingresa a la rutina.

¿Por qué? Por que cada vez que se sale de la rutina quedan almacenados otros valores en las variables.
Por lo tanto la rutina ya no funcionará, tal vez solo funcione la primer vez que se llama.

Y si cargas las variables antes de llamar a la rutina de retardo, da igual que si estuvieran dentro.

Nota:
Me faltó aclarar que al nombre de la rutina también hay que ponerle un guión bajo para poderla llamar.
También se puede nombrar como se hace normalmente con las etiquetas, pero antes de entrar al bloque ASM.

Saludos.
14/04/2014 #2735

Avatar de papirrin

No funciona :(

algo estoy haciendo mal no hace caso a las instrucciones de ASM, sera porque compilo con MPASM?

-utilizo un pic18f2550, y me he dado cuenta que va a 48MHz porque utilizo el PLL5y div 2.
-el codigo no es mas que oscilar un led.

pseudocodigo:
Código:
define osc 48
d1               var byte
d2               var byte
d3               var byte
main:
 
 toggle led1
  asm
	movlw	0xA3
	movwf	_d1
	movlw	0x9E
	movwf	_d2
	movlw	0x03
	movwf	_d3
Delay_0
	decfsz	_d1, f
	goto	$+2
	decfsz	_d2, f
	goto	$+2
	decfsz	_d3, f
	goto	Delay_0
     
			;6 cycles
 'aqui arroja un warning en los tres goto,
 dice  que el destino de la direccion  debe ser un word  alineado y se pasma el pic, 
si los  quito no se pasma pero no hace el retardo
(Warning:destination address must be word aligned)
	goto	$+1 
	goto	$+1 '  
	goto	$+1

 endasm

Goto Main
el algoritmo de retardo si lo hago desde MPLAB si funciona en un pic 16f628A

mi opinion es que no funcionan los $+1 y $+2 creo

---------- Actualizado después de 10 minutos ----------

Vaya!!!!!!!

si era eso no reconoce los $+1 y $+2
lo deje asi y funciona
psudocodigo:
Código:
	movlw	0xA3
	movwf	_d1
	movlw	0x9E
	movwf	_d2
	movlw	0x03
	movwf	_d3
Delay_0
	decfsz	_d1, 1
    goto	ex1
	decfsz	_d2, 1
ex1	
    goto	ex2
	decfsz	_d3, 1
ex2	
	goto	Delay_0
17/04/2014 #2736

Avatar de papirrin

Amigos no se si ya lo mencionaron pero hoy me acabo de enterar, en el MicrodeStudio 5 con PBP3 se pueden utilizar Variables tipo Long de 32Bits, solo se tiene que poner en la linea de commando un -n

asi:
Imágenes Adjuntas
Tipo de Archivo: jpg Dibujo.JPG (38,4 KB (Kilobytes), 16 visitas)
17/04/2014 #2737
Moderador

Avatar de D@rkbytes

papirrin dijo: Ver Mensaje
Amigos, no sé si ya lo mencionaron pero hoy me acabo de enterar, en el MicrodeStudio 5 con PBP3 se pueden utilizar Variables tipo Long de 32Bits, solo se tiene que poner en la línea de comando un -n
Sip, pero únicamente funciona con los PIC18

La ayuda de PBP3 dijo:
Use Compiler Long Words. If enabled, LONG variables are made available. This mode is only available when compiling for a target device with the PIC18 prefix. LONG variables are interpreted as twos-complement, signed values.
Saludos.
17/04/2014 #2738

Avatar de papirrin

no habia visto eso , bueno ya es un avance hacia los 32bits XD
18/04/2014 #2739


Duda programa 16f88 para entrada analogica y PWM
Hola amigos,

Estoy aprendiendo poco a poco en esto de programar PIC en PBP , y temas de entradas y salidas digitales, mas o menos lo controlo (al menos lo básico).
Me gustaria en un 16f88, tener una entrada analogica con un potenciometro entre 0 y 5v, y una salida PWM para poder controlar un servomotor que varie su posicion segun el valor del potenciometro.
e estado pensando el asunto y e visto q el funcionamiento de un joystick es algo parecido y me gustaria intentarlo asi que si me podrian ayudar estaria agradecido

Me podeis orientar un poco sobre como diseñar el programa.

Gracias!!!! ...
19/04/2014 #2740

Avatar de papirrin

Me gustaria en un 16f88, tener una entrada analogica con un potenciometro entre 0 y 5v,
ve la funcion pot

una salida PWM para poder controlar un servomotor que varie su posicion segun el valor del potenciometro.
puedes ver la funcion PWM, aunque no estoy muy seguro si lo que necesitas es un PWM por hardware.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.