¿Cómo puedo ver una salida de SCL?

0

Soy nuevo en electrónica, circuitos, etc. Actualmente estoy leyendo I2C y comunicaciones en serie sincrónicas. Según tengo entendido, dos dispositivos deben estar conectados al mismo cable de RELOJ para que el esclavo sepa a qué velocidad interpretar los datos porque es posible que no tenga un reloj interno. Ahora, quería ver qué tan rápido oscila el pin SCL en Arduino Uno conectando un LED a él y GND y esperaba que el LED parpadeara rápidamente. Por supuesto, como creo, atenué la frecuencia a 1 utilizando la biblioteca Wire.h y llamando

Wire.setClock(1);

como se dice aquí . El LED aún no parpadeaba como lo esperaba, una vez por segundo. ¿Qué está mal? ¿Cómo se comporta SCL en realidad? ¿Oscila de 0V a 5V periódicamente o debo hacerlo manualmente en el código?

EDIT

El boceto completo fue el siguiente

#include <Wire.h>


void setup() {
  // put your setup code here, to run once:
  Wire.setClock(1);
}

void loop() {
  // put your main code here, to run repeatedly:

}

EDIT 2

Construí un circuito. El LED está encendido pero no parpadea. También intenté cambiar la frecuencia en el código de 1 a diferentes valores hasta 100000.

EDIT 3

¡Parpadea! Pero no estoy seguro de que en realidad SCL lo haga parpadear. Agregué Wire.begin() en setup() y comencé junto con terminar una transmisión en el loop() . Pero no reacciona a los cambios en setClock(frequency) . También intenté poner un retraso o enviar un texto largo y aleatorio con Wire.write() entre Wire.beginTransmission(0xA3) y Wire.endTransmission() . Luego simplemente parpadea una vez (tal vez varias veces pero rápido) al principio y luego deja de parpadear solo por estar encendido. El código completo es

#include <Wire.h>


void setup() {
    // put your setup code here, to run once:
    Wire.setClock(32000);
    Wire.begin();
}

void loop() {
    // put your main code here, to run repeatedly:
    Wire.beginTransmission(0xA3); //arbitrary address
    Wire.endTransmission();
}
    
pregunta Turkhan Badalov

3 respuestas

2

La frecuencia mínima a la que puede funcionar su reloj I2C (vea el final para más detalles) es mucho mayor de lo que podrá ver. Sus ojos físicamente no pueden verlo parpadear a > 30 [kHz] . A lo sumo, verá que el LED es un poco más tenue de lo esperado mientras se envían los datos; puede parecer un solo parpadeo para todo el paquete I2C.

Además, si ha conectado su LED desde el pin a GND, tampoco verá nada ya que I2C está abierto. Eso significa que solo puede hundir corriente. Tendría que conectar el LED con ánodo a + 5V (a través de la resistencia), y el cátodo al pin SCL. Pero, de nuevo, no podrías ver nada. Veo que no es de tu foto.

Además, el reloj I2C no se está ejecutando constantemente. La salida del reloj se produce solo cuando se envían datos. Como su código nunca envía un paquete I2C (la función loop() está vacía), el núcleo I2C nunca generará un reloj.

Una vez que comiences a generar paquetes, aún no verás el reloj parpadeando a su frecuencia real. Es posible que lo vea "parpadear", pero la duración del parpadeo realmente contendrá múltiples paquetes I2C. Esto es exactamente igual a cómo puedes hacer que un LED se atenúe mediante el uso de PWM: ves la disminución del brillo, pero no puedes ver la frecuencia real de PWM.

Si desea ver la señal del reloj, necesitará algún tipo de analizador lógico.

Debido a las limitaciones de hardware, el ATMega328 no puede ejecutar la frecuencia de reloj de I2C a 1Hz (usando el hardware I2C). Independientemente de lo que la API que está utilizando le permite ingresar.

La fórmula para calcular la velocidad en baudios es:

$$ f_ {SCL} [Hz] = \ frac {f_ {CPU}} {16 + 2 \ cdot TWBR \ cdot Prescaler} $$

Donde el registro \ $ TWBR \ $ es un valor de 8 bits. \ $ Prescaler \ $ tiene un máximo de 64, pero en el caso de Arduino se establece en 1 (se puede obtener del cálculo del código fuente que se está utilizando). Esto da:

$$ f_ {SCL (min)} [Hz] = \ frac {16 [MHz]} {16 + 2 \ cdot 255 \ cdot 1} = 30.418 [kHz] $$

La API setClock está escrita sorprendentemente, ya que no proporciona ninguna forma de comprobación de errores. En su caso, cuando intenta establecer un valor de 1, esto intentará escribir un valor de 7999992 en el registro \ $ TWBR \ $ de 8 bits, lo que provocará un desbordamiento que en realidad establecerá la tasa de I2C en 30.418kHz.

    
respondido por el Tom Carpenter
0

NO PUEDES conducir el SCL a 1 Hz a velocidades de reloj MCU normales (16MHz).

Lea la información de configuración de TWI en Hoja de datos de ATMega328P , consulte la página 266

Dado que TWBR es un registro de 8 bits, el divisor en la fórmula de velocidad de bits está limitado (también limitado por el prescaler).

    
respondido por el Jack Creasey
0

Otros han abordado el problema de reducir la velocidad de transmisión I2C establecida por el maestro de bus Arduino.
El uso de un LED en un intento de ver señales digitales rápidas es un pobre sustituto para un osciloscopio, pero a veces debemos usar herramientas inadecuadas. Le sugiero un ligero cambio en su circuito de prueba, para mejorar las posibilidades de ver algo útil ...

Nuestros ojos ven pulsos de luz en un fondo oscuro mucho mejor que los pulsos de oscuridad en un fondo claro. Por lo que puedo ver en su foto, la sonda LED que ha construido está conectada de la siguiente manera. R1 mantiene el LED encendido, hasta que los impulsos de SCL bajan hacia el suelo, creando una oscuridad momentánea:

simular este circuito : esquema creado usando CircuitLab


El circuito anterior funciona, pero podría funcionar mucho mejor si los pulsos de SCL realmente encendieran el LED: cuando no lleguen los pulsos de SCL (el bus I2C está inactivo), el LED se apagará.
El siguiente circuito hace exactamente eso, iluminándose solo cuando los pulsos de SCL están activos. Además, será más probable que los dispositivos I2C conectados al bus funcionen correctamente:

simular este circuito Tenga en cuenta que no hay conexión a tierra. El pin Arduino SCL baja activamente al suelo. La corriente fluye desde el suministro de + 5V, a través del LED, hacia el pin SCL del Arduino, y dentro del chip encuentra su camino a tierra. Cuando el bus I2C está inactivo, el pin SCL de Arduino flota a nivel lógico alto y no fluye corriente: el LED está oscuro.
Es posible que aún no vea los pulsos SCL individuales (sus ojos se mezclan a una velocidad de pulso más rápida que unos veinte por segundo). Pero tendrás una mejor oportunidad de ver la actividad del autobús.

    
respondido por el glen_geek

Lea otras preguntas en las etiquetas