Autor Tema: Interrupción en asm dentro de XC8  (Leído 4626 veces)

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

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Interrupción en asm dentro de XC8
« en: 16 de Septiembre de 2018, 18:19:54 »
Estoy haciendo una interrupción del TIMER1 en XC8 en asm de la siguiente forma:

Código: C
  1. void interrupt INTERRUPT_InterruptManager() {
  2.   #asm
  3.   _asm
  4.  
  5.   nop
  6.   nop
  7.   nop
  8.   nop
  9.   nop
  10.   nop
  11.   nop
  12.   bcf   PIR1,0      ;borra flag timer1
  13.   _endasm
  14.   #endasm
  15. }

Si pongo un punto de ruptura en el primer nop, desde que se produce la interrupción hasta que llega a ese punto, pasan 11 o 16 ciclos de instrucción, dependiendo de si uso la compilación profesional o la estándar; no quiero que dependa de eso, puede que incluso de una versión a otra de xc8 cambie ¿Hay alguna manera de incluir el vector de interrupción en asm? si no creo que no queda más remedio que hacer todo el programa en asm.

Gracias!!! un saludo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupción en asm dentro de XC8
« Respuesta #1 en: 16 de Septiembre de 2018, 18:45:57 »
No entiendo cual es tu propósito de realizar eso...
Obviamente que depende de la frecuencia a que te manejes, pero 11 a 16 ciclos para salvar el contexto e ir a la interupcion no veo cual es el problema.

Si estas tan jugado por esos ciclos en el tiempo, considero que deberias estar buscando mas frecuencia.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re:Interrupción en asm dentro de XC8
« Respuesta #2 en: 16 de Septiembre de 2018, 18:53:16 »
No entiendo cual es tu propósito de realizar eso...
Obviamente que depende de la frecuencia a que te manejes, pero 11 a 16 ciclos para salvar el contexto e ir a la interupcion no veo cual es el problema.

Si estas tan jugado por esos ciclos en el tiempo, considero que deberias estar buscando mas frecuencia.

El PIC funciona a 20MHz y pretendo hacer un frecuencimetro de hasta 50MHz, lo más preciso posible, entonces hay un error de 10Hz por cada ciclo de instrucción, puedo medir la base de tiempo en simulación, y calcular la frecuencia con ese dato, pero no quiero que dependa del compilador.

Saludos!!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupción en asm dentro de XC8
« Respuesta #3 en: 16 de Septiembre de 2018, 23:48:39 »

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re:Interrupción en asm dentro de XC8
« Respuesta #4 en: 17 de Septiembre de 2018, 17:48:09 »
Está bien la idea, lo que no sé es como de estable y preciso es el TIMER1 con un cristal de 32765Hz, frente a un TCXO de 20MHz.

En el foro vi un frecuencimetro diseñado por Picuino con un PIC18F2550, pero los archivos ya no funcionan. Por lo que vi, toma una diferencia de tiempo y otra de pulsos contados, y de ahí calcula la frecuencia.

Saludos!!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #5 en: 18 de Septiembre de 2018, 11:10:54 »
Si es para un frecuencimetro, puedo ayudar.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #6 en: 18 de Septiembre de 2018, 17:34:17 »
¿Qué precisión quieres conseguir?

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re:Interrupción en asm dentro de XC8
« Respuesta #7 en: 19 de Septiembre de 2018, 13:11:50 »
¿Qué precisión quieres conseguir?

Quisiera que a fondo de escala (50MHz) tenga un error de +/-10Hz, y me gustaría hacerlo con un pic pequeño, de 8 patas, para visualizar el resultado en un PC via RS232, o en un LCD que funcione via puerto serie, no sé si es posible, por las cuentas que he hecho, si uso un timer para contar y otro para la base de tiempo, por interrupción, cuando se dé el caso de que se produzcan a la vez, la base de tiempo o el contador se verán afectadas.

Gracias, un saludo!!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado Yoshua

  • PIC16
  • ***
  • Mensajes: 200
Re:Interrupción en asm dentro de XC8
« Respuesta #8 en: 19 de Septiembre de 2018, 13:51:48 »
Para la frecuencia, los incrementos de desborde del timer contador se hacen en un bucle que espera a que el tiempo de base termine. Se me ocurre que la manera de hacerlo seria que en la interrupción manejada en asm habilite y deshabilite el timer en la misma cantidad de ciclos de instrucción.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #9 en: 19 de Septiembre de 2018, 15:11:31 »
Se puede hacer, pero vas a tener varios problemas.

Esa precisión es imposible con un xtal normal, que puede variar eso al aumentar un poco la temperatura. Necesitas un tcxo y te costará encontrar uno con esa precisión. Con 1ppm (+-50) ya puedes darte por satisfecho. En ebay hay ocxo de segunda mano por 20€, con los que puedes conseguir esa precisión.

Esa resolución se puede conseguir sin problema. Está justo en el límite de los números en coma flotante.

Yo he hecho experimentos con el pic16f628 y funciona para lo que tu quieres. Otros micros más modernos tienen muchos periféricos que ayudan, pero la señal de entrada está limitada al sincronizarla siempre con el oscilador interno. No te los recomiendo.
« Última modificación: 19 de Septiembre de 2018, 15:14:46 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #12 en: 19 de Septiembre de 2018, 15:25:49 »
Te recomiendo que compres un receptor gps, para afinar la base de tiempos. Puedes encontrar uno en ebay por unos 10Euros. Te dará un pulso por segundo con una precisión de 100ns (0,1ppm) y aún más precisión si cuentas varios pulsos durante un minuto.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #13 en: 19 de Septiembre de 2018, 15:35:11 »
Si quieres experimentar, esto tiene la precisión que necesitas:

Homebrew ocxo
« Última modificación: 19 de Septiembre de 2018, 15:37:12 por Picuino »

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re:Interrupción en asm dentro de XC8
« Respuesta #14 en: 20 de Septiembre de 2018, 13:13:48 »
Que tal uno de estos con un divisor de frecuencia?

https://www.tme.eu/es/details/i547-2p3-40.0000m/generadores-de-cuarzo-smd/ilsi/i547-2p3-400000-mhz/

Tengo entendido que si divido entre 2 la frecuencia, mejora en igual cantidad la precisión y la estabilidad.

Para hacer pruebas ¿Que tal es de fiable simular en Proteus? para obtener una base de tiempos teórica que funcione, luego habría que afinar en la práctica.

Saludos!!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡