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   94 / 178
(#) rolandgw válasza kapu48 hozzászólására (») Máj 31, 2017 /
 
Itt találsz egyszerű példa rá, miért kell a do/while.
Bővebben: Link
(#) csabeszq válasza kapu48 hozzászólására (») Máj 31, 2017 /
 
A do - while(0) ciklusok értelme elsősorban hibakezelés.

  1. if( ha_ez_van )
  2.   goto eltoltam;
  3. if( ha_meg_ez_van )
  4.   goto eltoltam;
  5. if( ha_gaz_van )
  6.   goto eltoltam;
  7. // hurrá siker
  8. return 1;
  9. eltoltam: // hát sajna befürdöttünk
  10.   return 0;

A fenti goto utasítást a programozók zsigerből utálják, ezért a következő kód alakul ki:

  1. do
  2. {
  3.   if( ha_ez_van )
  4.     break;
  5.   if( ha_meg_ez_van )
  6.     break;
  7.   if( ha_gaz_van )
  8.     break;
  9.   // hurrá siker
  10.   return 1;
  11. }while(0);
  12. // hát sajna befürdöttünk
  13. return 0;
A hozzászólás módosítva: Máj 31, 2017
(#) cimopata válasza csatti2 hozzászólására (») Jún 1, 2017 /
 
Köszönöm, igen így már működik
(#) cimopata hozzászólása Jún 3, 2017 /
 
Újból megőrít a DMA-s USART.

Beraktam egy időzítő interruptjába az adatok küdését pontosan 4 csomagot.
Szkópon nézem indítás után egyszer elküldi az adatot utána pedig többet nem pedig a függvény meghívódik.
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2.         {      
  3.                 //GPIOA->ODR = GPIOA->ODR | 0x10;
  4.                
  5.                 if(htim->Instance==TIM3)
  6.                                 {      
  7.                                                 //DMA1_Channel4->CCR |= DMA_CCR_EN ;
  8.                                         HAL_GPIO_TogglePin  (GPIOA,GPIO_PIN_5);
  9.                                         DMA1->ISR |= DMA_ISR_TCIF4; // dma ch3 transfer complete clear
  10.                                         USART1->ICR |= USART_ICR_TCCF;
  11.                                         USART1->CR1 |= USART_CR1_TCIE;
  12.                                         //DMA1->IFCR = DMA_IFCR_CGIF4;
  13.                                         //DMA1_Channel4->CCR |= DMA_CCR_EN ;
  14.                                         HAL_UART_Transmit_DMA(&huart1, usart_tx_store, 4); //send data
  15.                                         usart_tx_store[0]=0;
  16.                                         usart_tx_store[1]=0;
  17.                                         usart_tx_store[2]=0;
  18.                                         usart_tx_store[3]=0;
  19.                                 }
  20.         }



Már egyszerűen nem tudom miért nem küldi folyamatosan.
(#) csatti2 válasza cimopata hozzászólására (») Jún 3, 2017 /
 
Töröld ki az enable bitet.
(#) ha1drp válasza cimopata hozzászólására (») Jún 4, 2017 /
 
A HAL_UART_Transmit_DMA függvény nem blokkolja a CPU-t. Azaz még el sem küldte az adatokat, viszont te már törölted is őket.
A HAL függvények teljesen korrektül kezelik a flag-eket. Neked nem kellene és nem is szabadna módosítgatni. Minden HAL függvénynek van visszatérő értéke (pl. HAL_OK ) azt kérdezd le inkább.
(#) cimopata válasza ha1drp hozzászólására (») Jún 4, 2017 /
 
Nos. Megtaláltam mi volt. Az a baj hogy ha sem az adatlap sem semmi nem említi hogy DMA mellé kötelező engedélyezni a periféria interrupját is ami jelen esetben az USART.

Beraktam azt az 1 sort és már ment is. Bár nem értem ha valaki cube-al generál cuccost akkor miért nem engedélyezi automatikusan azt is ha Normal módban úgysem működik nélküle. Circular modeban megy de Normal mode-ban kell a global interrupt.
(#) kapu48 hozzászólása Jún 9, 2017 /
 
Szép napot Uraim!

Kevés sgítség kellene!
Nem értem! Ez a map() fügvény miért ad nekem mindig 0-át vissza?
  1. /* Private define ------------------------------------------------------------*/
  2. #define TOUCH_ADX_VALUE_MAX    (3870)
  3. #define TOUCH_ADX_VALUE_MIN    (300)
  4. #define TOUCH_ADY_VALUE_MAX    (3720)
  5. #define TOUCH_ADY_VALUE_MIN    (275)
  6.  
  7.  
  8. uint16_t map(uint16_t value, uint16_t istart, uint16_t istop, uint16_t ostart, uint16_t ostop)
  9. {
  10.                 uint16_t mapt = (ostart + (ostop - ostart) * ((value - istart) / (istop - istart)));
  11.     return mapt;
  12. }
  13.  
  14. ....
  15.     } while(!pstate->TouchDetected);
  16.                         point_new.x = pstate->X;
  17.                         point_new.y = pstate->Y;
  18.                 printf("point_new.X = %d\n\r", point_new.x);
  19.                 printf("point_new.Y = %d\n\r", point_new.y);           
  20.                
  21.                         /*Calculate coordinates*/      
  22. Ezek mért adnak nekem mindig 0-át vissza???  
  23.                         point_new.x = map(point_new.x, TOUCH_ADX_VALUE_MIN, TOUCH_ADX_VALUE_MAX, 0, LCD_PIXEL_WIDTH - 1);
  24.                         point_new.y = map(point_new.y, TOUCH_ADY_VALUE_MIN, TOUCH_ADY_VALUE_MAX, 0, LCD_PIXEL_HEIGHT - 1);             
  25.                 printf("Map_new.X = %d\n\r", point_new.x);
  26.                 printf("Map_new.Y = %d\n\r", point_new.y);
  27.         ....     
  28.                  
  29.                 }

Az eredmények:
point_new.X = 2059
point_new.Y = 2907
Map_new.X = 0
Map_new.Y = 0
point_new.X = 2027
point_new.Y = 2942
Map_new.X = 0
Map_new.Y = 0
point_new.X = 1712
point_new.Y = 2666
Map_new.X = 0
Map_new.Y = 0
point_new.X = 1711
point_new.Y = 2672
Map_new.X = 0
Map_new.Y = 0
point_new.X = 722
point_new.Y = 1555
Map_new.X = 0
Map_new.Y = 0
point_new.X = 1075
point_new.Y = 1561
Map_new.X = 0
Map_new.Y = 0
point_new.X = 1090
point_new.Y = 1564
Map_new.X = 0
Map_new.Y = 0
(#) toto válasza kapu48 hozzászólására (») Jún 9, 2017 / 1
 
Ha jól látom, rosszul végzed el az osztási műveletet uint16-on. Osztasz (istop-istart)-tal, ami olyan 3570. Ha (value-istart) értéke nem nagyobb ettől a 3570-től, akkor mindig nullát fogsz kapni. Rossz helyen van a zárójelezés, mert először osztasz, csak ezután szorzod a kapott értéket (ostop-ostart)-tal.
Vagy lebegőpontosra rakod át a számítást, ami időben kicsit tovább tart, vagy átszervezed a számítást, és mondjuk az osztandót megszorzod egy konstanssal, int32-n elvégzed a számítást, és utána osztod ugyanazzal a konstanssal.
Vagy már az alábbi is segíthet, ha először a két számot összeszorzod, és csak utána osztasz.
uint16_t mapt = ostart + (ostop - ostart) * (value - istart) / (istop - istart);
A hozzászólás módosítva: Jún 9, 2017
(#) kapu48 válasza toto hozzászólására (») Jún 10, 2017 /
 
Köszönöm a segítséget!

Akkor ott rontottam el, hogy az eredeti double-ket lecseréltem uint-re.
És nem gondoltam át a hatását.

A zárójelezés áthelyezés javaslatod, elfogadható eredményt hozott.
(#) cimopata hozzászólása Jún 13, 2017 /
 
Üdvözlet.

Méregetem az STM32 F030 ADC -t és sajnos nem értem miért de 5-7% os hibával mér. 1.24V 5mV-os zajjal mér 1700-at de kb 1545-t kellene mérnie. A tápja 3,286V 10mV zaj mert megy egy PWM kimenet.

100nF az adc bemeneten 2x100nF +10µF a tápon LD1117-33 a stab.
A mérést 16-os mozgóátlaggal simítom szóval ez nem véletlen méérési hiba hanem valami iszonyat offset hiba.

Másik panelem 1545-helyett 1486-ot mér. AZ is rengeteg.

Találkozott már valaki ilyennel?
(#) csatti2 válasza cimopata hozzászólására (») Jún 13, 2017 /
 
Ellenőrizd mennyin járatod az ADC-t. Lehet rossz órajel beállításokat használsz. Milyen sample rate-t használsz egyébként? A belső refet általában nem lehet akármekkora gyakorisággal mérni.
A hozzászólás módosítva: Jún 13, 2017
(#) cimopata válasza csatti2 hozzászólására (») Jún 13, 2017 /
 
Standard 14Mhz-en megy amit alapban felajánl beállításnak.
1.5 ciklus mintavétel így 1uS gy minta.
(#) csatti2 válasza cimopata hozzászólására (») Jún 13, 2017 /
 
Na ott a probléma. Nem mintavételezheted olyan gyakran.
(#) cimopata válasza csatti2 hozzászólására (») Jún 13, 2017 /
 
Belső refet nem mértem eddig sohat, a kalibráció hiánya okozhat ekkora eltérést?
(#) csatti2 válasza cimopata hozzászólására (») Jún 13, 2017 /
 
Nem. Egyszerűen nem szabad túl rövid ciklusidővel mintavételezni. Gyanítom, hogy olyan kicsi áramot tud leadni, hogy nem megfelelően töltődnek a mintavételező kondik.
Itt a vonatkozó katalógusrész:
A hozzászólás módosítva: Jún 13, 2017
(#) cimopata válasza csatti2 hozzászólására (») Jún 13, 2017 /
 
Azért raktam 100nF kondit a bemenetére hogy még véletlenül se forduljon elő hogy nem tud precíz mintát venni. Abból indultam ki , hogy a Radc és a Cadc bemenő R_C páros indőállandója jóval kissebb mint a mintaváteli idő de most hogy nézem az adatlapban maximum 1k-8pF ami legrosszabb esetben tényleg elég durva. Megpróbálom hosszabb mintavétellel, de nekem akkor is furcsa mert ebben az esetben mindig csak egyirányú lenne az offset.
(#) cimopata válasza csatti2 hozzászólására (») Jún 13, 2017 /
 
Átállítottam 55.5 ciklusra, kb semmi változás.
(#) csatti2 válasza cimopata hozzászólására (») Jún 13, 2017 /
 
Én le szoktam választani az analóg tápot a digitálisról egy ferritgyöngy/kondi párossal (ezt kapják a műv erősitűk stb is). Majd az IC közelében kap egy 1µF +100nF párost még. Természetesen az analóg föld is külön van a digitálistól.
(#) cimopata válasza csatti2 hozzászólására (») Jún 13, 2017 /
 
kalibrálni szoktál?
(#) csatti2 válasza cimopata hozzászólására (») Jún 13, 2017 /
 
Nem. Mondjuk én az F103-as sorozatot használom.

Csak a biztonság kedvéért kérdezem. Bekapcsoltad a fesz. referenciát az ADC_CCR regiszterben?
A hozzászólás módosítva: Jún 13, 2017
(#) cimopata válasza csatti2 hozzászólására (») Jún 13, 2017 /
 
Nem, mért kellett volna?
(#) csatti2 válasza cimopata hozzászólására (») Jún 13, 2017 /
 
Igen.
(#) cimopata válasza csatti2 hozzászólására (») Jún 13, 2017 /
 
A program elején írjam 1-be az ADC_CR_ADCAL-t?
(#) csatti2 válasza cimopata hozzászólására (») Jún 13, 2017 /
 
ADC->CCR |= ADC_CCR_VREFEN; vagy vmi ilyesmi lesz.
A hozzászólás módosítva: Jún 13, 2017
(#) cimopata válasza csatti2 hozzászólására (») Jún 13, 2017 /
 
Nem értem az összefüggést.

Nálam a referencia a VDDA táp minek kellene nekem a ref fesz?
(#) csatti2 válasza cimopata hozzászólására (») Jún 13, 2017 /
 
Most engem zavartál össze. 1,24V-ot írsz és belső referenciát a hozzászólásaidban. Na most 1,2V-os a belső referencia, ami nem függ a VDDA tápfesztől.
(#) cimopata válasza csatti2 hozzászólására (») Jún 13, 2017 /
 
Nem írtam hogy a belső referenciát használnám. A mérendő bemenetre írtam, hogy 1,24V és arra ad vissza 5% hibát. Lehetne a bemenet 2V-is nem az lényeg. A proci belső referenciájához hozzá sem nyúltam. A 3,3V lenne a 4095 érték.
(#) csatti2 válasza cimopata hozzászólására (») Jún 13, 2017 /
 
Idézet:
„Belső refet nem mértem eddig sohat, a kalibráció hiánya okozhat ekkora eltérést?”

Na ez zavart akkor meg. Illetve a fesz is stimmelt a belső refre.
(#) csatti2 hozzászólása Jún 13, 2017 /
 
Szokásos lépések F103-nál (gondolom F30-nál is hasonló lesz).
Periféria órajelek bekapcsolása (ADC, GPIO, esetleg DMA).
ADC konfiguráció.
DMA konfiguráció.
ADC kalibráció reset. -> vár míg kész
ADC kalibráció. -> vár míg kész
DMA engedélyezés.
ADC engedélyezés.
Következő: »»   94 / 178
Bejelentkezés

Belépés

Hirdetés
XDT.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