Inesperado Atmega16 respuesta en la UART
Breve resumen del problema
He flasheado un Atmega16 con el código que debe resultar en el Atmega16 envío de cualquier carácter que envío a través de un terminal. Puedo obtener una respuesta, pero es rara vez el personaje que me envió. Puedo ver la salida correcta, cambiando la velocidad en baudios, pero no entiendo por qué la velocidad en baudios correcta de las obras.
Más detalles
Estoy tratando de aprender más sobre el firmware de programación en mi propio tiempo porque estoy bastante de disfrutar de ella. Hasta el momento en el firmware de programación que he hecho en la uni, nos han dado el esqueleto de los archivos de código que hacen muchos de los periféricos de interfaz y configurar para nosotros, pero me gustaría aprender esto a mí mismo. Tengo un par de preguntas acerca de lo que estoy haciendo aquí salpicadas a lo largo de los post, pero voy a detallar todos ellos en la final. Si usted recoger en cualquier malentendido o las posibles lagunas en mi conocimiento, yo le agradecería cualquier opinión que pueda tener.
El código
El código que he flasheado en mi Atmega16, está tomado casi línea por línea de la 'Usando la USART en AVR-GCC' tutorial encontrado en esta página. Todos los que he añadido es el #define para F_CPU. El código original no tiene un #define para F_CPU así que mi código no compila en AtmelStudio 7. Podría alguien explicar por qué el autor no ha definido F_CPU en su archivo original? Supongo que puede haber sido el uso de otra herramienta o compilador de Atmel Studio 7 pero no puedo decir con certeza.
#include <avr/io.h>
#define F_CPU 7372800 //this was chosen because the tutorial states this is the frequency we want to operate at
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((( F_CPU / 16) + ( USART_BAUDRATE / 2)) / ( USART_BAUDRATE )) - 1)
int main ( void )
{
char ReceivedByte ;
UCSRB = (1 << RXEN ) | (1 << TXEN ); // Turn on the transmission and reception circuitry
UCSRC = (1 << URSEL ) | (1 << UCSZ0 ) | (1 << UCSZ1 ); // Use 8- bit character sizes
UBRRH = ( BAUD_PRESCALE >> 8); // Load upper 8- bits of the baud rate value into the high byte of the UBRR register
UBRRL = BAUD_PRESCALE ; // Load lower 8- bits of the baud rate value into the low byte of theUBRR register
for (;;) // Loop forever
{
while (( UCSRA & (1 << RXC )) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR
ReceivedByte = UDR ; // Fetch the received byte value into the variable " ByteReceived "
while (( UCSRA & (1 << UDRE )) == 0) {}; // Do nothing until UDR is ready for more data to be written to it
UDR = ReceivedByte ; // Echo back the received byte back to the computer
}
}
El programa de instalación de hardware
- MCU: Atmega16;
- Herramientas: Atmel Studio 7, parpadeando con AVR dragon;
- Fuente de alimentación: 5V ferrocarril tomado de una universidad de la junta de desarrollo (que se toma de USB de la computadora). 100nF de disco de cerámica del condensador utilizado para pasar por encima de la placa de alimentación de las líneas de
- Conversor USB a serie: Este uno. TXD en el conversor USB a serie conectado a RXD Atmega (Pin 15). RXD en el convertidor conectado a RXD en Atmega (Pin 14).
El software de Terminal: Masilla (con la velocidad en baudios de 9600).
La evidencia de las respuestas incorrectas
Para reiterar, el Atmega debe devolver lo que se le ha enviado es decir, la SALIDA debe ser exactamente la misma ENTRADA.
La masilla de salida
\begin{array} \hline \text{INPUT} & \text{OUTPUT} \\ \hline \text{f} & \text{&}\\ \hline \text{f} & \text{6}\\ \hline \text{z} & \text{>}\\ \hline \text{d} & \text{0}\\ \hline \text{space} & \text{0}\\ \hline \text{x} & \text{8}\\ \hline \end{array}
Osciloscopio De Captura
He utilizado mi Picoscope con la decodificación en serie para comprobar que el Atmega está recibiendo la entrada correcta, que parece ser. Por ejemplo, cuando me de prensa de la 'f', es recibido correctamente. La salida es todavía un '6' (o un signo '&' en la ocasión).
Una solución que me topé con que no entiendo
Si puedo cambiar la velocidad en baudios a 2500in Masilla, todo se muestra correctamente. Elegí este valor de forma aleatoria y no sé por qué funciona (esto me lleva a creer que ha cometido un error en alguna parte que ver con la velocidad pero no la puedo ver si he copiado el tutorial casi exactamente... yo pensaba).
Preguntas
- Lo que he hecho mal/¿qué está pasando aquí?
- ¿Por qué el tutorial original no #define F_CPU?
- ¿Por qué la configuración de la velocidad en baudios a 2500 solucionar el problema? (Sospecho que esto va a ser contestado si a la pregunta 1 es contestada)