Fórum témák

» Több friss téma
Fórum » ARM - Miértek hogyanok
 
Témaindító: gtk, idő: Jún 26, 2007
Lapozás: OK   176 / 176
(#) vargham válasza sdrlab hozzászólására (») Ápr 9, 2024 /
 
A volatile annyit mond a compilernek, hogy a változó tartalma megváltozhat két elérés között akkor is, ha az adott kódban nem változtat rajta semmi. Ezért mindig az adott címen éri el.
Tipikus esete ennek, amikor valami megszakíthatja a kód futását, például interrupt handler vagy OS esetén másik task. Ahogy fentebb írtam a cache egy transzparens hardver, az ellen nem véd.
Harvard architektúra esetén ez annyival bonyolódik, hogy a programkód és az adatok külön memóriában (buszon) vannak és ha van cache, az sem közös. Mikrokontrollerek esetén a konstans adatok is a programkóddal együtt a flashben tárolódnak, hogy ne vesszenek el. Ezért ott bevett dolog, hogy bekapcsoláskor ezeket a konstansokat beolvassa a RAM-ba, ahol a többi adat is van, és soha többé nem nézi meg őket a flashban. Általában speciális flash elérési utasításokkal lehet rávenni a CPU-t, hogy ott keresse midnen egyes alkalommal az adatot. A volatile ebben sem segít.
(#) sdrlab válasza vargham hozzászólására (») Ápr 9, 2024 /
 
Idézet:
„Általában speciális flash elérési utasításokkal lehet rávenni a CPU-t, hogy ott keresse midnen egyes alkalommal az adatot. A volatile ebben sem segí”

Akkor ezt beszéld meg a fordítókkal is, hogy eszerint működjenek, mert amikkel nekem dolgom volt, azok konzekvensen úgy működtek, ahogy már leírtam!!
Amúgy örülök, hogy begugliztad magadnak a leírásokat, és azokat adod itt elő egy az egyben, ezt más is meg tudja tenni! Ami már nehezebb, az a gyakorlati tényekkel szembemenni...
Egyébként, az még lehetséges, hogy optimalizációs beállítás kérdése is ennek a működése..., nálam általában szinte mindig méretre van maximálisan optimalizálva a kód, néha egyes modulok sebességre, de olyan szinte sohasincs, hogy optimalizálás/debug nélküli verzió fut...
(#) toto hozzászólása Ápr 13, 2024 /
 
Sziasztok!
Embitzben programozok STM32F103-at:
lassú külső portok figyelése, vezérlése, grafikus LCD-ra való rajzolás.A portok között van, amit sima pollinggal, van, amit megszakítással figyelek. Használok Timereket, de az adott rész működésébe nem szólnak bele.
A gondom a következő: egy hibát keresve debugolom, de gyakran más eredmények születnek a continuous és a next step debug allkalmazásakor. Figyelem a portokat külön is, és azt kizárnám, hogy a menet közbeni portok változása, vagy zajossága okozza a gondomat.
Nincs watchdog, a Timerek itt nem játszanak, -O0 optimalizációval fordítom.
Kódot nem mellékelek, mert elég nagy a forrás. Nem kódvadászatra, inkább tanácsra lenne szükségem, hogy mire kellene még figyelnem?
(A debugolást még az is nehezítette, hogy ST-link V3-at használtam, de azzal gyakran megszakad a kapcsolat. Lehet, az USB kábel vacakol a nagyobb sebesség miatt. ST-link V2-vel úgy tűnik, hogy stabil az EBlink.)
Egyenként léptetve a program jól működik, de folyamatos módban, live variable-t figyelve már gyakran hibázik. Debug nélkül simán futtatva is hibázik.
GPIO-IDR regisztereket figyelve mintha régi állapotot olvasna időnként. Nem használok API-kat, simán a regisztert olvasom: if((GPIOA->IDR) & GPIO_IDR_IDR11) counter++;
(#) toto válasza toto hozzászólására (») Ápr 13, 2024 /
 
Lehet, hogy hülyeséget csináltam. Tegnap órákat vacakoltam ezzel, most meg beugrott - miután leírtam a kérdésem -, hogy az egyik bemeneten egy viszonylag nagy időállandójú integrátort tettem, és lehet, hogy a bemenet változása után nem várok elég időt a lekérdezéssel.
Sajnos, csak hétfőn tudom ezt ellenőrizni.
A hozzászólás módosítva: Ápr 13, 2024
(#) Tambi hozzászólása Ápr 15, 2024 /
 
Kedves Fórumtársak!

Valaki megmérte, de legalábbis feltöltötte valahova az ATMEGA328p ADC valódi karakterisztikáját; honnan indul, milyen görbe mentén, meddig mér valójában... stb..

Ha valakinek megvan legyen szíves feltölteni.

Köszönöm szépen!

Derűs napot; Tambi
(#) Thomas10100 hozzászólása 21:37 /
 
Sziasztok!

Frekvenciát szeretnék mérni STM32H753 mikrovezérlővel input capture dma segítségével. 0-4000Hz között, kb. TIM2 és TIM5 CH1 bemeneteket kiválasztottam, DMA-t beállítottam hozzá.

Amit találtam projektet, hibát ad kettő sorra. Viszont ez F373 mikrovezérlőre van:
  1. #define LENGTH_ARRAY 100
  2. static uint8_t data_index_for_tim2_channel_1 = 0;
  3. static uint8_t data_index_for_tim5_channel_1 = 0;
  4. static uint16_t input_capture0[LENGTH_ARRAY] = {0};
  5. static uint16_t input_capture1[LENGTH_ARRAY] = {0};
  6. static TIM_HandleTypeDef* handler_tim2;
  7. static TIM_HandleTypeDef* handler_tim5;
  8.  
  9. void Init_Input_Capture(TIM_HandleTypeDef* htim2, TIM_HandleTypeDef* htim5) {
  10.         /*
  11.          * Input capture for measuring frequency
  12.          * For TIM17 and TIM16
  13.          * Timer clock: 48 Mhz
  14.          * Prescaler: 4799
  15.          * Counter: 65535 (0xffff)
  16.          * Update frequency: 0.1526 Hz (1/0.1526 = 6.5535 seconds)
  17.          */
  18.         if(HAL_TIM_IC_Start_DMA(htim2, TIM_CHANNEL_1, (uint32_t*)input_capture0, LENGTH_ARRAY) != HAL_OK)
  19.                 Error_Handler();
  20.         if(HAL_TIM_IC_Start_DMA(htim5, TIM_CHANNEL_1, (uint32_t*)input_capture1, LENGTH_ARRAY) != HAL_OK)
  21.                 Error_Handler();
  22.  
  23.         /* Save */
  24.         handler_tim2 = htim2;
  25.         handler_tim5 = htim5;
  26. }
  27.  
  28. static uint16_t compute_period(uint16_t input_capture[], uint8_t left) {
  29.         /* Find the index - i0 and i1 can never be larger than LENGTH_ARRAY and lower than 0 */
  30.         uint8_t a = 2*LENGTH_ARRAY - left;
  31.         uint8_t i0 = (a - 2) % LENGTH_ARRAY;
  32.         uint8_t i1 = (a - 1) % LENGTH_ARRAY;
  33.  
  34.         /* Check absolute value */
  35.         if(input_capture[i1] > input_capture[i0])
  36.                 return input_capture[i1] - input_capture[i0];
  37.         else if(input_capture[i1] < input_capture[i0])
  38.                 return input_capture[i1] + 0xFFFF - input_capture[i0];
  39.         else
  40.                 return 1;
  41. }
  42.  
  43. uint16_t STM32_PLC_Input_Capture_Get_Raw(uint8_t i){
  44.         switch(i){
  45.         case 0:
  46.                 return compute_period(input_capture0, handler_tim2->hdma[TIM_DMA_ID_CC1]->Instance->CNDTR);
  47.         case 1:
  48.                 return compute_period(input_capture1, handler_tim5->hdma[TIM_DMA_ID_CC1]->Instance->CNDTR);
  49.         default:
  50.                 return 0;
  51.         }
  52. }
  53.  
  54. float STM32_PLC_Input_Capture_Get_Calibrated(uint8_t i){
  55.         return 1.0f/((float)STM32_PLC_Input_Capture_Get_Raw(i)*0.0001f); /* Converting to Hz */
  56. }
  57.  
  58. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
  59.         if(htim->Instance == TIM2){
  60.                 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){
  61.                         if(data_index_for_tim2_channel_1 >= LENGTH_ARRAY)
  62.                                 data_index_for_tim2_channel_1 = 0;
  63.                         input_capture0[data_index_for_tim2_channel_1++] = htim->Instance->CNT;
  64.                 }
  65.         }
  66.         if(htim->Instance == TIM5){
  67.                 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){
  68.                         if(data_index_for_tim5_channel_1 >= LENGTH_ARRAY)
  69.                                 data_index_for_tim5_channel_1 = 0;
  70.                         input_capture1[data_index_for_tim5_channel_1++] = htim->Instance->CNT;
  71.                 }
  72.         }
  73. }


A hiba a képen, mert nem engedte betenni.

Bármilyen segítséget szívesen fogadok!
Köszönöm
A hozzászólás módosítva: 21:40

hiba.jpg
    
Következő: »»   176 / 176
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem