Autor Tema: PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)  (Leído 859967 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #510 en: 18 de Febrero de 2009, 20:37:49 »
Lo tienes en el menu Options/Configuration Bit



Que yo sepa no se puede.
Saludos desde Granada, España.

Desconectado firewarrior

  • PIC10
  • *
  • Mensajes: 5
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #511 en: 22 de Febrero de 2009, 17:15:38 »
Hola, ¿existe alguna instruccion para poner el pic en modo sleep en este lenguaje?, me estoy volviendo loco y no encuentro nada.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #512 en: 22 de Febrero de 2009, 21:59:10 »
No la hay, hasta ahora no he tenido que usar el modo sleep del PIC, pero eso se consigue modificando el  registro adecuado y para eso lo mejor es echarle un vistazo al datasheet del micro.


PD: Se inserta la linea ASM SLEEP en nuestro código y el micro pasa a estado de bajo consumo. Sleep es una instrucción maquina que es insertada en nuestro código mediante la directiva ASM.
« Última modificación: 05 de Octubre de 2010, 19:53:02 por dogflu66 »
Saludos desde Granada, España.

Desconectado _Lince_

  • PIC10
  • *
  • Mensajes: 12
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #513 en: 04 de Marzo de 2009, 09:16:20 »
A unica forma é  usar (ASM:   Sleep) , se ao menos pudesse fazer (symbol  dorme = asm: sleep),mas não é
possivel.Creio que deva haver como faze-lo em próximas versões!! :) vamos aguardar!!!!
At.
_Lince_

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #514 en: 06 de Marzo de 2009, 07:23:46 »
Hola a todos

Una pregunta, para determinar el tiempo que tarda una rutina determinada en el PSI, ¿ como se hace ? Hay algún modo de parar la ejecucion del programa para ver el tiempo que ha tardado hasta esa instruccion, o entre instrucciones.

Según las indicaciones de Dogflu66, etoy intentando adaptar el programa que tenia hecho y publicado aqui en el foro utilizando interrupciones, pero necesito saber como saber el tiempo que empleo para ver si mejoro el rendimiento del programa. Ahora no se como hacerlo y cuando el programa llega a la instruccion end el tiempo sigue contando y las instrucciones tambien.

Alguna sugerencia

Sal U2 y gracias

Desconectado _Lince_

  • PIC10
  • *
  • Mensajes: 12
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #515 en: 06 de Marzo de 2009, 15:15:19 »
Basta usar  a instrução break antes da rotina e depois da mesma, guando o programa ali parar, clic com o botão
esquerdo do rato sobre o contador de ciclos na janela principal da IDE, após isso é só rodar o programa passo á passo
ou outro modo qualquer.Na próxima parada você terá o tempo da sua rotina. :)
At.
_Lince_
« Última modificación: 06 de Marzo de 2009, 16:25:00 por _Lince_ »

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #516 en: 06 de Marzo de 2009, 20:49:01 »
Graciasssss, ya he aprendido  algo mas


Desconectado sanpic

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 430
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #517 en: 07 de Marzo de 2009, 17:47:43 »
Hola amigos.
Alguien podria tener el archivo subido por Lince ? , ya ha caducado el mismo.


Minha contribuição inicial!!
Fontes!!
http://rapidshare.com/files/158984877/Automa__o.zip.html


Saludos a todos.
IF you_know = true THEN                                 
     share_it
ENDIF

Desconectado _Lince_

  • PIC10
  • *
  • Mensajes: 12
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #518 en: 09 de Marzo de 2009, 09:37:42 »
Ai vai!!!

http://rapidshare.com/files/207118345/Automa__o.zip.html
MD5: 2FF8AC41070C994462CEF80C96B5DD59

At.
_Lince_

Desconectado sanpic

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 430
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #519 en: 09 de Marzo de 2009, 23:35:08 »
Gracias   :)



Saludos a todos.
IF you_know = true THEN                                 
     share_it
ENDIF

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #520 en: 10 de Marzo de 2009, 08:51:39 »
Otra pregunta mas

En el pic simulator ide hay una opcion que es guardar la memoria, y no se si es que lo entiendo mal o que, pero me interesa cargar los datos de la memoria de un programa a otro y no se como hacerlo pues cuando cargo el programa nuevo me borra la memoria y cuando cargo el archivo de la memoria borro el programa.

Alguien me puede echar un cable ?

Sal U2

Desconectado _Lince_

  • PIC10
  • *
  • Mensajes: 12
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #521 en: 10 de Marzo de 2009, 12:51:20 »
Se compreendi bem a pergunta... .Está opção é para carregar somente o arquivo .hex de algum
programa para simular e etc...É utilizada para engenharia reversa,após carregado o .hex é possivel desassembla-lo
e modifica-lo, voltando a salva-lo na memória como .hex novamente.
At.
_Lince_

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #522 en: 10 de Marzo de 2009, 21:45:45 »
Pues la verdad es que no se me planteo el tema, yo he tenido que guardar algún dato en la EEProm interna y lo introduje a través del programador y posteriormente salvando el .hex, pero claro al compilar de nuevo se pierden los valores de la EEProm en el código fuente y abría que añadirlos de nuevo cada vez.

Pues si te resulta mas fácil que como indica lince, puedes crear una lista en el código fuente y antes de ejecutar el main pasar todos estos valores a la EEProm hasta que el código este depurado. Una vez añadidos de nuevo a través del programador y salvados ya te quedan en el archivo .Hex para siguientes volcados en PIC. El problema de esta solución es que consume memoria flash ya que tienes que guardar los datos en un principio en ella para poder transferirlos.

También puedes crear un archivo de texto y tansferir con el hyperterminal al pic utilizando una pequeña rutina de entrada de datos serie que irá guardando estos en la EEProm hasta que el código este terminado.

Otra opción es la de hacerse de un programador o quemador que tenga esta opción por separado, es decir que integre los dos archivos, a programar en la flash y el archivo a programar en la EEProm interna.

PD: Imagino que cuando dices memoria te refieres a la memoria interna EEProm del pic.
« Última modificación: 10 de Marzo de 2009, 21:48:58 por dogflu66 »
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #523 en: 11 de Marzo de 2009, 08:20:17 »
Si me refiero a la EEPROM, y precisamente hoy he encontrado la solucion que me comentas del grabador. tengo un pickit 2 y permite esa opción, gracias a los dos.

He modificado el programa añadiendo interupciones para gestionar mejor las lecturas de los ADC, que permiten modificar los valores de la entrega de potencia (es un mando de slot) y ahora me enfrento a un nuevo problema, resulta que mediante la simulacion en el PIC, parece funcionar todo bien , pongo el oscilador y veo la frecuencia de salida del PWM y regula bien, y en cambio pongo el PIC en el mando y a partir que incremento la entrada del ADC1 ya me entrega toda la potencia en el mando.

En cambio si reinstalo el programa tal como estaba anteriormente sin usar interrupciones funciona bien, ¿alguna idea de que hago mal o de que puede ser ?

Por cierto que el uso de la memoria EEPROM es porque me planteo hacer un nuevo mando que use un USB y poder grabar solo los datos de la memoria desde el PC (Casi na!!, y mas si ya me atasco ahora)



Sal U2




Código: [Seleccionar]
'***************************************************************************************
'NOMBRE: 16F88_MandoJEVO_01
'MICRO: PIC16f88
'Version: 2.0
'Utilización de interrupciones
''**************************************************************************************

Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define ADC_SAMPLEUS = 10
'Define ADC_CLOCK = 5

Dim duty(15) As Byte  'Duty Cicle
Dim curva(15) As Byte  'Curva grabada
Dim vg As Byte  'Valor gatillo
Dim ca As Byte  'Curva actual
Dim cn As Byte  'Curva nueva
Dim mca As Byte  'Modificacion curva actual P5
Dim mcn As Byte  'Modificacion curva nueva  P5
Dim asa As Byte  'Antispin Actual P4
Dim asn As Byte  'Antispin nuevo P4
Dim ai As Byte  'Contador inicio
Dim af As Byte  'Contador fin
Dim a As Byte  'contador
Dim b As Byte
Dim va(4) As Byte
Dim mc(3) As Byte
Dim i As Byte

'---------------Variables el timer-------------------
Dim t1_ms As Byte  'Base de tiempos del timer 1
Dim t1_ms_t As Byte  'Contiene el valor de t1_ms
Dim t2_ms As Byte  'Base de tiempos del timer 2
Dim t2_ms_t As Byte  'Contiene el valor de t2_ms
Dim t3_ms As Byte  'Base de tiempos del timer 3
Dim t3_ms_t As Byte  'Contiene el valor de t3_ms

'--------------Definición de puertos
ANSEL = %00100011  'Los pin digitales y NA5, NA1 y NA0 como analogicos
TRISB = %11110111  'Configuración input/output
TRISA = %11111111  'Configuración input/output
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
ADCON0 = %00100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
ADCON1 = %10000000  'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
'--------------Configuracion Interrupciones -----------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer 1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'Factor de preescaler del timer 1, 0
T1CON.T1CKPS1 = 0  'Factor de preescaler del timer 1, 0
TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48

'-------------Carga los valores iniciales del timer ------------------------

t1_ms = 0
t2_ms = 0
t3_ms = 0
t1_ms_t = 3  'Valor para el  timer del P4  Arranque
t2_ms_t = 5  'Valor para el timer del P5 Curva
t3_ms_t = 200  'Valor para el timer del selector de curva

'---------------------Habilita las interrupciones --------------------------------------
T1CON.TMR1ON = 1  'Habilita el timer 1, comienza a incrementar
PIE1.TMR1IE = 1  'Activa la interrupcion del timer
INTCON.PEIE = 1  'Bit de habilitación de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales

'****************************************************************************


'Ver curva actual
Gosub vercurva
Gosub leermemoria
Gosub modificarcurva
Gosub modificararranque

'Activo el PWM
PWMon 1, 9
PWMduty 1, 0

'Rutina principal
loop:
'For i = 1 To 240  'Bucle solo para pruebas de tiempos

'Leo el valor del gatillo
ADCON0.CHS0 = 1  'Selecciono canal NA1 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 0
'ADCON1.ADFM = 1  'Activaria lectura 10bit del ADC
ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend
'vg.HB = ADRESH  'ADC a 10bit
'vg.LB = ADRESL  'ADC a 10bit
vg = ADRESH  'ADC a 8 bit

Select Case vg
Case < 16
PWMduty 1, 0  'Freno
Case < 32
PWMduty 1, duty(0)
Case < 48
PWMduty 1, duty(1)
Case < 64
PWMduty 1, duty(2)
Case < 80
PWMduty 1, duty(3)
Case < 96
PWMduty 1, duty(4)
Case < 112
PWMduty 1, duty(5)
Case < 128
PWMduty 1, duty(6)
Case < 144
PWMduty 1, duty(7)
Case < 160
PWMduty 1, duty(8)
Case < 176
PWMduty 1, duty(9)
Case < 192
PWMduty 1, duty(10)
Case < 208
PWMduty 1, duty(11)
Case < 224
PWMduty 1, duty(12)
Case < 240
PWMduty 1, duty(13)
Case <= 255
PWMduty 1, duty(14)
EndSelect

If t1_ms >= t1_ms_t Then

'Leo el valor de p4 ADC 5
ADCON0.CHS0 = 1  'Selecciono canal AN5 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 1
ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend

asn = ADRESH  'ADC a 8bit
If asn <> asa Then Gosub modificararranque
t1_ms = 0
Endif


If t2_ms >= t2_ms_t Then
'Leo el valor de p5 ADC 0
ADCON0.CHS0 = 0  'Selecciono canal AN0 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 0
ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend
mcn = ADRESH  'ADC a 8bit
If mcn <> mca Then Gosub modificarcurva
t2_ms = 0
t1_ms = 0  'Esto lo hago para impedir que haga las dos lecturas en la misma interrupcion
'lo que convierte t1_ms en 5 tambien pero con un desfase de 2 ms
Endif

If t3_ms >= t3_ms_t Then

Gosub vercurva  'Comprueba que no se haya cambiado la curva
If cn <> ca Then Gosub leermemoria
t3_ms = 0

Endif

'next i  'Bucle para pruebas

Goto loop
End                                               


'********************************************************
'Deteccion de la curva a leer
vercurva:
'Ver curva nueva

cn = 0
If PORTA.4 = 1 Then cn = cn + 1
If PORTA.3 = 1 Then cn = cn + 2
If PORTA.2 = 1 Then cn = cn + 4
If PORTA.5 = 1 Then cn = cn + 8

Return                                           
leermemoria:

'Leer valores Guardados segun la curva a leer
ai = LookUp(0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240), cn  'Posicion inicial de memoria donde leer
af = LookUp(14, 30, 46, 62, 78, 94, 110, 126, 142, 158, 174, 190, 206, 222, 238, 254), cn  'Posicion final de memoria donde leer

For a = ai To af
b = a - ai
Read a, duty(b)
curva(b) = duty(b)
Next a

'Genera los valores para las modificaciones de curvas

va(0) = (curva(10) - curva(4)) / 5  'Calculo maxima modificacion
va(1) = va(0) * 2  '(va(0) * 10) / 5 es el valor de correccion del 100 % multiplicado por 10
va(2) = va(0)  '(va(0) * 10) / (2 * 5)  es el valor de correccion del 50 % multiplicado por 10
va(3) = (va(0) * 10) / 15  '(va(0) * 10) / (3 * 5) es el valor de correccion del 30 % multiplicado por 10
ca = cn


Return                                           



'*************************************************************
'Ajuste fino de la curva grabada
'Rutina para modificar el centro de la curva
modificarcurva:

Select Case mcn
Case < 22  'P -5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(1) * 5) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return                                           

Case < 44  'P -4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(1) * 4) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)
mca = mcn

Return                                           
Case < 66  'P -3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(1) * 3) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)
mca = mcn
Return                                           

Case < 88  'P -2
mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(1) * 2) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return                                           

Case < 110  'P -1
mc(0) = va(3) / 10
mc(1) = va(1) / 10

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return                                           
Case < 145  'P 0
duty(5) = curva(5)
duty(6) = curva(6)
duty(7) = curva(7)
duty(8) = curva(8)
duty(9) = curva(9)


mca = mcn
Return                                           

Case < 165  'P +1

mc(0) = va(3) / 10
mc(1) = va(2) / 10
mc(2) = va(1) / 10

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case < 185  'P +2

mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(2) * 2) / 10)
mc(2) = ((va(1) * 2) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case < 205  'P +3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(2) * 3) / 10)
mc(2) = ((va(1) * 3) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case < 230  'P +4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(2) * 4) / 10)
mc(2) = ((va(1) * 4) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case <= 255  'P +5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(2) * 5) / 10)
mc(2) = ((va(1) * 5) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

EndSelect
Return                                           

'*****************************************************************
'Ajuste del control de arrancada
modificararranque:
Select Case asn
Case < 25  'P 1
duty(0) = curva(0)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 50  'P 2
duty(0) = curva(0) + (((curva(1) - curva(0)) * 50) / 100)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 75  'P 3
duty(0) = curva(1)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 100  'P 4
duty(0) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 125  'P 5
duty(0) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(1) = curva(2)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 150  'P 6
duty(0) = curva(2)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 175  'P 7
duty(0) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(2) = curva(3)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 200  'p 8
duty(0) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(1) = curva(3)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 225  'P 9
duty(0) = curva(3)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(3) = curva(4)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
asa = asn
Return                                           

Case <= 255  'P 10
duty(0) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(2) = curva(4)
duty(3) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 80) / 100)
asa = asn
Return                                           

EndSelect
Return                                           

'----------------------- Interrupciones ------------------------------------------
On Interrupt
Save System
If PIR1.TMR1IF = 1 Then
If t1_ms < t1_ms_t Then t1_ms = t1_ms + 1
If t2_ms < t2_ms_t Then t2_ms = t2_ms + 1
If t3_ms < t3_ms_t Then t3_ms = t3_ms + 1

Endif

TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48
PIR1.TMR1IF = 0  'Borra el flag del salto del tmr1
Resume                                           
                                     

Pd: He actualizado el codigo según las indicaciones de Lince
« Última modificación: 12 de Marzo de 2009, 08:21:49 por 21CURIOSOS »

Desconectado _Lince_

  • PIC10
  • *
  • Mensajes: 12
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #524 en: 11 de Marzo de 2009, 09:13:39 »
Caro 21CURIOSOS!!Analizando o código postado verifico algumas coisas que na prática não se deve
usar.
1- Na rotina de interrupção apenas verifique quem a gerou e transfira o dado do hardware gerador para sua variavel e retorne da mesma.
(Nunca trate suas variaveis dentro da rotina de interrupção,isso não fará seu programa ficar mais rapido,pois quanto mais tempo ficar dentro
da mesma, mais tempo o flag de interrupção geral vai ficar desligado).
2- Nunca chame subrotinas de dentro da rotina de interrupção, isso vai fazer o programa se perder se você não gerenciar a pilha(Stack) corretamente.

Resumindo:
Na boa prática, crie subrotinas sendo chamadas de dentro da rotina principal (main), e use a rotina de interrupção apenas para checar quem
a gerou, transferir o dado do hardware para sua variavel, zerar o flag correspondente e retornar a rotina principal.Dessa forma seu programa
vai ficar rápido e sem riscos de estourar a pilha(Stack). 
« Última modificación: 11 de Marzo de 2009, 09:16:16 por _Lince_ »


 

anything