DMA włącz / wyłącz przez zmienną i przycisk

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

DMA włącz / wyłącz przez zmienną i przycisk

Post autor: tomaszdko » 29 lut 2024, 16:23

Naskrobałem kod do generowania przebiegu sinus przez DAC za pomocą DMA i tablicy , częstotliwość od 8Hz do 58kHz (mnie interesuje 40kHz do przetwornika ultradźwiękowego) .
Nie mogę ogarnąć wyzwalania i zatrzymywania ponownego tego przebiegu . Jak kontrolować takie start/stop za pomocą zmiennej .

[img
SDS00003.jpg
][/img]
  1. $REGFILE = "XM128A1UDEF.DAT"
  2. $CRYSTAL = 48000000   '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 = 6 '6 X 8MHZ = 48MHZ     0.000000020833 SEK
  14. CONFIG SYSCLOCK = PLL , PRESCALEA = 1 , PRESCALEBC = 1_1
  15. CONFIG PRIORITY = STATIC , VECTOR = APPLICATION , HI = ENABLED , MED = ENABLED , LO = ENABLED
  16. '*******************************************************************************************************************************************
  17. '*** DACb **********************************************************************************************************************************
  18. '*******************************************************************************************************************************************
  19. CONFIG DACB = ENABLED , IO0 = ENABLED, IO1 = ENABLED, CHANNEL = DUAL , REFERENCE = AVCC , INTERVAL = 64 , REFRESH = 64
  20. START DACB
  21. CONFIG PORTB.2 = OUTPUT
  22. '*******************************************************************************************************************************************
  23. '*** UART-COM5 *****************************************************************************************************************************
  24. '*******************************************************************************************************************************************
  25. CONFIG COM5 = 115200 , MODE = ASYNCHRONEOUS , PARITY = NONE , STOPBITS = 1 , DATABITS = 8
  26. OPEN "COM5:" FOR BINARY AS #5
  27. CONFIG SERIALIN4 = BUFFERED , SIZE = 30 , BYTEMATCH = 13
  28. ENABLE USARTe0_RXC, LO
  29. DIM RS232_5 AS STRING * 20               'PE3/RS232 TXD0
  30. DIM COM5 AS LONG                         ' PE2/RS232 RXD0
  31. '*******************************************************************************************************************************************
  32. '*** SD DOS/AVR ****************************************************************************************************************************
  33. '*******************************************************************************************************************************************
  34. $INCLUDE "CONFIG_MMCSD_HC.BAS"          '• MISO        – pin D6   MODUL AL-XAVRB V2.0
  35. $INCLUDE "CONFIG_AVR-DOS.BAS"           '• MOSI        – pin D5
  36. DIM BTEMP1 AS BYTE                      '• SCK         – pin D7
  37. DIM FF AS BYTE                          '• CS          – pin D4
  38. BTEMP1 = INITFILESYSTEM(1)             '• CARD DETECT – pin D3
  39. GBDRIVEERROR=0
  40. FF =FREEFILE()
  41. '*******************************************************************************************************************************************
  42. '*** XRAM SDRAM 8MB MT48LC32M4A2P-75IT *****************************************************************************************************
  43. '*******************************************************************************************************************************************
  44. CONFIG XRAM = 3PORT , SDBUS = 4 , SDCOL = 10 , SDCAS = 3 , SDROW = 12 , REFRESH = 500 , INITDELAY = 3200 , MODEDELAY = 2 , ROWCYCLEDELAY = 7 , _
  45. ROWPRECHARGEDELAY = 7 , WRDELAY = 1, ESRDELAY = 7 , ROWCOLDELAY = 7 , MODESEL3 = SDRAM , ADRSIZE3 = 8M , BASEADR3 = &H0000
  46. $XRAMSIZE = 8000000
  47. DIM RAM_TAB(720) AS XRAM WORD
  48. ' out &h8000,1    'zapis 1 do pamieci xram
  49. ' lol= inp(&h8000) 'odczyt
  50. '---
  51. ' odczyt adresu zmiennej
  52. ' w=varptr(b)
  53. ' print w
  54. ' XRAM Start direct after the SRAM range of a XMEGA which is after 16KByte so the first XRAM address is 16384
  55. ' The maximum XRAM is in case of 8MByte SDRAM  = 8000000 - 16384 = 7983616 Byte
  56. '*******************************************************************************************************************************************
  57. '*** LCD 240x320 ILI9341 *******************************************************************************************************************
  58. '*******************************************************************************************************************************************
  59. CONFIG VPORT0 = E    'NIE TRZEBA PODLACZYC/DODACNA "-" Cs1=CS)  Rst=RESET    A0=DC  Si=SDI    Sclk=SCK
  60. CONFIG GRAPHLCD = COLOR , CS1 = PORT0.0 , RST = PORT0.6 , A0 = PORT0.5 , SI = PORT0.4 , SCLK = PORT0.7
  61. CONST PORTRAIT=0
  62. CONST ROTATE_180 = 1
  63. DIM OFFSET256 AS BYTE
  64. $LIB "glcd-ILI9341_2R8_240x320.lib"
  65. INITLCD
  66. CLS
  67. CONST BLACK = &B0000_0000
  68. CONST RED = &B1110_0000
  69. CONST GREEN = &B0001_1100
  70. CONST BLUE = &B0000_0011
  71. CONST MAGENTA = &B1110_0011
  72. CONST YELLOW = &B1111_1100
  73. CONST CYAN = &B0001_1111
  74. CONST WHITE = &B1111_1111
  75. CONST ORANGE = &B1111_0100
  76. CONST BRIGHTGREEN = &B0011_1110
  77. CONST BRIGHTBLUE = &B0001_1111
  78. CONST DARKRED = &B1100_0000
  79. CONST DARKGREEN = &B0001_0100
  80. CONST DARKBLUE = &B0000_0010
  81. OFFSET256 = 1
  82. BOXFILL (0 , 0) - (64 , 240) , BLACK
  83. OFFSET256 = 0
  84. BOXFILL (0 , 0) - (255 , 240) , BLACK
  85. SETFONT COLOR8X8
  86. 'SETFONT COLOR16X16
  87. '******************************************************************************************************************************************
  88. '*** ZMIENNE ******************************************************************************************************************************
  89. '******************************************************************************************************************************************
  90. DIM KAT AS WORD
  91. DIM SINUS AS WORD
  92. DIM DANE(180) AS WORD
  93. dim skacz as word
  94. '******************************************************************************************************************************************
  95. '*** PROGRAM ******************************************************************************************************************************
  96. '******************************************************************************************************************************************
  97. RESTORE SIN_DATA:
  98. FOR KAT = 1 TO 90
  99. READ SINUS
  100. DANE(KAT)=SINUS
  101. NEXT
  102. '******************************************************************************************************************************************
  103. '*** DMA0 *********************************************************************************************************************************
  104. '******************************************************************************************************************************************
  105. CONFIG TCC0 = NORMAL , PRESCALE = 1
  106. TCC0_PER = 65535
  107.  
  108. CONFIG EVENT_SYSTEM = DUMMY , MUX0 = TCC0_OVF
  109. CONFIG DACB = ENABLED , Io0 = ENABLED , Io1 = ENABLED , CHANNEL = DUAL , REFERENCE = AVCC , INTERVAL = 4 , REFRESH = 16 , TRIGGER_CH0 = ENABLED , EVENT_CHANNEL = 0
  110.  
  111. CONFIG DMA = ENABLED , DOUBLEBUF = DISABLED , CPM = RR
  112. CONFIG DMACH0 = ENABLED , BURSTLEN = 2 , CHANRPT = ENABLED , TCI = OFF , EIL = OFF , SINGLESHOT = ENABLED , SAR = BLOCK , _
  113. SAM = INC , DAR = BURST , DAM = INC , TRIGGER = &H25  , BTC = 180 , REPEAT = 0 , SADR = VARPTR(DANE(1)) , DADR = VARPTR(DACB_CH0DATAL)
  114.  
  115. COM5=65535
  116. DO
  117.  
  118. LCDAT      10 , 0 , "DMA_CTRL         :" ;BIN(DMA_CTRL)          ;"   ", WHITE , BLACK
  119. LCDAT      20 , 0 , "DMA_INTFLAGS     :" ;BIN(DMA_INTFLAGS)      ;"   ", WHITE , BLACK
  120. LCDAT      30 , 0 , "DMA_STATUS       :" ;BIN(DMA_STATUS)        ;"   ", WHITE , BLACK
  121. LCDAT      40 , 0 , "DMA_TEMP         :" ;BIN(DMA_TEMP)          ;"   ", WHITE , BLACK
  122. LCDAT      50 , 0 , "DMA_CH0_CTRLA    :" ;BIN(DMA_CH0_CTRLA)     ;"   ", WHITE , BLACK
  123. LCDAT      60 , 0 , "DMA_CH0_CTRLB    :" ;BIN(DMA_CH0_CTRLB)     ;"   ", WHITE , BLACK
  124. LCDAT      70 , 0 , "DMA_CH0_ADDRCTRL :" ;BIN(DMA_CH0_ADDRCTRL)  ;"   ", WHITE , BLACK
  125. LCDAT      80 , 0 , "DMA_CH0_TRIGSRC  :" ;BIN(DMA_CH0_TRIGSRC)   ;"   ", WHITE , BLACK
  126. LCDAT     110 , 0 , "DMA_CH0_TRFCNT   :" ;DMA_CH0_TRFCNT         ;"   ", WHITE , BLACK
  127. LCDAT     120 , 0 , "DMA_CH0_REPCNT   :" ;DMA_CH0_REPCNT         ;"   ", WHITE , BLACK
  128. LCDAT     130 , 0 , "DMA_CH0_SRCADDR0 :" ;DMA_CH0_SRCADDR0       ;"   ", WHITE , BLACK
  129. LCDAT     140 , 0 , "DMA_CH0_SRCADDR1 :" ;DMA_CH0_SRCADDR1       ;"   ", WHITE , BLACK
  130. LCDAT     150 , 0 , "DMA_CH0_SRCADDR2 :" ;DMA_CH0_SRCADDR2       ;"   ", WHITE , BLACK
  131. LCDAT     160 , 0 , "DMA_CH0_DESTADDR0:" ;DMA_CH0_DESTADDR0      ;"   ", WHITE , BLACK
  132. LCDAT     170 , 0 , "DMA_CH0_DESTADDR0:" ;DMA_CH0_DESTADDR1      ;"   ", WHITE , BLACK
  133. LCDAT     180 , 0 , "DMA_CH0_DESTADDR0:" ;DMA_CH0_DESTADDR2      ;"   ", WHITE , BLACK
  134.  
  135. LCDAT 200 , 0 , "COM5 ";COM5 , WHITE, BLACK
  136. TCC0_PER=COM5
  137. LOOP
  138. END
  139. '-------------------------------------------------------------------------------------------------------------------------------------------
  140. '$INCLUDE "COLOR16x16.FONT"
  141. $INCLUDE "COLOR8x8.FONT"
  142. '-------------------------------------------------------------------------------------------------------------------------------------------
  143. SERIAL4CHARMATCH:
  144. PUSHALL
  145. INPUT #5 , RS232_5 NOECHO
  146. COM5 = VAL(RS232_5)
  147. POPALL
  148. RETURN
  149.  
  150. 'DMA_INT:
  151. 'RETURN
  152.  
  153. SIN_DATA:
  154. DATA 2081%,2216%,2352%,2485%,2617%,2745%,2871%,2992%,3109%,3220%,3326%,3425%,3518%,3604%,3682%,3752%
  155. DATA 3814%,3867%,3911%,3947%,3972%,3989%,3996%,3994%,3982%,3961%,3930%,3890%,3841%,3784%,3718%,3644%
  156. DATA 3562%,3473%,3376%,3274%,3165%,3051%,2932%,2808%,2681%,2551%,2419%,2284%,2149%,2012%,1877%,1741%
  157. DATA 1608%,1476%,1348%,1222%,1101%,984%,873%,767%,668%,575%,489%,411%,341%,279%,226%,182%
  158. DATA 146%,121%,104%,97%,99%,111%,132%,163%,203%,252%,309%,375%,449%,531%,620%,717%
  159. DATA 819%,928%,1042%,1161%,1285%,1412%,1542%,1674%,1809%,1944%
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: DMA włącz / wyłącz przez zmienną i przycisk

Post autor: niveasoft » 02 mar 2024, 17:57

Próbowałeś bitu ENABLE w DMA_CTRL albo DMA_CH0_CTRLA?
Według dokumentacji DMA wyłączy się dopiero jak skończy przesyłać rozpoczęty transfer.
  1. SwitchSub:
  2.  If SwitchByte = 0 Then SwitchByte = 1 Else SwitchByte = 0  'teraz jedno z poniższych
  3.  DMA_CTRL.7 = SwitchByte
  4.  DMA_CH0_CTRLA.7 = SwitchByte
  5. Return
Jak Bascom ustawia wartośc bitową z bajtu to weźmie jego bit 0.
Awatar użytkownika
tomaszdko
Posty: 78
Rejestracja: 06 gru 2018, 19:58

Re: DMA włącz / wyłącz przez zmienną i przycisk

Post autor: tomaszdko » 06 mar 2024, 19:16

Trochę się pobawiłem DMA . Podstawowa sprawa i najważniejsza to to że działa niezależnie od procka i zatrzymanie "Dma_ch0_ctrla.7=0" przesyłu tablicy powoduje włączenie rejestrów błędu .
Nie szukałem dalej jak zrobić by kontynuować przesył bo chyba najłatwiej to by było ponowne skonfigurowanie DMA .
Tu jest przykład użycia programu z pierwszego ale z użyciem kilku linijem wł/wył
  1. IF pinA.0=0 THEN
  2. Dma_ch0_ctrla.7  = 1
  3. ELSE
  4. Dma_ch0_ctrla.7  = 0
  5. END IF
Jak widać każde wł/wył powoduje deformację a ostatnia fotka pokazuje napięcie stałe (jest to ostatnia dana z tablicy 1944% i zgadza się z napięciem na DAC).
Efekt jest taki sam za każdym razem . Kiedy używa się zatrzymanie przez TIMER lub DAC to DMA wstrzymuje nadawanie ale nie wykrzacza się . Powtórne uruchomienie TIMER lub DAC powoduje
poprawną pracę . Musiałem tylko dopisać zerowanie DAC bo wartość przy zatrzymaniu ma taką jak była podana z tablicy przez DMA .
Ciekawa sprawa to DMA ale dla hobbysty to tylko chyba przebiegi jak ten tu bo do poważniejszych spraw to trzeb by się zagłębić i pamiętać o tym że DMA jest niezależne!
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
ODPOWIEDZ