-
Notifications
You must be signed in to change notification settings - Fork 27
-
Notifications
You must be signed in to change notification settings - Fork 27
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Eliminar delayMicroseconds() #35
Comments
Me contesto yo mismo porque veo la solución más sencilla: case SENDING:
if ((*_hwSerial).availableForWrite() < SERIAL_TX_BUFFER_SIZE - 1) { //TX buffer not empty
tMicros = micros();
return false;
}
// time to send last byte and required empty time space
if ( micros() - tMicros() <_T2_5 ) return false;
// clean RX buffer
while ((*_hwSerial).available()) (*_hwSerial).read();
// MAX485 Receiving mode
digitalWrite(_TxEnablePin, LOW);
_state = RECEIVING;
//starts slave's timeOut
_timeoutMillis = millis();
frameSize = 0;
return false; |
Esto no me parece buena idea. Para llegar a este nivel se tendria que trabajar con interrupciones ya sean por tiempo (puede haber conflictos con otras librerías que utilizan los diferentes timers). Para ser mas preciso se puede trabajar con la interrupciones del periférico UART. Los AVR se pueden configurar para producir una interrupción cuando se ha enviado el ultimo bit, es problemático ya que difieren ligeramente dependiendo del microcontrolador y seria muy complicado portarlo a ESP8266 |
Reabro |
Expongo al detalle como lo veo:
No parece razonable plantear baudrate mayores de 19200 con un procesador 328, así que el tiempo disponible para cortar está entre 573 us y 2.578 us. Debido a una posible detección tardía del buffer vacío, planteo el corte a T2.5. Por otro lado, utilizar un |
En otras librerias como |
Existe una diferencia importante entre Arduino y el ESP8266 con respecto a |
En el caso del esp8266 no me complicaria mucho la vida, mas que nada porque Pero en cualquier caso... tu decides El 24 de enero de 2016, 20:25, Jaime García notifications@github.com
|
Para hacer más eficiente el código y permitir la ejecución de otros procesos sin retrasos es necesario eliminar
delayMicroseconds()
que puede introducir una parada en el procesador de hasta 11.458 microsegundos a 2400 bauds.Ahora está así:
La función comprueba el buffer TX, cuando está vacio significa que el último byte se encuentra en el registro de TX del UART, por lo que se para hasta asegurar que se ha enviado y además le datos un espacio vacio de T1.5.
Para la nueva función se establece un timer
sendMicros
y un intervalosending_interval
antes de la funciónsendBuffer()
y en el siguiente estadoSENDING
realizaría la comparación para cambiar al siguiente estado.Me preocupa que el UART valla mas deprisa o despacio que, con lo que se pueden presentar dos problemas:
Voy a hacer pruebas de timing en microsegundos para confirmar, me falta un osciloscopio para analizarlo correctamente.
The text was updated successfully, but these errors were encountered: