View previous topic :: View next topic |
Author |
Message |
Ev3658
Joined: 30 Nov 2014 Posts: 32
|
Posted: Thu Nov 30, 2017 11:57 am Post subject: Hardware 24-32bit Quadratic decoding Xmega |
|
|
The code works, but there is a problem at the zero point, too many interrupts can be.
I can not count hardware in plus and minus it does not work. I ask you for help, tell me, it is possible to make a 32-bit hardware account in the positive and negative directions.
Bascom 2.0.8.0
Code: |
$regfile = "xm256a3def.dat"
$crystal = 33177600
$hwstack = 200
$swstack = 128
$framesize = 235
$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
Config Osc = Enabled , Extosc = Enabled , Pllosc = Enabled , _
Range = 2mhz_9mhz , Startup = Xtal_1kclk , Pllsource = Extclock , Pllmul = 9 , Plldiv2 = Disabled , 32khzosc = Disabled ', 32khzpowermode = Normal
Config Sysclock = Pll , Prescalea = 1 , Prescalebc = 1_1
Config Priority = Static , Vector = Application , Lo = Enabled , Med = Enabled , Hi = Enabled
'===================== UART
Config Com7 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Config Portf.2 = Input 'RX
Config Portf.3 = Output 'TX
Open "COM7:" For Binary As #1
Config Pina.0 = Input 'A
Config Pina.1 = Input 'B
Config Xpin = Pina.0 , Sense = Rising
Config Xpin = Pina.1 , Sense = Rising '
Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Digflt0 = 2
Tcc1_per = 9999
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec , Event_delay = Enabled
On Tcc1_ovf Enc1:
Enable Tcc1_ovf
Dim En1 As Byte
Do
Waitms 300
Print #1, En1;" ";Tcc1_CNT
Loop
End
Enc1:
If Tcc1_ctrlfset.0 = 0 Then
Incr En1
Else
Decr En1
End If
Return
|
(BASCOM-AVR version : 2.0.7.8 ) |
|
Back to top |
|
|
kimmi
Joined: 24 Feb 2006 Posts: 1922 Location: Denmark
|
|
Back to top |
|
|
Ev3658
Joined: 30 Nov 2014 Posts: 32
|
Posted: Thu Nov 30, 2017 10:19 pm Post subject: |
|
|
In the help the necessary information is absent.
In the documentation for Hmega A3, there is little information.
Tracking 16bit is working.
I can not pass the subtraction to the second timer.
The above program code is a software implementation for increasing the number of bits, but there is no reliable work at the zero point.
Code: | Config Pina.0 = Input 'A
Config Pina.1 = Input 'B
Config Xpin = Pina.0 , Sense = Rising
Config Xpin = Pina.1 , Sense = Rising
Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Digflt0 = 2
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec , Event_delay = Enabled '------ 0-16 bit (UP/DOWN)
Config Event_system = Dummy , Mux1 = Tcс1_ovf
Config Tce1 = Normal , Prescale = E1 , Event_source = E1 '-------16-32bit (UP....) - No Down (((( |
|
|
Back to top |
|
|
AdrianJ
Joined: 16 Jan 2006 Posts: 2483 Location: Queensland
|
Posted: Thu Nov 30, 2017 11:31 pm Post subject: |
|
|
Cant see what you are trying to do, but if you do
does that do what you want ?
Read the help for the differences and ranges of byte, integer and long variables _________________ Adrian Jansen
Computer language is a framework for creativity |
|
Back to top |
|
|
Ev3658
Joined: 30 Nov 2014 Posts: 32
|
Posted: Fri Dec 01, 2017 8:51 am Post subject: |
|
|
AdrianJ wrote: | ...
does that do what you want ? |
No, problem Decr Timer2
|
|
Back to top |
|
|
Madf
Joined: 13 Nov 2011 Posts: 179 Location: Moscow
|
Posted: Fri Dec 01, 2017 9:10 am Post subject: |
|
|
In the 32-bit counting mode, the subtraction does not work in the quadrature encoder.
How to set up correctly? |
|
Back to top |
|
|
AdrianJ
Joined: 16 Jan 2006 Posts: 2483 Location: Queensland
|
Posted: Sat Dec 02, 2017 11:53 pm Post subject: |
|
|
Your code does not show how or where you use Timer2.
If you are using a hardware timer, and you expect it to decrement on an input, then you misunderstand how timers work. Hardware timers only increment ( apart from certain special conditions like some PWM modes ).
Software timers, like what you show for the Timer1 overflow routine Enc1, can increment or decrement a variable, or do anything else you can put in the code.
Edit:
Actually that may be wrong in the case of an XMega. I do not know whether they can be set to decrement as well as increment. But you will still have to show your code using Timer2. _________________ Adrian Jansen
Computer language is a framework for creativity |
|
Back to top |
|
|
Ev3658
Joined: 30 Nov 2014 Posts: 32
|
Posted: Sun Dec 03, 2017 9:03 pm Post subject: |
|
|
AdrianJ wrote: | Your code does not show how or where you use Timer2. ..... |
Unfortunately I can not overcome the language barrier.
The image corresponds to this part of the code:
Code: |
Config Pina.0 = Input 'A
Config Pina.1 = Input 'B
Config Xpin = Pina.0 , Sense = Rising
Config Xpin = Pina.1 , Sense = Rising
Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Digflt0 = 2
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec , Event_delay = Enabled '------ 0-16 bit (UP/DOWN) ----- TIMER 1
Config Event_system = Dummy , Mux1 = Tcс1_ovf
Config Tce1 = Normal , Prescale = E1 , Event_source = E1 '-------16-32bit (UP....) - No Down ((((---------- TIMER 2 |
|
|
Back to top |
|
|
laborratte
Joined: 27 Jul 2005 Posts: 299 Location: Berlin
|
Posted: Thu Dec 07, 2017 9:57 pm Post subject: |
|
|
Hi,
the secret is well hidden in datasheet, and only in datasheets published after 03/2012 - older datasheets do not mention that.
Quote from page 167 of actual datasheet:
Quote: | 14.6.2 Event Action Controlled Operation
The event selection and event action settings can be used to control the counter from the event system. For the counter,
the following event actions can be selected:
- Event system controlled up/down counting
- Event n will be used as count enable
- Event n+1 will be used to select between up (1) and down (0). The pin configuration must be set to low level sensing
(...)
|
I found example code in AVRFreaks (author: ghf080), here bascom adapted example for your 32-Bit Up-Down-Timer
Code: |
(...)
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec '------ 0-16 bit (UP/DOWN)
tcc1_cca = 0 'We need a compare-Register for direction -> event system
Config Event_system = Dummy , Mux1 = Tcc1_ovf 'Overflow-Event
Config Event_system = Dummy , Mux2 = Tcc1_cca 'in next Channel the "compare-event"
Config Tce1 = Normal , Prescale = E1 , Event_source = E1, Event_action = UPDOWN , Event_delay = Enabled
(...)
|
I tested this in Atmel Studio 7 Simulator as I don't have any fast encoder for tests.
Keep in mind that reading a 32Bit value out of two 16bit registers is not atomic. In case the low timer is just about to overflow when reading the following read of the high timer can happen after the overflow. The result is a wrong value. To get the readings as close as possible together you can use assembler like that:
Code: |
(...)
dim lEncodeCounter as long
(...)
'reading the encoder timers
'if no interupts are used in you application comment the following line
disable interrupts
$asm
lds r16,{TCC1_CNT} 'read 16Bit: low first! Puts automaticaly high byte in timer C1's TEMP register
lds r18,{TCE1_CNT} 'read 16Bit: low first! Puts automaticaly high byte in timer E1's TEMP register
lds r17,{TCC1_CNT}+1 'now read the TEMP from 16 bit value
lds r19,{TCE1_CNT}+1 'now read the TEMP from 16 bit value
loadadr lEncodeCounter, X
st X+, r16 'save indirect to lEncodeCounter, low byte first
st X+, r17 'save indirect to lEncodeCounter
st X+, r18 'save indirect to lEncodeCounter
st X, r19 'save indirect to lEncodeCounter, high byte last
$end asm
'if no interupts are used in you application comment the following line
enable interrupts
|
This gives you a delay of only 2 clock cycles between the readings. Its up to you to decide if this is fast enough - depending on your application.
Other possibility would be to check for readings nearby overflow and discard them or multiple readings with continuity check.
Edit: After thinking about it I realize that the unwanted overflow can happen even at slowest encoder speeds. So at least two readings and a check of allowed difference should be done. |
|
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
|
|