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   81 / 176
(#) kapu48 hozzászólása Dec 29, 2016 /
 
Már megint itt vagyok tanácsot kérni!

Soros terminálon próbálom az RTC-t beállítani.
Úgy hogy sorba lépkedek minden értéken, és közben +,- 1-el változtatom az értékeket.
Működne is egészen a másodpercek belövéséig, de azt elég nehéz ezzel a módszerrel eltalálni!
Itt a rutin:
  1. // setT: Ora,perc,másodperc állitás.
  2.                 else if (TM_USART_FindString(PC_USART, "setT") > 0) {
  3.                         printf("Time setup: \r\n");
  4.                         TM_USART_ClearBuffer(PC_USART);         // Clear Usart buffer
  5.                         // Óra setup
  6.                         TM_RTC_GetDateTime(&RTCD, TM_RTC_Format_BIN);
  7.                         printf("ora: %02d: -,+,OK ? ", RTCD.Hours);
  8.                         while(!(TM_USART_FindString(PC_USART, "OK") > 0)) {
  9.                                 if (TM_USART_FindString(PC_USART, "+") > 0) {
  10.                                         TM_USART_ClearBuffer(PC_USART);
  11.                                         if(++RTCD.Hours == 24) RTCD.Hours = 0
  12.                                         printf("\r\nora+: %02d: -,+,OK ?", RTCD.Hours);
  13.                                 }
  14.                                 if (TM_USART_FindString(PC_USART, "-") > 0) {
  15.                                         TM_USART_ClearBuffer(PC_USART);
  16.                                         if(RTCD.Hours) RTCD.Hours--; else RTCD.Hours = 23;     
  17.                                         printf("\r\nora-: %02d: -,+,OK ?", RTCD.Hours);
  18.                                 }                              
  19.                         }
  20.                         TM_USART_ClearBuffer(PC_USART);
  21.                         getC = RTCD.Hours;
  22.                         TM_RTC_GetDateTime(&RTCD, TM_RTC_Format_BIN);
  23.                         RTCD.Hours = getC;
  24.                         // Save new date and time * /
  25.                         TM_RTC_SetDateTime(&RTCD, TM_RTC_Format_BIN);
  26.                         // perc setup
  27.                         printf("perc: %02d: -,+,OK ? ", RTCD.Minutes);
  28.                         while(!(TM_USART_FindString(PC_USART, "OK") > 0)) {
  29.                                 if (TM_USART_FindString(PC_USART, "+") > 0) {
  30.                                         TM_USART_ClearBuffer(PC_USART);
  31.                                         if(++RTCD.Minutes == 60) RTCD.Minutes = 0;     
  32.                                         printf("\r\nperc+: %02d: -,+,OK ?", RTCD.Minutes);
  33.                                 }
  34.                                 if (TM_USART_FindString(PC_USART, "-") > 0) {
  35.                                         TM_USART_ClearBuffer(PC_USART);
  36.                                         if(RTCD.Minutes) RTCD.Minutes--;        else RTCD.Minutes = 59;
  37.                                         printf("\r\nperc-: %02d: -,+,OK ?", RTCD.Minutes);
  38.                                 }                              
  39.                         }
  40.                         TM_USART_ClearBuffer(PC_USART);
  41.                         getC = RTCD.Minutes;
  42.                         TM_RTC_GetDateTime(&RTCD, TM_RTC_Format_BIN);
  43.                         RTCD.Minutes = getC;
  44.                         // Save new date and time * /
  45.                         TM_RTC_SetDateTime(&RTCD, TM_RTC_Format_BIN);
  46.                         // másodperc
  47.                         printf("másodperc: %02d: -,+,OK ? ", RTCD.Seconds);
  48.                         while(!(TM_USART_FindString(PC_USART, "OK") > 0)) {
  49.                                 if (TM_USART_FindString(PC_USART, "+") > 0) {
  50.                                         TM_USART_ClearBuffer(PC_USART);
  51.                                         if(++RTCD.Seconds == 60) RTCD.Seconds = 0;     
  52.                                         printf("\r\nmásodperc+: %02d: -,+,OK? ", RTCD.Seconds);
  53.                                 }
  54.                                 if (TM_USART_FindString(PC_USART, "-") > 0) {
  55.                                         TM_USART_ClearBuffer(PC_USART);
  56.                                         if(RTCD.Seconds) RTCD.Seconds--; else RTCD.Seconds = 59;       
  57.                                         printf("\r\nmásodperc-: %02d: -,+,OK ?", RTCD.Seconds);
  58.                                 }                              
  59.                         }
  60.                         TM_USART_ClearBuffer(PC_USART);
  61.                         getC = RTCD.Seconds;
  62.                         TM_RTC_GetDateTime(&RTCD, TM_RTC_Format_BIN);
  63.                         RTCD.Seconds = getC;
  64.                         // Save new date and time * /
  65.                         TM_RTC_SetDateTime(&RTCD, TM_RTC_Format_BIN);
  66.                        
  67.                         printf("\r\nuj time: %02d:%02d:%02d\r\n", RTCD.Hours, RTCD.Minutes, RTCD.Seconds);
  68.                        
  69.                 }

Hogyan lehetne ezt másképpen megoldani?
És a szenvedés eredménye:
  1. time
  2. Dátum: 2016.12.December.29.Csütörtök
  3. Idö:   18:03:56
  4. setT
  5. Time setup:
  6. ora: 18: -,+,OK ?
  7. OK
  8. perc: 04: -,+,OK ?
  9. OK
  10. másodperc: 19: -,+,OK ?
  11. +
  12.  
  13. másodperc+: 20: -,+,OK?
  14. +
  15.  
  16. másodperc+: 21: -,+,OK?
  17. +
  18.  
  19. másodperc+: 22: -,+,OK?
  20. +
  21.  
  22. másodperc+: 23: -,+,OK?
  23. +
  24.  
  25. másodperc+: 24: -,+,OK?
  26. +
  27.  
  28. másodperc+: 25: -,+,OK?
  29. +
  30.  
  31. másodperc+: 26: -,+,OK?
  32. +
  33.  
  34. másodperc+: 27: -,+,OK?
  35. +
  36.  
  37. másodperc+: 28: -,+,OK?
  38. +
  39.  
  40. másodperc+: 29: -,+,OK?
  41. +
  42.  
  43. másodperc+: 30: -,+,OK?
  44. +
  45.  
  46. másodperc+: 31: -,+,OK?
  47. +
  48.  
  49. másodperc+: 32: -,+,OK?
  50. +
  51.  
  52. másodperc+: 33: -,+,OK?
  53. +
  54.  
  55. másodperc+: 34: -,+,OK?
  56. +
  57.  
  58. másodperc+: 35: -,+,OK?
  59. +
  60.  
  61. másodperc+: 36: -,+,OK?
  62. +
  63.  
  64. másodperc+: 37: -,+,OK?
  65. +
  66.  
  67. másodperc+: 38: -,+,OK?
  68. OK
  69.  
  70. uj time: 18:04:38
  71. time
  72. Dátum: 2016.12.December.29.Csütörtök
  73. Idö:   18:04:48

Persze a végére mégsem lett pontos a másodpercek értéke
(#) killbill válasza kapu48 hozzászólására (») Dec 29, 2016 / 1
 
Nem lenne egyszerubb ugy megcsinalni, hogy egeszben kell neki beadni a datuomot/idot. Azt pedig az sscanf fuggvennyel szepen szet lehet szedni: egy parancsban valahogy megkapja a pontos idot: "2016.12.29 19:23:00", a sscanf meg kiszedi belole a szamokat a megfelelo valtozokba:
  1. void setclock(const char *date)
  2. {
  3. int yr, mo, day, hour, min, sec;
  4.  
  5.   if(sscanf(date, "%d.%d.%d %d:%d.%d", &yr, &mo, &day, &hour, &min, &sec) != 6 ||
  6.       mo < 1 || mo > 12 || day < 1 || day > 31 .....){
  7.         printf("valami nem stimmel!\r\n");
  8.   }
  9.   else{
  10.      ora beallitasa a hat valtozo alapjan ;
  11.   }
  12. }

de cifrazhatod is:
  1. if(sscanf(date, "%d.%d.%d %d:%d.%d", &yr, &mo, &day, &hour, &min, &sec) != 6){
  2.    /*
  3.     * nem jo formatum, lehet, hogy csak az idot adtak meg
  4.     */
  5.    if(scanf(date, "%d.%d.%d", &yr, &mo, &day) == 3 && year >= 2016 &&
  6.        mo >= 1 && mo <= 12 && day >= 1 && day <= 31){
  7.  
  8.          csak a datumot allitjak ;
  9.   }
  10.   else if(sscanf(date, "%d:%d.%d", &hour, &min, &sec) == 3 &&
  11.             hour >= 0 && hour <= 23 && min >= 0 && min <= 59 && sec >= 1 && sec <= 59)
  12.  
  13.          csak az orat allitjak;
  14.   }
  15.   else
  16.      printf("Nem jo formatum\n\r");
  17. }
(#) kapu48 válasza killbill hozzászólására (») Dec 29, 2016 /
 
Az ’sscanf’ eddig csak hallomásból ismertem.
De tetszik a 2. megoldásod.

Ezért most megtanulom használni!

Köszönöm a részletes tippet!
(#) csabeszq hozzászólása Dec 31, 2016 /
 
Egy kérdésem lenne pointerrekkel kapcsolatban.

Az STM32-ben 4 bájtos a pointer, ami az esetek zömében RAM-ba mutat. A RAM 20k-s maxon, ami simán elférne 2 bájton, de 4 bájtos pointereket hoz a fordító létre. Amikor malloc-kal bonyolultabb struktúrákat hozok létre, a memóriahasználat durván ugrásnak indul.

- egy malloc(1) 12 bájt-ot foglal le (8 bájt belső+4 bájt adat)
- ha ebbe két pointert belerakok 8+8 byte
- ha még egy enumot is, akkor 8+12 bájt, mert 4 bájtra igazít a malloc
- így jön ki az, hogy egy kétirányú uint8_t láncolt lista elemenként 20 bájtot foglal le a memóriában.

A kérdés, hogy lehetséges-e a pointert 2 bájton tárolni, ha már úgyis a RAM-ba mutat (near pointer)?
Eléggé elszáll a memóriahasználat pointerrel és malloc-kal.
A hozzászólás módosítva: Dec 31, 2016
(#) killbill válasza csabeszq hozzászólására (») Dec 31, 2016 /
 
A malloc() nem kifejezetten mikrokontrollerre valo dolog. Ha sokat malloc()/free()-zel, akkor feldarabolodhat a memoriad, amitol egy ido utan mar nem tudsz nagyobb darabokat allokalni. Ha nincs free(), akkor nyilvan sokkal egyszerubb a helyzet. Szerintem igazi pointer nem lesz ARM-en 16 bites, viszont te csinalhatsz magadnak, de az mar inkabb index lesz, vagy offset. Ha keves a RAM, akkor ez a jo megoldas. Lefoglalsz egy kelloen nagy darabot (akar malloc()-cal, akkor static char pool[12000]; modon), es azon belul mar csak offset-ekkel dolgozol.
(#) csabeszq válasza killbill hozzászólására (») Dec 31, 2016 /
 
Leírom a kontextust is: SPI LCD, 16 bites színmélység, 160x128-as felbontás.

A DMA nagyon kényelmes dolog, viszont roppant sok memóriát igényel. Ha ki akarom írni, hogy "Hello" a képernyőre 6x10-es jelkészlettel, akkor 6x10x5x2 bájt memóriára van szükségem (ez 600 bájt).

Ha megvan a 600 bájt memória, ráeresztem a DMA-t, az pillanatok alatt ledarálja az egészet.

A rendszer úgy megy, hogy egy sorba rakom std::list-tel a grafikai rutinokat (rajzolj keretet, töltsd ki, írd bele a szöveget (LCD gomb)), amikor a DMA csatorna szabad, akkor kibontja a színeket és beletolja a DMA csatornába. A kitöltés egyszerű, mert nem növeled a 16 bites SPI memória pozícióját automatikusan, mindig ugyanazt a színt küldöd ki. A kép/szöveg feltöltése már bonyolultabb.

A lényeg, hogy a grafikus elemeket kicsiben tárolom a memóriában ("Hello"), amit kibontok színekre és beletolom a DMA-ba. A "kis memória" jelenleg 100-200 bájt körül van, ami nem árulkodik optimális működésről.
A hozzászólás módosítva: Dec 31, 2016
(#) csatti2 válasza csabeszq hozzászólására (») Dec 31, 2016 /
 
Én úgy oldottam meg, hogy karakterenként rajzolom ki a szövegeket. A nagyobbik betűtípusom pl. 21x24-es. Egy olyan buffert használok, ami legalább kétszer akkora, mint a legnagyobb grafikai elem (karakter). Ezután megrajzolom az első karaktert a buffer "alsó" felébe, elindítom a kiküldését dma-val, elkezdem megrajzolni a második karaktert a buffer "felső" felébe, amikor kész megnézem végzett-e a dma, megvárom ha még nem, majd mehet a következő karakter az alsó félbe. Ugyanazt a buffert használja az összes grafikai utasítás, mind a cpu mind az spi elég optimálisan dolgozik így.
(#) toto hozzászólása Jan 1, 2017 /
 
Sziasztok!
Azoktól kérdeznék, akik Embitz IDE-t használnak.
Új projektet tudtok debugolni? A régiek debugolása megy (register watch ablak működik), de az újaké nem. Úgy látom, hogy az Embitz fejlesztője dobott a felhasználóknak egy csavart labdát, és az SVD file-ok letöltése és használata csak akkor megy, ha regisztrált tag vagy, ami évi 50 dollár. Boldog Új Évet!
(#) vzoole válasza toto hozzászólására (») Jan 1, 2017 /
 
És úgy nem megy, ha manuálisan adod meg neki az SVD fájlt?
(Én még nem próbáltam az új verziót.)
(#) csatti2 válasza toto hozzászólására (») Jan 2, 2017 /
 
Hozzá lehet adni manuálisan is az SVD fájlt a debug/interfaces menüpont alatt. Utána pedig a debug/debugging windows alatt kiválasztható a System registers, hogy látszódjanak is.
Pénzt egyedül az internetes funkciók használatáért kér a srác (mint például az általa fenntartott SVD adatbázis). Vmiből fent kell tartania a projektet.
(#) toto válasza csatti2 hozzászólására (») Jan 2, 2017 /
 
Tényleg hozzá tudom adni az SVD filet a debug/interfaces menüpontban, a debug/plugins menüpontban, ahol eddig tettem, ott nem ment. (Miért van egy funkcióra két menüpont?)
Van lehetőség valahonnan SVD file-okat letölteni ingyen? Mert nem tudok új kontrollert debugolni SVD file nélkül.
(#) csatti2 válasza toto hozzászólására (») Jan 2, 2017 /
 
pl.: https://github.com/posborne/cmsis-svd/tree/master/data

múltkor innen töltöttem le egy csomót, de mintha most nem menne:
http://ds.arm.com/media/resources/db/chip/
(#) csatti2 hozzászólása Jan 2, 2017 /
 
Innen pedig letöltheted a saját STMicro és Atmel SVD gyűjteményemet. Letöltés. Ez a link elévül pár napon/letöltésen belül.
(#) toto válasza csatti2 hozzászólására (») Jan 2, 2017 /
 
Köszönöm.
Egy gugli kereséssel nem találtam semmi használhatót, de így újra van remény .
(#) vzoole válasza toto hozzászólására (») Jan 2, 2017 /
 
A Keil letölti magának az swd fájlokat, akár a demo verzióból is ki tudod nyerni (mint alternatíva).
(#) csabeszq hozzászólása Jan 2, 2017 /
 
Csatoltam egy képet azoknak, akik szeretik a vicces dolgokat.

Hány különbséget látsz a képen?
A hozzászólás módosítva: Jan 2, 2017
(#) Peppe válasza csabeszq hozzászólására (») Jan 2, 2017 /
 
Szia,

Az STM kínai koppintás valami MEGA izé.
A belseje teljesen ugyan az csak mást lézereztek rá.(és overclock-olható)
Azért lehet a Mega logó rajta.

Van a neten egy terjedelmes leírás(ha nagyon akarod előkeresem)
A hozzászólás módosítva: Jan 2, 2017
(#) csabeszq válasza Peppe hozzászólására (») Jan 2, 2017 /
 
Nem találtál meg minden különbséget.

Figyeld meg, hogy teljesen más a lábkiosztása a két terméknek.
A hozzászólás módosítva: Jan 2, 2017
(#) Peppe válasza csabeszq hozzászólására (») Jan 2, 2017 /
 
Azok nem annyira fontosak
(#) csabeszq válasza benjami hozzászólására (») Jan 4, 2017 /
 
Volt időm javítani az ADC órajelet (36MHz volt).

Visszavettem a rendszer órajelét 56MHz-re, az ADC órajelét 4-gyel osztom, így kijön a 14MHz.
Érezhetően stabilabb a végeredmény. Köszi.
(#) csabeszq hozzászólása Jan 5, 2017 /
 
Lenne még egy kérdésem ADC-vel kapcsolatban. A fast interleaved mód azt jelenti, hogy az ADC1 és az ADC2 átlapolással mér. Amikor ADC1 félúton jár, ADC2 elkezd mérni, így dupla konverziós sebességet lehet elérni.

Vettem egy joysticket a teszt kedvéért, középállásban.
- ADC1 1980-at mért
- ADC2 1994-et mért

Láthatóan mást mér az ADC1 és az ADC2 ugyanarról a lábról. Kalibrálva voltak az ADC-k, de kalibrálás nélkül sem jobb a helyzet. Van tapasztalatotok a témában?
A hozzászólás módosítva: Jan 5, 2017
(#) csabeszq válasza csabeszq hozzászólására (») Jan 5, 2017 /
 
Megnézve a hiba elsősorban offset-ből áll, tehát az ADC1/2 200-nál és 4000-nél egyformán 12 körüli eltérést mutatott. A nullát mindenütt jól mérte, utána offsetje volt.
(#) csatti2 válasza csabeszq hozzászólására (») Jan 5, 2017 /
 
Mekkora a mintavételezési időd? Ha nagyobb mint 13,5 ciklus, akkor meg kéne próbálnod csökkenteni (slow mode!, max 7,5 ciklus fast módnál). Lehet, hogy bizonyos ideig egyszerre mintavételezik a csatornát és bezavarják egymást. Ez megmagyarázná azt is miért az ADC1 értéke a kisebb.
A hozzászólás módosítva: Jan 5, 2017
(#) csabeszq válasza csatti2 hozzászólására (») Jan 5, 2017 /
 
Külön-külön is ugyanennyi az offset. Akkor is, amikor be sem kapcsolom ADC1-et, vagy ADC2-t.

41.5 és 239.5 mintavételezési időkkel próbáltam. Megpróbálhatom 7.5 és 13.5-tel is...
(#) csatti2 válasza csabeszq hozzászólására (») Jan 5, 2017 /
 
41,5 és 239,5-el nem használhatod az interleaving módot (értelme se nagyon van).
Egy ADC mérés ugyanis 12,5 + mintavételezési idő (ciklusban) ciklusig tart. Ebből adódik, hogy csak addig szabad mintavételezni a csatornát, amíg a másik csatorna a konverzióval van elfoglalva (12,5 ciklus).
Ha alapból is ekkora az ADC offset az nem jelent jót. Majd megnézem otthon saját áramkörön, hogy én mit mérek (még mindig STM32F103-asról van szó, ugye?). A legutóbbi projektemben dual adc-t használtam én is, de külön csatornákra (4db 2+2 kiosztásban).
(#) csabeszq válasza csatti2 hozzászólására (») Jan 5, 2017 /
 
Nem interleaving módban mértem egyelőre. Egyszer az egyiket, máskor a másikat. Az interleaving még függőben van, nem járok ott a programmal.

STM32F103

Annyit még kipróbálok, hogy Arduino alatt megnézem, hogy mit mér. Könnyen lehet, hogy félrekonfigurálok valamit.
(#) csatti2 válasza csabeszq hozzászólására (») Jan 5, 2017 /
 
Arduino? Vmi ilyesmiről van szó?
(#) csabeszq válasza csatti2 hozzászólására (») Jan 5, 2017 /
 
Igen, azért Arduinora gondoltam, mert ott elvileg készen van minden. Bár nem biztos, hogy az ADC1, ADC2 menni fog Arduinoval.

A lényeg, hogy ha a programomban lenne a hiba, akkor azonnal látszana, hogy Arduino-val megy-e, vagy sem. Más keretrendszer, beállít nekem mindent előre rendesen.

Egyébként C++-ban programozom a panelt, az Arduino csak egy teszt erejéig kellene.
A hozzászólás módosítva: Jan 5, 2017
(#) csabeszq válasza csabeszq hozzászólására (») Jan 5, 2017 /
 
Sikerült elérni, hogy a 2 ADC külön-külön ugyanazt méri.

Azt csináltam eredetileg, hogy ha mértem valamit, ADC_DeInit, ADC beállít, ADC_Init, ADC_ENABLE, ADC indítása szoftveresen, megvárom, míg befejeződik.

Úgy tűnik, hogy a rendszer nem szereti, ha az ADC_DeInit-et minden mérés előtt meghívom.

Meghívtam egyszer, utána folyamatosan konvertálok és mindkét ADC 2044-et mért 1980 és 1994 helyett.

Ez rajtam egyelőre nem segít, mert a mintavételezési frekvenciát, csatornákat,... menet közben nekem néha cserélni kellene...
(#) csatti2 válasza csabeszq hozzászólására (») Jan 5, 2017 /
 
Közben én is pont befejeztem a mérésemet. Tök ugyanaz lett.

Miért kell csatornákat / frekvenciákat cserélned?

De ha tényleg kell, szerintem elég egy ADC_Cmd disable, majd csatornakonfig, és újra enable.
Következő: »»   81 / 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