miliamperios.com

Bootstrap Framework 3.3.6

Más de una docena de componentes reutilizables construidos para proporcionar iconografía, menús desplegables, grupos de entrada, navegación, alertas, y mucho más ...

Todo lo relacionado con el estudio, diseño y funcionamiento de circuitos y componentes electrónicos relacionados con el radio control. Fundado el 4 de Octubre del 2006.

Moderador: Moderadores

Avatar de Usuario
Por Avis
#642774
Hola.
¿que programa he de utilizar para pasar de TXT a hex en la programación de un Pic? tengo el simupic84 , necesito algo mas actual.
Saludos.
Por VICTOR VEGA
#642914
Supongo que si tienes un TXT, dentro de él tendrás el programa en ensamblador o en C (Código fuente entendible por el usuario). Para conseguir un .HEX (Código objeto entendible por la máquina) necesitas un compilador.

Si el programa viene en ensamblador te puedes bajar de forma gratuita el MPLAB de la web de microchip. Con él podrás compilar tu archivo y convertirlo en un HEX para programar el pic.

Si tu programa está en C necesitaras el compilador en el que esté escrito para conseguir el HEX.

Espero que te sirva.

PD. Si pones el archivo en el foro te puedo decir cual es el programa que necesitas exactamente. El simupic84 no lo conozco, pero creo que sólo sirve para simular el comportamiento del microcontrolador.
Avatar de Usuario
Por Avis
#643347
He utilizado el MPASM y perfecto,a ver si me puedes hechar una mano , tengo el programa del pic para poner un servo en dos posiciones mediante un jumper, necesito retardar esta acción unos segundos, que al conectar el jumper no sea instantaneo, te pongo el ASM.



LIST P=PIC16F84

w EQU 0 ;Destino W
f EQU 1 ;Destino registro
RA EQU 05h ;Puerta A
RB EQU 06h ;Puerta B
PORTA EQU 05h ;Puerta A
PORTB EQU 06h ;Puerta B
TRISA EQU 5h ;Registro triestado de Puerta A
TRISB EQU 6h ;Registro triestado de Puerta B
STATUS EQU 03h ;Registro STATUS
OPCION EQU 1h ;Registro OPCION
RBPU EQU 7h ;Bit R de polarizaci¢n
RP0 EQU 05h ;Bit 5 registro STATUS
PDel0 EQU 0Ch
PDel1 EQU 0Dh

;
;************************* Seccion Codigo de RESET **************************
;
ORG 00h ;Direccion del Vector de RESET
GOTO Inicializa ;Comienza el programa
ORG 05h ;Una posicion detras del Vector Interrupcion
;
;**************************** Seccion Inicializa ****************************
;

Inicializa BSF STATUS,5 ;Seleccion Banco 1
MOVLW b'00000000' ;Carga W
MOVWF TRISB ;Bit0 Puerta B salida
MOVLW b'00000001' ;Carga W
MOVWF TRISA ;Bit0 Puerta A entrada
BCF STATUS,5 ;Seleccion Banco 1
CLRF RB


LeerEntrada BTFSC RA,0 ;Comprueba estado interruptor en RA0
GOTO Servo_pos_1 ;Si ra0 = 0 salta y pone el servo en pos. 2
GOTO Servo_pos_2 ;Si ra0 = 1 no salta y pone el servo en pos. 1
GOTO LeerEntrada ; Bucle infinito


;************* Pulso de 0,2 ms para poner el servo en 0º ********************

Servo_pos_1 BSF RB,0 ;Pone a 1 la salida Rb0

;------------------Bucle retardo duracion pulso a 1--------------
PDelay movlw .48 ; 1 set number of repetitions
movwf PDel0 ; 1 |
PLoop0 clrwdt ; 1 clear watchdog
decfsz PDel0, 1 ; 1 + (1) is the time over?
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 cycles delay
PDelL2 clrwdt ; 1 cycle delay
;----------------------------------------------------------------

BCF RB,0 ;Pone a 0 la salida Rb0

;-------------Bucle retardo duracion resto onda hasta 20 ms--------------
PDelayR movlw .86 ; 1 set number of repetitions (B)
movwf PDel0 ; 1 |
PLoop1R movlw .45 ; 1 set number of repetitions (A)
movwf PDel1 ; 1 |
PLoop2R clrwdt ; 1 clear watchdog
PDelL1R goto PDelL2R ; 2 cycles delay
PDelL2R clrwdt ; 1 cycle delay
decfsz PDel1, 1 ; 1 + (1) is the time over? (A)
goto PLoop2R ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (B)
goto PLoop1R ; 2 no, loop
;----------------------------------------------------------------


GOTO LeerEntrada

;************* Pulso de 2,2 ms para poner el servo en 180º ********************

Servo_pos_2 BSF RB,0 ;Pone a 1 la salida Rb0

;------------------Bucle retardo duracion pulso a 1--------------
PDelay_2 movlw .4 ; 1 set number of repetitions (B)
movwf PDel0 ; 1 |
PLoop1_2 movlw .136 ; 1 set number of repetitions (A)
movwf PDel1 ; 1 |
PLoop2_2 clrwdt ; 1 clear watchdog
decfsz PDel1, 1 ; 1 + (1) is the time over? (A)
goto PLoop2_2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (B)
goto PLoop1_2 ; 2 no, loop
PDelL1_2 goto PDelL2_2 ; 2 cycles delay
PDelL2_2 clrwdt ; 1 cycle delay
;----------------------------------------------------------------

BCF RB,0 ;Pone a 0 la salida Rb0

;-------------Bucle retardo duracion resto onda hasta 20 ms--------------
PDelayS movlw .17 ; 1 set number of repetitions (B)
movwf PDel0 ; 1 |
PLoop1S movlw .205 ; 1 set number of repetitions (A)
movwf PDel1 ; 1 |
PLoop2S clrwdt ; 1 clear watchdog
clrwdt ; 1 cycle delay
decfsz PDel1, 1 ; 1 + (1) is the time over? (A)
goto PLoop2S ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (B)
goto PLoop1S ; 2 no, loop
PDelL1S goto PDelL2S ; 2 cycles delay
PDelL2S
;return ; 2+2 Done
;----------------------------------------------------------------
GOTO LeerEntrada


end
Por VICTOR VEGA
#644632
A ver si te puedo hechar una mano. Basicamente tienes un programa que en función del estado de una puerta llama a una rutina u otra:

LeerEntrada BTFSC RA,0 ;Comprueba estado interruptor en RA0
GOTO Servo_pos_1 ;Si ra0 = 0 salta y pone el servo en pos. 2
GOTO Servo_pos_2 ;Si ra0 = 1 no salta y pone el servo en pos. 1
GOTO LeerEntrada ; Bucle infinito

En cada una de las rutinas tienes unos retrasos para la generación del pulso y otro para mantener la señal a nivel bajo hasta terminar el periodo de la señal (20ms). El problema que tienes es que ambas rutinas los tiempos de retraso se calculan en función de constantes en el programa, con lo cual poco puedes hacer. La historia sería poner los bucles de retardo con variables. de esta manera cambiar los 48 que se ponen a capón cargando en PDdel0 el valor de la variable citada.


;------------------Bucle retardo duracion pulso a 1--------------
PDelay movlw .48 ; 1 set number of repetitions
movwf PDel0 ; 1 |
PLoop0 clrwdt ; 1 clear watchdog
decfsz PDel0, 1 ; 1 + (1) is the time over?
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 cycles delay
PDelL2 clrwdt ; 1 cycle delay
;----------------------------------------------------------------



De esta manera, podrías detectar el cambio del estado en la puerta e ir aumentando la duración del pulso a 1 (o disminuyendo) hasta llegar al otro límite. Te escribo un pseudo código de como sería


Bucle PPAL.

Estado Actual= LECTURA_PUERTO(JUMPER);
Si (Estado_Actual==Estado_Anterior) //Seguimos en el mismo estado
{

Si (Jumper==1)
Pulso_a_1=TIEMPO_0º
Si no
Pulso_a_1=TIEMPO_180º
Estado_Anterior=Estado_Actual
}

Si no // Evolución hacia otro estado
{
Si (Jumper==1)
Si (Pulso_a_1>TIEMPO_0º)
Pulso_a_1=TIEMPO_0º+SALTO
Si no
Pulso_a_1=TIEMPO_180º
Estado_anterior=Estado_actual


Si no
Si (Pulso_a_1<TIEMPO_180º)
Pulso_a_1=TIEMPO_180º-SALTO
Si no
Pulso_a_1=TIEMPO_0º
Estado_anterior=Estado_actual

}



donde TIEMPO_180º == Número de cuentas para conseguir 2.2ms
TIEMPO_0º == idem para 0.2 ms
SALTO == Salto en tiempo para la cuenta (incremento) Si lo pones más pequeño se ralentizará más la evolución.


Ya me dirás si te sirve. De todas formas si lo quieres para un tren de aterrizaje ya hay cosas curiosas hechas en internet.

Un Saludo
Avatar de Usuario
Por Avis
#645036
Genial, creo que me puede valer, no he visto nada de esto ya hecho en internet para un tren, si tienes algun enlace te agradeceria su ruta.

Saludos.

¡Elija que Addons deben funcionar, utilice sólo lo que realmente necesita!