Xmega32e5 timer start stop

Rodzina procesorów bogatszych w wiele nowych rozwiązań i dlatego warto po nie sięgnąć.
ODPOWIEDZ
Awatar użytkownika
tomaszdko
Posty: 78
Rejestracja: 06 gru 2018, 19:58

Xmega32e5 timer start stop

Post autor: tomaszdko » 03 sty 2024, 13:00

Mam problem z zliczaniem cykli przez timer tcc4 w xmega32e5 .
Jeśli nie używam poleceń "start tcc4 i stop tcc4 " to wszystko chodzi poprawnie .
  1.  $REGFILE = "XM32E5DEF.DAT"
  2. $CRYSTAL = 50000000 '50MHz
  3. $HWSTACK = 200
  4. $SWSTACK = 200
  5. $FRAMESIZE = 200
  6. $LIB "XMEGA.LIB"
  7. ENABLE INTERRUPTS
  8. '----------------------------------------------------------------------------------------------
  9. '  CONFIG OSC = ENABLED , PLLOSC = ENABLED , PLLMUL =  29
  10. '  CONFIG SYSCLOCK = PLL
  11. '----------------------------------------------------------------------------------------------
  12. CONFIG OSC = ENABLED , EXTOSC = ENABLED , PLLOSC = ENABLED , _
  13. RANGE = 9MHZ_12MHZ , STARTUP = XTAL_16KCLK , PLLSOURCE = EXTCLOCK , PLLMUL = 5
  14. CONFIG SYSCLOCK = PLL , PRESCALEA = 1 , PRESCALEBC = 1_1
  15. '----------------------------------------------------------------------------------------------
  16. CONFIG PRIORITY = STATIC , VECTOR = APPLICATION , HI = ENABLED , MED = ENABLED , LO = ENABLED
  17. '*********************************************************************************************************************************
  18. '*** UART-COM3 *******************************************************************************************************************
  19. '*********************************************************************************************************************************
  20. CONFIG COM1 = 115200 , MODE = ASYNCHRONEOUS , PARITY = NONE , STOPBITS = 1 , DATABITS = 8
  21. OPEN "COM1:" FOR BINARY AS #1
  22. CONFIG SERIALIN = BUFFERED , SIZE = 30 , BYTEMATCH = 13
  23. ENABLE USARTc0_RXC, LO
  24. '---------------------------------
  25. DIM UART1 AS STRING*20
  26. DIM COM_1 AS WORD
  27. '
  28. '*********************************************************************************************************************************
  29. '*** TWIc ************************************************************************************************************************
  30. '*********************************************************************************************************************************
  31. '
  32. CONFIG SCL = PortC.1
  33. CONFIG SDA = PortC.0
  34. SET PortC.0
  35. SET PortC.1
  36. DIM TWI_START AS BYTE
  37. CONFIG TWIc = 400000
  38. OPEN "TWIc" FOR BINARY AS #4
  39. I2CINIT #4
  40. '
  41. '*********************************************************************************************************************************
  42. '*** LCD SSD1306 *****************************************************************************************************************
  43. '*********************************************************************************************************************************
  44. '
  45. $LIB "glcdSSD1306-I2C.lib"
  46. CONFIG GRAPHLCD = CUSTOM , COLS = 128 , ROWS = 64 , LCDNAME = "SSD1306"
  47. SETFONT Font8x8tt
  48. CLS
  49. '
  50. '*********************************************************************************************************************************
  51. '*** TCC4_OVF ********************************************************************************************************************
  52. '*********************************************************************************************************************************
  53. '
  54. CONFIG TCC4 = NORMAL , PRESCALE = 1               ' 1 , 2, 4, 8, 64, 256, 1024
  55. TCC4_PER = 65535
  56. ON TCC4_OVF PRZERWANIE_TCC4
  57. ENABLE TCC4_OVF , LO
  58. START TCC4
  59. '
  60. '*********************************************************************************************************************************
  61. '*** ZMIENNE *********************************************************************************************************************
  62. '*********************************************************************************************************************************
  63. '
  64. DIM TIK AS DWORD
  65. DIM LICZ AS INTEGER
  66. DIM WYNIK AS LONG
  67.  
  68. DO
  69.  
  70. TCC4_CNT=0
  71. 'START TCC4                - start i stop odhaczone i zlicza poprawnie
  72. WAITMS 1
  73. 'STOP TCC4
  74. WYNIK=TCC4_CNT
  75.  
  76. LCDAT 1 , 10 , "CNT    -";TCC4_CNT;"    "
  77. LCDAT 2 , 10 , "WYNIK  -";WYNIK;"    "
  78. LCDAT 5 , 10 , "TIK    -";TIK;"    "
  79. LCDAT 6 , 10 , "LICZ   -";LICZ;"    "
  80.  
  81. INCR TIK
  82.  
  83. LOOP
  84. END
  85. '
  86. '-----------------------------------------------
  87. '
  88. SERIAL0CHARMATCH:
  89. PUSHALL
  90. INPUT #1, UART1 NOECHO
  91. COM_1=VAL(UART1)
  92. POPALL
  93. RETURN
  94. '
  95. '-----------------------------------------------
  96. $INCLUDE "font8x8TT.font"
  97. '-----------------------------------------------
  98. '
  99. PRZERWANIE_TCC4:
  100. INCR LICZ
  101. TCC4_INTflags.0=1
  102. RETURN
ale jeśli start i stop będą dodane do programu to zliczy tylko raz i koniec z timerem .
Przy zwykłych amegach lub xmega serii A to wszystko chodzi poprawnie . Fakt że te timery rodzaju 4 i 5 w xmega serii E są inne i pewnie tu jest "pies pogrzebany" .
Zna ktoś odpowiedź co jest nie tak .
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega32e5 timer start stop

Post autor: niveasoft » 03 sty 2024, 13:27

Miałem kiedyś podobną sytuację. Nie działał mi Start Timer0 dla Mega328P ponieważ konfigurowałem go w Sub.

Mark z MCS poradził by skonfigurowac Timer i użyć tej ostatniej mozliwej tam komendy CONFIGURATION = Mysetting
To zapamietuje konfigurację timera i mozna ich mieć (tych konfiguracji) nawet więcej
Uzywa się tego właśnie w połaczeniu z komendą Start Czyli piszesz START TCC4 , Mysettings ;)

Nie sprawdzałem czy działa na Xmegach ale możesz spróbować bo teraz pewnie przez jakieś niedopatrzenie kompilator nie zapamietuje stanu Timera.
Poczytaj sobie w Helpie START

Jesli to nie działa to może trzeba uzywać tej całej konfiguracji powtórnie.

Mozna też sprawdzić rejestr odpowiedzialny za prescaler po czym zeby zatrzymać timer wpisać do Prescalera 0 a żeby uruchomic podac to co było wczesniej.
Coś na wzór:
  1. Dim Mysettings As Byte = TCC4_CTRLA 'to sobie wczytac po skonfigurowaniu timera
  2.  
  3. TCC4_CTRLA = 0 'to powinno go zatrzymać bo prescaler = 0
  4. TCC4_CTRLA = Mysettings 'powinien znowu ruszyć
Awatar użytkownika
tomaszdko
Posty: 78
Rejestracja: 06 gru 2018, 19:58

Re: Xmega32e5 timer start stop

Post autor: tomaszdko » 03 sty 2024, 14:48

Nie lubię robić takich "wygibasów" że jeśli coś nie chodzi wedle standardowego i poprawnego programowania to wstawiać coś by chodziło :/ . Na xmega A zawsze hula (dopracowali to w bascom) ale inne tooooo i tu wstawić przekleństwa .

Na coś jednak wpadłem . Kiedy wpiszę w pętli głównej tak :
  1. START TCC5
  2. TCC5_CNT=0
  3.  
  4. WAITUS 250
  5.  
  6. STOP TCC5
  7. WYNIK1=TCC5_CNT
To lipa , nic nie zlicza . Nawet jak mu dam przerwę zatrzymania by się licznik przekręcił i powinno wykonać inkrementację zmiennej w przerwaniu tego timera to też nic nie pokazuje .
Wygląda jak by był zblokowany.
Jednak jeśli zrobię tak :
  1. START TCC5
  2. TCC5_CNT=0
  3.  
  4. WAITUS 250
  5.  
  6. WYNIK1=TCC5_CNT
  7. STOP TCC5
Czyli jeśli odczytam rejestr tcc5_cnt zaraz przed zatrzymaniem timera (stop tcc5) to wszystko chodzi poprawnie .
Jakieś wnioski ?
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega32e5 timer start stop

Post autor: niveasoft » 03 sty 2024, 14:55

Te timery mają komendy UPDATE, RESTART i RESET
Reset zeruje wszystkie rejestry i może być użyty tylko gdy timer stoi czyli prescaler 0 = OFF
Moze Bascom od razu zeruje timer.

Ja bym Tobie proponował zobaczyć co robi Bascom.
Wystartować Timer i zrobić odczyt jakiegoś rejestru a potem zatrzymać timer i jeszcze raz sprawdzić.
  1. Dim Testb As Byte
  2.  
  3. Start Timer
  4. Testb = TCD5_CTRLA
  5. Print Bin(testb)
  6. Stop Timer
  7. Testb = TCD5_CTRLA
  8. Print Bin(testb)   '  .....itd
Co ciekawe resetowanie timera jest w tym samym rejestrze co zatrzymywanie więc proponuje go tez sprawdzić TCD5_CTRLHCLR TCD5_CTRLHSET
To powinno być nawet widac w symulatorze.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega32e5 timer start stop

Post autor: niveasoft » 03 sty 2024, 16:10

Sprawdziłem to moim programem NoSaveTool
Bascom tam nie robi nic innego co ja bym właśnie nie proponował.
Po prostu ustawia preskaler na zero jak Stop Timer i z powrotem ustawia preskaler na 1 przy Start Timer
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
tomaszdko
Posty: 78
Rejestracja: 06 gru 2018, 19:58

Re: Xmega32e5 timer start stop

Post autor: tomaszdko » 03 sty 2024, 16:34

  1. START TCC5
  2. TCC5_CNT=0
  3.  
  4. waitus 100
  5.  
  6. WYNIK1=TCC5_CNT
  7. STOP TCC5
  8. WYNIK2=TCC5_CNT
  9.  
  10. LCDAT 1 , 10 , "ENKODER-";ENKODER;"    "
  11. LCDAT 2 , 10 , "TCC5_CNT-";TCC5_CNT;"    "
  12. LCDAT 3 , 10 , "WYNIK1-";WYNIK1;"    "
  13. LCDAT 4 , 10 , "WYNIK2-";WYNIK2;"    "
Dla mnie to wygląda tak , zmienna "WYNIK1" odczytująca "TCC5_CNT" zanim nastąpi "STOP TCC5" ma wartość tego licznika .Wszystko OK.
Po "STOP TCC5" jest zmienna "WYNIK2" , która odczytuje znowu "TCC5_CNT" ale tu wartość jest 0 .Czyli po zatrzymaniu timera następuje zerowanie .
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega32e5 timer start stop

Post autor: niveasoft » 03 sty 2024, 16:59

Widać taki jej urok. Bascom tu nie zawinił.
Jak byś chciał zatrzymać timer ale go nie zerować to musisz zniżyć się do poziomu uzycia rejestrów :P

Set TCC5_CTRLGSET.5 powinno zatrzymać timer
Set TCC5_CTRLGCLR.5 powinno wznowić jego działanie

Rejestry są specjalnie dwa. Jeden do ustawiania flag a drugi do ich kasowania, ale wszystko mozna zrobic przez to szybciej bez Read/Modify/Write. Po prostu tylko Write i już. Chociaż...Bascomowe Set pewnie czyta/modyfikuje i zmienia. Żeby było atomowo to by trzeba napisać TCC5_CTRLGSET = &B0010_0000

Ten STOP tu zamontowali pewnie z powodu tego że ten drugi stop zeruje.
ODPOWIEDZ