View previous topic :: View next topic |
Author |
Message |
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Thu Aug 13, 2020 1:58 pm Post subject: |
|
|
I got a reply from microchip but it was not helping. they only told about the baud procedure which i now implemented as an option.
but like i told microchip : it would make more sense to adjust the center frequency so all timing is correct.
i hope for some description on how to use the sigrow value to adjust the calib register.
but maybe you find something.
for now till i get a solution i leave it. _________________ Mark |
|
Back to top |
|
|
SZTRAD
Joined: 30 Dec 2019 Posts: 165
|
Posted: Thu Aug 13, 2020 2:50 pm Post subject: |
|
|
So setting the OSC20MCALIBA register and thus the frequency of the oscillator is simple.
If someone needs it, it can be done like this in bascom (this will raise the frequency from the company's 19.63MHz to 19.96MHz). The value in the register is changed by adding 1. The step is 0.33MHz.
Now I will think about what they meant by the q1.10 format for a 7-bit register |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Thu Aug 13, 2020 8:49 pm Post subject: |
|
|
yes it is simple. but i do not see the relation from the offset reg to the calib register.
how do you know what to add/sub ?
i asked microchip. so i wait for that.
to get the output signal :
Config Sysclock = 20mhz , Prescale = 1 , Clockout = Enabled
Config Portb.5 = Output 'for the clock output
when you do not set the port to output you also can measure the output !
but it seems less stable.
what i still do not get : why do they not load a good correction value ?why let the user do all kind of stuff to get a good result? _________________ Mark |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Fri Aug 14, 2020 8:40 am Post subject: |
|
|
ok, i got a reply. they do not tell me where the OSC20MCALIBA value comes from only that it is set during production.
There is no procedure to adjust the clock.
I guess it would be similar to the baud adjust procedure.
I find it a bit odd. I do not get why they did not put values into SIGROW for say 1.8V, 3V3 and 5V. that would make more sense.
Maybe i will try to make a procedure later myself but for now i leave this as is. _________________ Mark |
|
Back to top |
|
|
SZTRAD
Joined: 30 Dec 2019 Posts: 165
|
Posted: Fri Aug 14, 2020 10:03 am Post subject: |
|
|
Well, it's also interesting that he doesn't remember the manual correction after the restart, even though they write in the data sheet that they do.
I just sent how it can be changed, now I'm preparing an automatic correction that calculates it itself and moves the register where it is needed.
It seems to me better to set the correction of the main oscillator as a better idea than to recalculate baud rates or time loops. Something memory will take the other side for the accuracy it's probably worth. Unfortunately, there are critical places where one needs a delay as accurately as possible and not just approximately. I have already solved several times the problem with communications, such as SPI and others, when I was not able to communicate from devices at higher speeds.
I'm just confused by the 0.33MHz step is terribly much. That's why I'm researching what their Q1.10 means.
The error is stored as a compressed Q1.10 fixed point 8-bit value, in order not to lose resolution, where
the MSB is the sign bit and the seven LSBs the lower bits of the Q1.10. This should apply only to the 4 constants that are used only for baud rate correction and apparently have nothing to do with the system frequency rate.
I know how to recalculate it, I just can't calculate a good result.
The number is int8_t, which means 8-bit signed. It follows to me that as they write, I have 7 bits left for my own number, I just don't understand where they have the dot in the fraction.
If I use atmel studio it returns values to me (gcc compiler as known)
Sigrow 16MHz 3V: -4
Sigrow 16MHz 5V: -1
Sigrow 20MHz 3V: -7
Sigrow 20MHz 5V: 0
If I load it hard, Bascom will read it from the registry
SIGROW_OSC20ERR3V = 249dec 1111 1001bin
SIGROW_OSC20ERR5V = 0dec
SIGROW_OSC16ERR3V = 252dec 1111 1001bin
SIGROW_OSC16ERR5V = 255dec 1111 1111bin
If I take the first number and imagine that 8bit is a sign, I have 111 1001bin left.
Once upon a time I used the Q format for calculations (real numbers put a lot of strain on processors and this was nice and quite simple how not to lose accuracy) link how to do it here https://www.allaboutcircuits.com/technical-articles/fixed-point- representation-the-q-format-and-addition-examples /
So from the description we know that we have one number before the decimal point and 9 after. So we will add the number to 10 places 111 1001 000 and determine the number according to the procedure above. 1 * 2 (0) + 1 * 2 (-1) + 1 * 2 (-2) + 1 * 2 (-3) + 0 + 0 + 1 * 2 (-6) + 0 + 0 + 0 add it up and we get the number 1.890625. If I count correctly, I do not get anything from what I read. So what am I doing wrong? |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Fri Aug 14, 2020 10:43 am Post subject: |
|
|
From the PDF :
The error is stored as a compressed Q1.10 fixed point 8-bit value, not to lose resolution, where the MSb is the sign
bit, and the seven LSbs are the lower bits of the Q1.10.
Q1.10 means you have 1 bit for the integer and 10 bits for the fraction. somehow that will not fit into a byte with also a sign.
interesting is that they assign it to a short int which is just a signed byte.
i think they omitted some bits.
that is why they give this for the baud :
int8_t sigrow_val = SIGROW.OSC16ERR3V; // read signed error
int32_t baud_reg_val = 600; // ideal BAUD register value
assert (baud_reg_val >= 0x4A); // Verify legal min BAUD register
value with max neg comp
baud_reg_val *= (1024 + sigrow_val); // sum resolution + error
baud_reg_val /= 1024; // divide by resolution
USART0.BAUD = (int16_t) baud_reg_val; // set adjusted baud rate
i did check and it works. the 1024 is of course 10 bits.
so similar to this, you could do this with the calib register.
I tried that but it does not work because even the smallest bit change will result in a huge offset like you noticed too.
Code: |
Config Sysclock = 20mhz , Prescale = 1 , Clockout = Enabled
Config Portb.5 = Output 'for the clock output
'configure the USART
Config Com1 = 250000 , Mode = Asynchroneous , Parity = None , Databits = 8 , Stopbits = 1 , Baud_offset = Osc20_5v
Waitms 2000
Print "Test USART"
Dim B As Byte
Do
Print "this is a baud test"
Print Hex(clkctrl_osc20mcaliba) '9E
B = Inkey()
If B = "+" Then
Cpu_ccp = &HD8
Incr Clkctrl_osc20mcaliba
Elseif B = "-" Then
Cpu_ccp = &HD8
Decr Clkctrl_osc20mcaliba
End If
Waitms 500
Loop
|
so i think you can not get a precise clock. at least not with the internal osc.
for a lower frequency such as a baud rate the compensation will work out ok.
till somebody proves otherwise i leave it as is. _________________ Mark |
|
Back to top |
|
|
Netzman
Joined: 25 Nov 2005 Posts: 127 Location: Graz
|
Posted: Fri Aug 14, 2020 11:52 am Post subject: |
|
|
The format is stated in the datasheet p.62:
"The Error is stored as a compressed Q1.10 fixed point 8 bit value, in order not to lose resolution, wherethe MSB is the sign bit and the 7 LSBs the lower bits of the Q.10."
The number is in fixed point format, where the integer part is fixed to 0, the sign is denoted by bit 7, the remaining 7 bits are the least significant bits of the 10-bit wide fractional part:
+/- 0.[000XXXXXXX]
To convert to a floating point number: [url]https://en.wikipedia.org/wiki/Q_(number_format)#Q_to_float[/url] (BBCode, what's up?)
Or, in other words, bit 6 of the register value has a magnitude of 0.0625, bit 5 has 0,03125, ..., bit 0 has 0.001953125.
So it is a linear factor which can be applied to the baud rate calculation, wait loops, system clock etc. My guess why the user has to do it, is because the hardware implementation of the RC frequency correction is quite coarse, the user could decide where more accurate calibration is needed (the baud rate calculation has smaller steps). Additionally, the RC temperature calibration is also more application-specific.
The correction factor is applied in a linear equation (doesn't matter which unit is used for Freq, could be Hz, the baud rate register setting, or something other):
Freq_corr = Freq * (1 + factor)
Which translates in fixed point math to (Bascom-like pseudocode):
Code: | Dim Freq As Integer
Dim Freq_corr As Integer
Dim sigrow_val As Integer
sigrow_val = SIGROW.OSC16ERR3V
Shift sigrow_val, Left, 8
Shift sigrow_val, Right, 8, Signed
Freq_corr = Freq * (1024 + sigrow_val)
Shift Freq_corr, Right, 10 |
_________________ LCD Menu | Proportional Fonts |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
|
Back to top |
|
|
SZTRAD
Joined: 30 Dec 2019 Posts: 165
|
Posted: Fri Aug 14, 2020 12:37 pm Post subject: |
|
|
Ok I understood it, I will add it wrong in the model example (see above) three 0 before and I will get the result 0.1181640625. So how AS got the value -7 for SIGROW_OSC20ERR3V. I have measured that the frequency of the oscillator at a correction factor of 23 oscillates at 19.63MHz (when changing to 24 oscillations at 19.96MHz). I don't like when something doesn't work as it should.
It looks like a binary accessory to me
Just for fun
with a correction factor of 0 oscillates the oscillator at 12.24MHz. The core is able to run up to 32MHz then resets.
If you're wondering why I'm researching this. I don't like artificially modified values that I can't influence and I sometimes need to time very precisely. This doesn't seem like a stable thing to me. By the way, that's why I needed that temperature.
To be honest, the RC oscillator error of 40% during production is nothing a microchip should boast. Such a large compensation does not indicate good production. Let anyone be angry with me who wants this at the old avr was not a habit.
I have to think about what to raise the frequency internally who knows how and then trust it is a lottery bet. |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Fri Aug 14, 2020 7:51 pm Post subject: |
|
|
I agree. And i would not expect the huge offset until i measured it. But when you need very precise timing it is best to use a temp. controlled xtal. also, it is possible to use the RTC. with the internal 32 KHz or external 32 KHz.
So an exact timing would still be possible. I see these internal osc as a nice extra that was not in the older AVR.
I think the ones in xmega were better but on the other hand i did not test that lately. so who knows. _________________ Mark |
|
Back to top |
|
|
SZTRAD
Joined: 30 Dec 2019 Posts: 165
|
Posted: Sat Aug 15, 2020 8:37 am Post subject: |
|
|
Unfortunately, the price of the resonator (crystal is out of the question for 14pin circuits) exceeds the price of the circuit itself twice, and I'm not saying that at 5V there are already saffron.
Well, sometimes it helps to read the data sheet until the end, for example, section 31.9.
I lost my smile while peeking at the table. I wanted to use a 32kHz oscillator and perform an internal calibration. Well, he's not much better at measuring it. So the only option is calibration from the outside and this will be a bit more complicated than I wanted, especially in series production. Unfortunately the customer will have to reconsider the use of microchip circuits and I will forget about Bascom. They will go there stm8 and my unpopular c. Price and stability speak for them.
Anyway, thank you for the good work, Mark.
Regards RS |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You cannot download files in this forum
|
|