EmbDev.net

Forum: µC & Digital Electronics AVR128Db48 and USART3


von Mike B. (mike1001)


Rate this post
useful
not useful
Hello everyone, I'm currently porting code from the Xmega32A to the 
AVR128DB48. I've managed to implement all the main routines. What I 
still have ahead of me is a bootloader with UART to load the update and 
then write it to flash. My current problem is the UART. I've been 
working on it for about a week now. No matter what I do, I only get 
"garbage" when sending. I haven't tried reading yet. I'm sending at 9600 
baud. I was able to increase the clock frequency from 4 MHz internal to 
16 MHz with an external crystal, and that works. It have read that the 
internal oscillator is not suitable for UART. I've searched a lot of 
forums and my code is identical to the other examples here and on the 
web. I'm now looking for a hex file for the AVR128 that sends a normal 
text string to the PC, to know if it works at all. I have tested with 
the AVR128 Curiosity Board and with an external RT232rs, and I sometimes 
get something, but only garbage. Maybe someone can help. The best would 
be an ASM code that sends a character. Thanks and greetings from 
Switzerland.

von Mike B. (mike1001)


Rate this post
useful
not useful
yesss.. i have found the problem in my baudrate register:

Integer part: 103 → Bits [15:6] = 0x1A (26 in hex).
Fractional part: 0.1666667 × 64 ≈ 11 → Bits [5:0] = 0x0B.

I forgot to write the fractional part into the register. If I now write 
$1A0B, it works right away! If you stick with it long enough and read a 
lot, you’ll succeed.

Greets
Mike

von Lothar M. (Company: Titel) (lkmiller) (Moderator)


Rate this post
useful
not useful
Mike B. wrote:
> the UART. I've been working on it for about a week now.
> Maybe someone can help.
I'm fairly sure some measurements with an oscilloscope will do the job 
in a few hours. Do you have one?

Edit:
Forgot to send my answer, but as expected

Mike B. wrote:
> i have found the problem in my baudrate register
This problem is found within a few minutes with a scope.

: Edited by Moderator
von Mike B. (mike1001)


Rate this post
useful
not useful
Hi,

No, unfortunately I don't have an oscilloscope.
But it would be worth getting one for problems like this.
I also knew it had to have something to do with the transmission.
Even if I had been able to measure it, I probably still wouldn't have 
understood the problem.
But it's always a nice effect when it becomes clear, and your hand hits 
your head with a loud "oh no"

Greets
Mike

von Lothar M. (Company: Titel) (lkmiller) (Moderator)


Rate this post
useful
not useful
Mike B. wrote:
> Even if I had been able to measure it, I probably still wouldn't have
> understood the problem.
You would have found out, that the time for one bit is not 104us as it 
must be for 9600 baud.
And you would have been able to measure the clock frequency.
The only thing between those both is the prescaler.
And with all this information you would have digged in the right hole 
without spending time in trying this and that.

Mike B. wrote:
> But it would be worth getting one for problems like this.
For sure.
Debugging serial interfaces (pixel-leds, SPI, I2C, RS232, ...) without a 
scope is like driving blindly: you do not know if you are on the rigt 
way, you just recognize that somethings going wrong.

von Mike B. (mike1001)


Rate this post
useful
not useful
Hi Sarah,

thanks for this Information.

Greets
Mike

von Grayson (graysonholt)


Rate this post
useful
not useful
Mike B. wrote:
> yesss.. i have found the problem in my baudrate register:
>
> Integer part: 103 → Bits [15:6] = 0x1A (26 in hex).
> Fractional part: 0.1666667 × 64 ≈ 11 → Bits [5:0] = 0x0B.
>
> I forgot to write the fractional part into the register. If I now write
> $1A0B, it works right away! If you stick with it long enough and read a
> lot, you’ll succeed.
>
> Greets
> Mike

Same here, I was having same problem.

von Johann L. (gjlayde)


Rate this post
useful
not useful
The USART_t.BAUD field in the USART_T struct is a 16-Bit register.  All 
you have to do is to write the calculated 16-bit value to that 
component:
1
#include <avr/io.h>
2
3
uint16_t bvalue = ...;
4
USART0.BAUD = bvalue;

: Edited by User
von Frank (frankharvey)


Rate this post
useful
not useful
It sounds like you’re dealing with advanced telecom protocols. The 
PEF20532FV1.3(https://www.ovaga.com/products/detail/pef20532fv1-3) is 
often used in similar contexts due to its robust HDLC framing and 
integrated PCM interfaces. Depending on your application, it might offer 
a simplified approach to multi-channel handling with reliable 
throughput.

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.