xm32e5 i timery

Rodzina procesorów bogatszych w wiele nowych rozwiązań i dlatego warto po nie sięgnąć.
ODPOWIEDZ
krolikbest
Posty: 23
Rejestracja: 10 maja 2022, 13:25

xm32e5 i timery

Post autor: krolikbest » 19 maja 2022, 11:54

Witam,
w sumie to ten temat raczej taka akademicka dywagacja na temat przerwań timera. Poniżej dwa podejścia do tematu timera.
1. podejście uważam za niezbyt wygodne, bo zajmuję (marnuję) cały timer 16bit na coraz bardziej rozbudowany podprogram w przerwaniu?
  1. $regfile = "xm32e5def.dat"
  2. $crystal = 32000000 '32MHz
  3. $hwstack = 80
  4. $swstack = 60
  5. $framesize = 60
  6.  
  7. $lib "lcd_i2c_PCF8574.Lib"
  8.  
  9. Config Osc =enabled , 32mhzosc = Enabled
  10. Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
  11. Config Priority = Static , Vector = Application , Lo = Enabled   'Init Interrupts
  12.  
  13. dim twi_start as byte
  14. dim 1sek as long:1sek=0
  15. dim 3sek as long : 3sek=0
  16. dim temp_time as integer: temp_time=0
  17. dim temp_mod as integer
  18.  
  19. Config Twic=100000
  20. Config Scl = Portc.1
  21. Config Sda = Portc.0
  22. Open "twic" For Binary As #2
  23. Config I2cdelay = 10
  24.  
  25. I2Cinit #2
  26. const TWI_ADR = TWIC_CTRL
  27. const TWI_CH = TWIC_MASTER_DATA 'albo TWIC_MASTER_ADDR
  28.  
  29. Dim Pcf8574_lcd As Byte : Pcf8574_lcd = &H4E             'PCF8574 slave address. (&H40,&H42,&H44,&H46,&H48,&H4A,&H4C,&H4E)
  30. Dim Backlight As Byte : Backlight = 1                    'LCD backlight control. (0: off, 1: on)
  31.  
  32. Config Lcd = 16x2
  33.  
  34. config TCC4=NORMAL,PRESCALE=256
  35. Tcc4_per=62500
  36.  
  37. On Tcc4_ovf Tc4_isr 'Setup overflow interrupt of Timer/Counter C0 and name ISR
  38. Enable Tcc4_ovf , Lo 'Enable overflow interrupt in LOW Priority
  39. Enable Interrupts
  40.  
  41. Initlcd
  42.  
  43. do
  44. loop
  45. end
  46.  
  47. Tc4_isr:
  48.  incr temp_time
  49.  if temp_time=2 then
  50.   temp_time=0
  51.   incr 1sek
  52.   temp_mod=1sek mod 3
  53.   if temp_mod=0 then incr 3sek
  54.  end if
  55.  
  56.  Tcc4_intflags.0 = 1
  57.  Locate 1 , 1
  58.  Lcd "Czas 1sek";1sek
  59.  Locate 2 , 1
  60.  Lcd "Czas 3sek";3sek
  61. Return
2. podejscie z wykorzystaniem rejestrów tcXX, tutaj wydaje mi się, że to lepiej wygląda (na moją logikę...)
  1. $regfile = "xm32e5def.dat"
  2. $crystal = 32000000 '32MHz
  3. $hwstack = 80
  4. $swstack = 60
  5. $framesize = 60
  6.  
  7. '$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
  8. $lib "lcd_i2c_PCF8574.Lib"
  9.  
  10. Config Osc =enabled , 32mhzosc = Enabled
  11. Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
  12. Config Priority = Static , Vector = Application , Lo = Enabled   'Init Interrupts
  13.  
  14. dim twi_start as byte
  15. dim 1sek as long:1sek=0
  16. dim 3sek as long : 3sek=0
  17. dim temp_timea as integer: temp_timea=0
  18. dim temp_timeb as integer: temp_timeb=0
  19.  
  20. Config Twic=100000
  21. Config Scl = Portc.1
  22. Config Sda = Portc.0
  23. Open "twic" For Binary As #2
  24. Config I2cdelay = 10
  25.  
  26. I2Cinit #2
  27. const TWI_ADR = TWIC_CTRL
  28. const TWI_CH = TWIC_MASTER_DATA 'albo TWIC_MASTER_ADDR
  29.  
  30. Dim Pcf8574_lcd As Byte : Pcf8574_lcd = &H4E             'PCF8574 slave address. (&H40,&H42,&H44,&H46,&H48,&H4A,&H4C,&H4E)
  31. Dim Backlight As Byte : Backlight = 1                    'LCD backlight control. (0: off, 1: on)
  32.  
  33. Config Lcd = 16x2
  34.  
  35. config TCC4=NORMAL,PRESCALE=256
  36. Tcc4_CCA=62500
  37. Tcc4_CCB=62500
  38.  
  39. On TCC4_CCA tc4a_isr
  40. on TCC4_CCB tc4b_isr
  41. Enable Tcc4_cca , Lo
  42. Enable Tcc4_ccB , Lo
  43. Enable Interrupts
  44.  
  45. Initlcd
  46.  
  47. do
  48. loop
  49.  
  50. end
  51.  
  52. Tc4a_isr:
  53.  incr temp_timea
  54.  if temp_timea=2 then
  55.   temp_timea=0
  56.   incr 1sek
  57.  end if
  58.  Locate 1 , 1
  59.  Lcd "Czas 1sek";1sek
  60.  Return
  61.  
  62. Tc4b_isr:
  63.  incr temp_timeb
  64.  if temp_timeb=6 then
  65.   temp_timeb=0
  66.   incr 3sek
  67.  end if
  68.  Locate 2 , 1
  69.  Lcd "Czas 3sek";3sek
  70. Return
Oba działają, podejście nr 2 jest wg mnie bardziej rozowjowe, ale napisałem te programiki dzisiaj na szybko, prośba jakieś cenne uwagi lub inne sposoby na timery mile widziane ;)

Z poważaniem,
Marcin

PS.
Jest power w xmegach..
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: xm32e5 i timery

Post autor: niveasoft » 22 maja 2022, 10:34

W przerwaniu już najczęściej w inne przerwanie nie wejdzie (chyba że to oprogramować) a mam kilka projektów na Xmegach które na przykład odbierają dane na kilku USART`ach na raz i to szybk0, często Modbus`em. Dlatego najczęściej nie włączam przerwania od Timera tylko sobie w pętli sprawdzam flagi.
  1. Do
  2. '--[ CO OKREŚLONY CZAS (TUTAJ 10ms)]--
  3.  If Tcc0_intflags.0 = 1 Then
  4.   Tcc0_intflags.0 = 1
  5.  
  6.  
  7.  End If
  8. Loop
BTW Xmega E5 jest trochę inna niż reszta Xmeg i nie kasuje swoich flag sprzętowo po wejściu w obsługę przerwania. Flagi trzeba kasować "ręcznie".
krolikbest
Posty: 23
Rejestracja: 10 maja 2022, 13:25

Re: xm32e5 i timery

Post autor: krolikbest » 23 maja 2022, 11:48

Co do kasowania ręcznego flag to w którymś poprzednim wątku tego forum już to znalazłem (na szczęście). No trzeba być czujnym :)
ODPOWIEDZ