¿Por qué mi Arduino DUE no reconoce mi interrupción externa?

1

Simplemente estoy intentando que mi Arduino DUE alterne un pin basado en un reloj externo.

Tengo un 14.31818 MHz Oscillator que está conectado a un 74HC4040 Counter para poder dividir el reloj a la mitad (7.16 MHz). Esto tendrá otro propósito más adelante.

De todos modos, necesitaré el DUE para ejecutar un código durante cada pulso del reloj de 7.16 MHz, así que por ahora solo estoy alternando un pin y midiéndolo con mi alcance.

También, ya que el valor DUE no es tolerante a 5V en los pines de E / S (así que he leído) Estoy ejecutando la salida Q0 del contador a través de un divisor de voltaje simple que usa dos resistencias (1k y 604) ). Cuando mido la salida del contador / divisor, obtengo una señal de 7.149 MHz (lo suficientemente cerca) con un Vpp de 3.28V. Como se puede ver en la imagen.

PerocuandopongoesamismasalidaenunadelasentradasDUE,noobtengonada.

Aquíestámicódigo:

intpin=53;volatileintstate=LOW;voidsetup(){pinMode(pin,OUTPUT);attachInterrupt(A0,blink,CHANGE);}voidblink(){state=!state;}voidloop(){digitalWrite(pin,state);}

ObservequetengolainterrupciónasociadaaA0(tambiénprobéelpin52)ylasalidavinculadaalpin53.

¿Quémeestoyperdiendo?

Gracias

ACTUALIZAR

Bien,tengoestaplacadedesarrolloquetieneungeneradordeimpulsosincorporado.CambiélaentradadeA0alasalidadeesegeneradordeimpulsos(funcionandoa1KHz)yrecibounaseñallimpiadelDUEamedidaquePuedever:

Por lo tanto, obviamente no le gusta mi señal de voltaje dividido. ¿Cómo puedo limpiar eso y hacerlo más "cuadrado"? ¿O es esta una pregunta separada?

Gracias

** SOLUCIONADO **

@gbulmer lo tuvo en cuenta. Tiene sentido total cuando lo pienso. 7+ millones de entradas por segundo es simplemente demasiado rápido para activar la interrupción externa (especialmente con el código Arduino incorporado). No estoy seguro de cuál podría ser la frecuencia de entrada máxima incluso usando bit banging / asm pero no vale la pena para mi circuito. Voy a rediseñarlo e intentar algo diferente. Pero en una nota al margen, usé el 74HC4040 e iteré a través de cada salida (que corta la señal cada vez) para ver cuándo se rompió. Bajé a 57KHz antes de ver cualquier tipo de señal. Y estaba bastante sucio de nervios, pero funcionó.

Por lo tanto, 57 KHz es WAAAAY apagado desde 7MHz. Jajaja

Así que estoy decepcionado de que mi idea no haya funcionado, pero es IMPRESIONANTE que ahora entiendo por qué. :-) ¡Gracias!

    
pregunta cbmeeks

1 respuesta

3

Es probable que el Arduino Due no pueda responder lo suficientemente rápido.

Un Arduino Due funciona a 84MHz. Esas interrupciones llegan más rápido que cada 12 ciclos de reloj.

El tiempo de respuesta de interrupción para un ARM-CortexM3 / 4 es un mínimo absoluto de 12 ciclos de reloj, solo para iniciar la rutina de servicio de interrupción, y eso sin hacer nada. Eso es peor por el mecanismo de inserción de Arduino de la biblioteca. Adivina 20 ciclos y podríamos seguir siendo optimistas.

Prueba esta hipótesis.

O bien:

  • use una segunda MCU para generar señales más lentas que pueden ser fácilmente aceleró hasta llegar al punto de ruptura, o
  • si tiene acceso a un generador de señal que lo use, o
  • use un temporizador (PWM) en el Vencimiento para generar la señal de entrada.

Editar:
Creo que tendrá dificultades para sincronizar con un reloj NTSC 7MHz externo, y las interrupciones lo empujarán más allá de lo posible.

Puede generar el reloj de 7 MHz con un temporizador de vencimiento e intentar sincronizar ese temporizador con el reloj externo en cada cuadro o línea de escaneo. No será perfecto, pero podría estar lo suficientemente cerca.

    
respondido por el gbulmer

Lea otras preguntas en las etiquetas