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   99 / 176
(#) david10 válasza csatti2 hozzászólására (») Aug 9, 2017 /
 
(#) icserny válasza david10 hozzászólására (») Aug 9, 2017 /
 
Idézet:
„Ez tartalmazná az ST-link programozót is?”

Igen, a letörhető kis panelon az van.
(#) csabeszq válasza david10 hozzászólására (») Aug 9, 2017 /
 
Nekem az STM32F103 nagyon bejött. Az AliExpress-en már 1.7$-ért rendelhető, a tudása/perifériái viszont tényleg komolyak.

A másik kedvenc a Nodemcu (ESP8266), abban a Wifi szolgáltatás nagyon jó, csapnivaló perifériákkal és kevés pinnel. Viszont a Nodemcu 1MByte kódot is tud futtatni!, emellett a flash-en még 3MByte hely marad adatoknak, ami nem kevés, ha web szervert akarsz írni.

Nálam most a paletta:
- STM32F103: gyors chip, jó perifériákkal (ADC/SPI/I2C/...)
- ESP8266: wifi, nagy kód
- Attiny85, Attiny84: ha kis panelt akarok építeni, nem nagy batárt
(#) cimopata hozzászólása Aug 12, 2017 /
 
Érthetetlen problémába ütköztem.

4db Bemeneteket használnék számláló megvalósításához. A megszakítás meghívódik ezt a HAL_UART_Transmit el ellenőrzöm.

De a belső if(!(GPIOA->IDR & 0x10)) már nem hajtódik végre. Pedig a megfelelő lábat kapcsolgatom. Próbáltam a if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)) feltétellel is de azzal sem láttok esetleg valami hibát amit én nem? A megszakítás meg sem hívódhatna ha a láb nem menne le alacsonyba érthetetlen.

  1. void EXTI4_15_IRQHandler(void)
  2. {
  3.  HAL_UART_Transmit_DMA(&huart1, usart_tx_store, 1); //send data                        
  4.   /* USER CODE BEGIN EXTI4_15_IRQn 0 */
  5.                         if(!(GPIOA->IDR & 0x10))
  6.                                 {
  7.                                         HAL_UART_Transmit_DMA(&huart1, usart_tx_store, 1); //send data
  8.                                         if(dig_prell_counter_in_0 >= 10) //PA4=IN0
  9.                                                 {
  10.                                                        
  11.                                                 dig_prell_counter_in_0=0;      
  12.                                                 dig_counter_in_0++;
  13.                                                
  14.                                                 if(dig_counter_in_0>255)
  15.                                                         {dig_counter_in_0=0;}
  16.                                                 }
  17.                                 }
  18.                                
  19.                         if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5))
  20.                                 {
  21.                                        
  22.                                         if(dig_prell_counter_in_1>=10) //PA5=IN1
  23.                                                 {
  24.                                                 dig_prell_counter_in_1=0;      
  25.                                                 dig_counter_in_1++;
  26.                                                 if(dig_counter_in_1>255)
  27.                                                         {dig_counter_in_1=0;}
  28.                                                 }
  29.                                 }
  30.                                
  31.                         if(!(GPIOA->IDR & 0x40))
  32.                                 {
  33.                                         if(dig_prell_counter_in_2>=10) //PA6=IN2
  34.                                                 {
  35.                                                 dig_prell_counter_in_2=0;      
  36.                                                 dig_counter_in_2++;
  37.                                                 if(dig_counter_in_2>255)
  38.                                                         {dig_counter_in_2=0;}
  39.                                                 }
  40.                                 }
  41.                        
  42.                         if(!(GPIOA->IDR & 0x80))
  43.                                 {
  44.                                         if(dig_prell_counter_in_5>=10) //PA7=IN5
  45.                                                 {
  46.                                                 dig_prell_counter_in_5=0;      
  47.                                                 dig_counter_in_5++;
  48.                                                 if(dig_counter_in_5>255)
  49.                                                         {dig_counter_in_5=0;}
  50.                                                 }
  51.                                 }      
  52.   /* USER CODE END EXTI4_15_IRQn 0 */
  53.   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
  54.   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
  55.   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
  56.   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
  57.   /* USER CODE BEGIN EXTI4_15_IRQn 1 */
  58.  
  59.   /* USER CODE END EXTI4_15_IRQn 1 */
  60. }
A hozzászólás módosítva: Aug 12, 2017
(#) kapu48 válasza cimopata hozzászólására (») Aug 12, 2017 1 /
 
Esetleg így próbáld: if((GPIOA->IDR & 0x10) == 0)
(#) cimopata válasza kapu48 hozzászólására (») Aug 12, 2017 /
 
Sajnos nem megy így sem. De még a HAL-os sem ami máshol megy. Egyébként sok sok hülyeség egyszerűen nem működik a programban. Pl a nem hajlandó a uint16_t tömből másik változóba írni meg

  1. analog_in4=adc_store[1];



a másik szorozni próbálok két értéket utána pedig elosztani 4095-el mindig 0 az eredmény ha lecserélem az adc_store[2]-t mondjuk valami számra pl 1000 akkor megy. Pedig az adc_store közvetlenül a DMA val van feltöltve és ha azt olvasom akkor ugyan úgy van benne érték tehát nem nulla.

  1. analog_corrected_in1 = (analog_correction_in1 * adc_store[2] ) >> 12;


Olyan mintha meghülyült volna a fordító vagy maga a processzor nem tudom.
(#) kapu48 válasza cimopata hozzászólására (») Aug 12, 2017 1 /
 
Mohndjuk ez GPIOA->IDR 16 bites regiszter.: if((GPIOA->IDR & 0x0010) == 0) ?
(#) benjami válasza cimopata hozzászólására (») Aug 13, 2017 /
 
Nem írtad melyik vezérlőt használod, meg az induláskori beállításokat sem közölted, de stm32f103 esetén a pending regisztert törölni kell a megszakításban pl:
  1. EXTI_ClearITPendingBit(EXTI_Line0);
(#) cimopata válasza benjami hozzászólására (») Aug 13, 2017 /
 
(#) cimopata hozzászólása Aug 13, 2017 /
 
Nem az a baj hogy nem hívódik meg a megszakítás hanem meghívódik de azon belül egy egyszerű input read feltétel nem teljesül amikor tudom jól hogy teljesülni kellene. EZ az amit nem értek.
(#) ha1drp válasza cimopata hozzászólására (») Aug 13, 2017 /
 
A második HAL_UART_Transmit_DMA függvény soha nem fog lefutni, mert az első még biztosan nem végzett.
(#) rolandgw válasza cimopata hozzászólására (») Aug 13, 2017 / 1
 
Úgy emlékszem, hogy a megszakításban a EXTI_PR-t kell lekérdezni, nem a GPIO-t.
(#) csatti2 válasza cimopata hozzászólására (») Aug 13, 2017 /
 
volatile-nek konfiguráltad az adc_store-t? Ha sehol sem írod a programban (csak DMA írja), akkor simán kioptimalizálhatja a fordító. Másik probléma lehet ha rossz méretűek (típusúak) a változóid és emiatt túlcsordulás lép fel, de ez nem látszik a mellékelt példákból.
(#) csatti2 válasza rolandgw hozzászólására (») Aug 13, 2017 /
 
GPIO-val is működnie kellene (én gyakran azzal használom, hisz sokszor mind lefutó mind felfutó élre szeretném, ha meghívódna). Látnunk kéne, hogy konfigurálta az EXTI megszakítást, illetve a GPIO bemeneteket, hogy többet mondjunk.
(#) csatti2 válasza cimopata hozzászólására (») Aug 13, 2017 /
 
Még egy kérdés. Miért nem rendes számlálót használsz input capture-el? Akkor hardveresen elintézhetnéd az egészet. Persze, azért előtte jöjj rá mi a gond (abból lehet a legjobban tanulni).
(#) cimopata válasza csatti2 hozzászólására (») Aug 13, 2017 /
 
A számláló jó lett miután kicseréltem a GPIOA->IDR feltételt az EXTI->PR re.
Így működik:

  1. if(EXTI->PR & 0x01)
  2.                 {
  3.                         if(dig_prell_counter_in_4>=100) //PB0=IN4
  4.                                 {
  5.                                 GPIOA->BSRR = 0x0100; //set PA8 led
  6.                                 dig_prell_counter_in_4=0;      
  7.                                 dig_counter_in_4++;
  8.                                 if(dig_counter_in_4>4095)
  9.                                         {dig_counter_in_4=0;}
  10.                                 }
  11.                 }


Az adc_store[] máslása másik változóba megoldódott úgy hogy volatile uint16_t ként deklaráltam. Előtte sima uint_16 volt.

Ami még nem megy az a szorzás ami rossz eredményt ad vissza:

  1. analog_corrected_in4 = ((analog_correction_in4 * analog_in4 ) & 0xFFFFF000 ) >> 12;


mindegyik változó uint32_t
Egyenként olvasva a változók értéke:
analog_correction_in4 = 4095
analog_in4 = 1407 (1405-1410 közt változik ezt az adc_store[] ból másolom)
és eredményül a analog_corrected_in4 kb 6150-et ad vissza és ez is picit változik gondolom ahogy ahogy analog_in4 változik. Ami fontos hogy csak 12 bitet tudok kiolvasni tehát lehet hogy 6150 még ennél is több.
Most 1407-et kellene kapjak de nem értem miért nem.
(#) cimopata hozzászólása Aug 13, 2017 /
 
Egyébként azért nem csináltam hardveres számlálót mert jelenleg 6 bemenet megy számlálóként és lehet még több meg egyébként nem is gondoltam erre
(#) csatti2 válasza cimopata hozzászólására (») Aug 13, 2017 /
 
Ha csak 12 bitet tudsz kiolvasni, akkor hogy jön ki a 6150?
(#) cimopata válasza csatti2 hozzászólására (») Aug 13, 2017 /
 
Elírtam bocsi 14 bitet. Közben nyektettem a programot és az egyik változó tárolt nagyobb értéket mint 14 bit így egy kicsit másképpen de meg tudtam oldani. Köszönöm a segítségeket remélem így már jó lesz.
(#) benjami válasza cimopata hozzászólására (») Aug 13, 2017 /
 
A & 0xFFFFF000 (alsó 12bit nullázása) szerintem teljesen felesleges, ha utána a 12 bittel jobbra shifteléssel ki is tolod mind a 12-t a semmibe.
(#) cimopata válasza benjami hozzászólására (») Aug 13, 2017 /
 
Jójó, nem voltan benne biztos hogy a semmibe tolja. A windowsos számológépből indultam ki.
(#) csatti2 válasza cimopata hozzászólására (») Aug 14, 2017 /
 
Szerintem kevered a shift-et a rotate-el.
(#) rolandgw hozzászólása Aug 22, 2017 /
 
Üdv!
Segítséget kérnék, kissé belekeveredtem ezekbe a definiálásokba.
Egy részlet a Code Red cég redlib könyvtárából - amit használok - a stdio.h fájlból.
Lényege, hogy kódcsökkentés céljából kérhetek csak integer printf variánst (float nem) a CR_INTEGER_PRINTF definiálással, valamint string esetén karakterenkénti kijelzést -így nem használja a heap-et - a CR_PRINTF_CHAR definiálással.
Jól látom, ha mindkettőt kiválasztom az utóbbi nem érvényesül?
  1. #ifdef CR_INTEGER_PRINTF
  2. #define fprintf _fprintf
  3. #define sprintf _sprintf
  4. #define vfprintf _vfprintf
  5. #define vsprintf _vsprintf
  6. #define vprintf _vprintf
  7. #define snprintf _snprintf
  8. #define vsnprintf _vsnprintf
  9. #if CR_PRINTF_CHAR
  10. #define printf _printf_char
  11. #define puts puts_char
  12. #else
  13. #define printf _printf
  14. #endif
  15. #elif CR_PRINTF_CHAR
  16. #define printf printf_char
  17. #define puts puts_char
  18. #endif
(#) rolandgw válasza rolandgw hozzászólására (») Aug 22, 2017 /
 
Közben megfejtettem, tényleg hibás. A 9. sorba #ifdef kell, nem #if.
(#) csabeszq hozzászólása Aug 30, 2017 /
 
A 3.3V kicsit szokatlan nekem, szoktatok rajta FET-et használni, vagy bipoláris tranzisztor kell egy relé kapcsolásához?

Rendeltem a neten 3.3V-os tranzisztorokat, de alig nyitnak ki, vagy sehogy se. Már egy LED-hez is határeset.

7002 és A39T volt amit vettem.
(#) vargham válasza csabeszq hozzászólására (») Aug 30, 2017 /
 
AO3400 Nekem bevált, Vgs=2.5 Voltnál 4 Ampert tud kapcsolni.
(#) Peter65 válasza csabeszq hozzászólására (») Aug 30, 2017 /
 
Én szeretem a bipoláris tranyókat is használni, de ha valamiért fet kell, akkor kisebb áramokra az FDV301-t használom. Ennek 2,7V-os gate feszültség mellett 5R alatti garantált a kimeneti ellenállása, a bemenete csak kb. 10pF-os.
(#) csabeszq válasza vargham hozzászólására (») Aug 30, 2017 /
 
Köszi, rendeltem 20 db-ot 200 Ft-ért.

P csatornásra van esetleg tuti tippetek?
(#) csabeszq válasza csabeszq hozzászólására (») Aug 30, 2017 /
 
Sikerült alkotnom. Nos a megvásárolt tranzisztoraim tökéletesen mennek 3.3V-on.

Egy probléma volt:
az A79T P csatornás
a 7002 meg N csatornás

Értelemszerűen ha egy P csatornás tranzisztort N-ként kötöm be, akkor érhetnek meglepetések. Ennyivel is okosabb lettem.

A hozzászólás módosítva: Aug 30, 2017
(#) vargham válasza csabeszq hozzászólására (») Aug 30, 2017 /
 
AO3401 P FET nekem bevált.
Következő: »»   99 / 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