Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1291 / 1320
(#) cross51 válasza Wezuv hozzászólására (») Ápr 13, 2018 /
 
A processzornak mindegy hogy (A - RAM B - FLASH csak példaként) 0xA000... vagy 0xB000... ről olvas, cím-cím.
(#) Wezuv válasza cross51 hozzászólására (») Ápr 13, 2018 /
 
Ezt értem, de a korábbi PIC-ekben ezt ha jól tudom, nem lehetett megtenni (már csak a program és a RAM memória eltérő szélessége miatt sem, és egyébként se).
A hozzászólás módosítva: Ápr 13, 2018
(#) pajti2 válasza cross51 hozzászólására (») Ápr 13, 2018 /
 
Az mx valami 20 mhz-es órajelen tudta várakozás nélkül olvasni a flash-t, afölött várakozási ciklusokat iktatott be. De az csak akkor van, ha a chace ki van kapcsolva, mert egyébként van egy normális predict, és cache line-okat olvas előre. Ha sorfolytonos az utasítás végrehajtás, és nincsen szanaszét ugrándozás, akkor gyakorlatilag várakozási idő nélküli a sorfolytonos utasítás végrehajtás még 80 mhz-en is, nem kell extrában cache-elni semmit. Mindaz az mx. Az mz-vel én még mindig nem kötöttem szorosabb barátságot, nem ismerem a sebesség paramétereit, de az a gyanúm, hogy valamennyire ott is átgondolták a cache line-okat. De persze attól még pocsékolhatod a jobb sorsra érdemes - örökké kevés - ram-ot is, ha éppen ahhoz van kedved
(#) cross51 hozzászólása Máj 3, 2018 /
 
Sziasztok!

Elkezdtem a Harmony-t használni és ezen belül a az USART driver-t Queue-vel egy Nextion-os kijelzőhöz.
(most nem lényeg hogy a Harmony ilyen vagy olyan...)

PIC32MZ(1024EFF100)-ra íródik a kód és a lábszám + C++ miatt volt lényeges az MCU nem a sebesség miatt, tehát az optimalizálás nem feltétlen lényeges elem.

Úgy akarom/akartam megírni a Nextion-al való UART-os kommunikációt hogyha írok/olvasok UART-ról egyik esetben se blokkolja a CPU-t.

Vegyünk példa képpen egy gombot.
Van egy SetText és egy GetText függvény a SetText egyenlővé teszi a string-et az új szöveggel és billent egy flag-et a GetText meg csak return-öl ezzel a string-el.
Amikor a kód a flag vizsgálatához ér és látja hogy a szöveg megváltozott akkor elküldi a Nextion-nak.

Na eddig tök jó csak a default értéke a szövegnek nincs meg. Ezt úgy oldottam meg hogy mikor létre jön egy objektum billent egy Init flaget ami elkezdi lekérni a kijelzőtől adott objektum paramétereit.
Szóval "becache"-elem az adatokat.

És a kérdés erre vonatkozik, hogy ez mennyire használt/használható út, hogy induláskor egy tárolóba be pakolgatom (jelen esetben) egy Nextion kijelző objektumainak az adatait, hogy a procinak mikor kell neki ne kelljen rá várnia?

Vagy erre jobb megoldás egy GetTextAsync függvény ami akkor tér vissza true-val ha beállítódott a megfelelő értékre a szöveg és ennek kezelését a fő szálra bízom?
(#) pajti2 válasza cross51 hozzászólására (») Máj 3, 2018 / 1
 
Teljesen jó a cache, csak igény szerint arra figyelj majd, hogy ha több adatod is van, amik logikailag összetartoznak, akkor azokat ne túl nagy időkülönbséggel gyorsítótárazd be, mert azzal gyártasz egy alkalmazás szintű hibát.
(#) cross51 válasza pajti2 hozzászólására (») Máj 4, 2018 /
 
Igen nekem is valami ilyenből indult a kérdés. Elindul az elején és én mondjuk beolvasás közben ráírok a szövegre akkor az komoly probléma, de ezt azért engedtem el, mert az alkalmazásnak induláskor sok alacsonyabb szintű perifériával kell kommunikálnia és nem lényeg, hogy a kijelző menjen.

És mivel szét van szedve minden taskokra, miközben az alacsonyabb rendű perifériára (pl hőmérő, hogy megfelelő e a hőmérséklet) "várok" addig szépen megy a cache-elés.

De most ~13ms egy gomb. ezzel most próbálok játszani, hogy párhuzamosítom az inicializálást, és amíg van szabad R/W Queue addig kérem le az adatokat egyszerre több objektumról is aztán amikor elfogy "várok".
Egyenlőre még nem megy, runtime exception kapok úgyhogy ezt még meg kell műtenem.

Egyébként egy EERAM-nál is ezt csináltam, mivel nem kell sok adatot tárolni csak külső tároló legyen, 256Byte-ot beolvasok így az mindig azonnal visszakapom, ha meg írom itt is billentek egy flag-et.
(#) cross51 válasza cross51 hozzászólására (») Máj 4, 2018 /
 
Érdekes!

A Harmony-ban 10 mélységű Queue volt beállítva átírtam 64-re megszűnt a hiba és így írtam a kódot megszűnt vissza írtam 10 és nem jött vissza a hiba, úgyhogy nem tudom mi volt a probléma de megoldódott.
(#) Droot hozzászólása Máj 9, 2018 /
 
Sziasztok,

PIC32-t programozok, van egy tömböm:
uint8_t number[12]; A tartalma pl +36012345678, nincs lezáró karakter, mert nem kell beilleszteni az AT parancsomba.
Ezt egy függvénynek adom át, mint paraméter:
  1. uint8_t gsm_send_sms(uint8_t number[], uint8_t text[])
  2. {
  3. //Itt valamit csinálok
  4. return valami;
  5. }


A probléma, hogy időnként a tömb tele lesz kérdőjelekkel, az összes karakter kérdőjelre cserélődik le. Van hogy az első, van hogy csak a 100-adik függvény meghívásakor.
Van ötletetek?
(#) Wezuv válasza Droot hozzászólására (») Máj 9, 2018 /
 
Hol van deklarálva a tömb? Arra gondolok, hogy esetleg nem jó helyen (egy függvényen belül) és ezért a területet másra is használja a fordító. Valamint használd a volatile beállítást is a deklarálásnál.
(#) Droot válasza Wezuv hozzászólására (») Máj 9, 2018 /
 
Köszi a tippet!
Jó helyen van elméletileg deklarálva, az egyik .c fájl legelején, tehát globális változó.
A volatile nem csak akkor kell ha megszakításban hekkelek? Illetve pontosabban ha írom a változót?
Mert ezt a változót amikor előjött a hiba nem módosította semmi és senki, egyszercsak megkukult. A telefonszámot LCD kijelzőn gombokkal lehet módosítani.
Az sem gond hogy nincs lezáró karakter? Mert ahogy az AT parancsba beillesztem oda nem kell, ezért a menübe sem raktam.
Mindenesetre a volatile-ot kipróbálom!
(#) sdrlab válasza Droot hozzászólására (») Máj 9, 2018 /
 
Az még nem globális változó így, csak modul szintű legfeljebb!

Na de mit csinál a függvény ezzel a tömbbel ? Hiába írsz ide le prezentáció gyanánt egy üres függvényt, abból nem fog kiderülni, hol a hiba!
(#) killbill válasza Wezuv hozzászólására (») Máj 9, 2018 /
 
Miért kellene a volatile-t használnia???
(#) killbill válasza sdrlab hozzászólására (») Máj 9, 2018 /
 
Idézet:
„Az még nem globális változó így, csak modul szintű legfeljebb!”
Miért ne lenne globális? Ha nem irta elé szándékosan, hogy static, akkor az bizony globális.
Aban 100%-ig egyetértek veled, hogy a kód ismerete nélkül sok okosat nem lehet mondani a problémára.
A hozzászólás módosítva: Máj 9, 2018
(#) superuser válasza Droot hozzászólására (») Máj 9, 2018 /
 
A kód ismerete nélkül csak találgatni lehet.
Próbáld megtalálni azt a pontot amikor módosul a memória tartalma.
Okozhatja egy hibásan megírt rutin is, ami túlír pl. egy tömböt.
(#) Wezuv válasza killbill hozzászólására (») Máj 9, 2018 /
 
Én szeretem, ha nem regiszter másolatból olvassa ki a program az értéket, hanem a memóriából közvetlenül, még ha ez lassabb is.
(#) Wezuv válasza superuser hozzászólására (») Máj 9, 2018 /
 
Lehetséges a túlírás is valóban. Elég alattomos hiba, nehéz megtalálni...
(#) sdrlab válasza killbill hozzászólására (») Máj 9, 2018 /
 
Akkor lenne globális, ha tudnál rá hivatkozni más modulban! De csak akkor tudod ezt megtenni, ha elérhetővé teszed más modulok számára is a változót(...extern...)
(#) superuser válasza sdrlab hozzászólására (») Máj 9, 2018 / 1
 
Kissé elmentünk szőrszálhasogatás irányba
A deklaráció módja nem zárja ki a globális használatot.
Azt az egy bizonyos extern ... sort elhelyezheted több helyen is.
De nem ettől módosul vagy marad változatlan a változó tartalma.
(#) sdrlab válasza superuser hozzászólására (») Máj 9, 2018 /
 
Ez nem szőrszálhasogatás!
Nem attól globális egy változó, hogy mikor és hogyan módosul a tartalma, hanem hogy bárhonnan elérheted! A statikusnak deklarált változók is végig élnek, holott akár csak egy függvényen belül értelmezett mindössze.
(#) Droot hozzászólása Máj 9, 2018 /
 
Nemsokára bemásolom a függvényt! Csak érjek haza.
(#) pipi válasza Droot hozzászólására (») Máj 9, 2018 /
 
Hali!
Az első kérdés: uint8-ba hogy teszel bele ekkora számot?
Vagy karakterenként gondoltad a tömb elemeibe egyenként? de akkor miért így írtad?
Ha karakterenként, akkor binárisan, vagy ascii-ban van?
Nem valai ilyesmit nézel be?
(#) Droot hozzászólása Máj 9, 2018 /
 
Sziasztok!

Való igaz, így majd beszédesebb lesz a dolog. Bemásolom a majdnem az összes idevágó kódrészletet.
A lényeg, hogy ez egy GSM-es eszköz, a menüjében beállíthatóak a 12 karakteres ASCII számok, a tömb 1-1- eleme egy egy szám a telefonszámból. FRAM-ban vannak tárolva az adatok. Tartozik minden telefonszámhoz egy változó ahol megadjuk, hogy engedélyezve van-e a szám vagy sem. Megy az eszköz szépen, küldözgeti az SMS-eket és egyszercsak gondol egyet, jön a GSM hiba, amikor hallom a hibáról a hangjelzést akkor már csak azt látom, hogy mindig csak az engedélyezett telefonszámnál a szám így néz ki: +????????????, ezért is kapok GSM hibát, mert a modul erre a számra nem tud küldeni.
Kb. két hónapja van ez a hibám, a szívás azért van, mert van hogy két hétig elő sem jön!

Jöjjön a kód:
Változók deklarálása:
  1. uint8_t         gsm_phoneno_1_en = 0,
  2.         gsm_phoneno_2_en = 0,
  3.         gsm_phoneno_3_en = 0,
  4.         gsm_phoneno_4_en = 0,
  5.         gsm_phoneno_5_en = 0,
  6.         gsm_phone_1_nr[12],
  7.         gsm_phone_2_nr[12],
  8.         gsm_phone_3_nr[12],
  9.         gsm_phone_4_nr[12],
  10.         gsm_phone_5_nr[12];


Ez mindig indulás után fut le, betölti az adatokat az FRAM-ból:
  1. memset(gsm_phone_1_nr,0x30,12);
  2.     memset(gsm_phone_2_nr,0x30,12);
  3.     memset(gsm_phone_3_nr,0x30,12);
  4.     memset(gsm_phone_4_nr,0x30,12);
  5.     memset(gsm_phone_5_nr,0x30,12);
  6.    
  7.     for(i = 0;i<=11;i++)
  8.     {
  9.         gsm_phone_1_nr[i] = fram_read(0,110+i);
  10.         gsm_phone_2_nr[i] = fram_read(0,130+i);
  11.         gsm_phone_3_nr[i] = fram_read(0,150+i);
  12.         gsm_phone_4_nr[i] = fram_read(0,170+i);
  13.         gsm_phone_5_nr[i] = fram_read(0,190+i);
  14.     }
  15.    
  16.     gsm_phone_1_nr[0] = '+';
  17.     gsm_phone_2_nr[0] = '+';
  18.     gsm_phone_3_nr[0] = '+';
  19.     gsm_phone_4_nr[0] = '+';
  20.     gsm_phone_5_nr[0] = '+';



A csoportos SMS küldő függvényem:
  1. uint8_t sms_send_all(uint8_t text[])
  2. {
  3.     switch(send_nr)
  4.         {
  5.             case 1:
  6.                 if(gsm_phoneno_1_en == 1 && sys_gsm_en == 1 && gsm_en == 1)
  7.                 {
  8.                    
  9.                     res = gsm_send_sms(gsm_phone_1_nr,text);
  10.                     if(res == GSM_ERR)
  11.                     {
  12.                         send_nr = 2;
  13.                     }
  14.                     if(res == GSM_SMS_SENT)
  15.                     {
  16.                         send_nr = 2;
  17.                     }
  18.                 }else
  19.                 {
  20.                     send_nr = 2;
  21.                 }
  22.                 return 0;
  23.                 break;
  24.  
  25.             case 2:
  26.                 if(gsm_phoneno_2_en == 1 && sys_gsm_en == 1 && gsm_en == 1)
  27.                 {
  28.                     res = gsm_send_sms(gsm_phone_2_nr,text);
  29.                     if(res == GSM_ERR)
  30.                     {
  31.                         send_nr = 3;
  32.                     }
  33.                     if(res == GSM_SMS_SENT)
  34.                     {
  35.                         send_nr = 3;
  36.                     }
  37.                 }else
  38.                 {
  39.                     send_nr = 3;
  40.                 }
  41.                 return 0;
  42.                 break;
  43.  
  44.             case 3:
  45.                 if(gsm_phoneno_3_en == 1 && sys_gsm_en == 1 && gsm_en == 1)
  46.                 {
  47.                     res = gsm_send_sms(gsm_phone_3_nr,text);
  48.                     if(res == GSM_ERR)
  49.                     {
  50.                         send_nr = 4;
  51.                     }
  52.                     if(res == GSM_SMS_SENT)
  53.                     {
  54.                         send_nr = 4;
  55.                     }
  56.                 }else
  57.                 {
  58.                     send_nr = 4;
  59.                 }
  60.                 return 0;
  61.                 break;
  62.  
  63.             case 4:
  64.                 if(gsm_phoneno_4_en == 1 && sys_gsm_en == 1 && gsm_en == 1)
  65.                 {
  66.                     res = gsm_send_sms(gsm_phone_4_nr,text);
  67.                     if(res == GSM_ERR)
  68.                     {
  69.                         send_nr = 5;
  70.                     }
  71.                     if(res == GSM_SMS_SENT)
  72.                     {
  73.                         send_nr = 5;
  74.                     }
  75.                 }else
  76.                 {
  77.                     send_nr = 5;
  78.                 }
  79.                 return 0;
  80.                 break;
  81.  
  82.             case 5:
  83.                 if(gsm_phoneno_5_en == 1 && sys_gsm_en == 1 && gsm_en == 1)
  84.                 {
  85.                     res = gsm_send_sms(gsm_phone_5_nr,text);
  86.                     if(res == GSM_ERR)
  87.                     {
  88.                         send_nr = 1;
  89.                         //SMS elküldöttnek tekinthet?
  90.                     }
  91.                     if(res == GSM_SMS_SENT)
  92.                     {
  93.                         send_nr = 1;
  94.                         //SMS elküldöttnek tekinthet?
  95.                     }
  96.                 }else
  97.                 {
  98.                     send_nr = 1;
  99.                     //SMS elküldöttnek tekinthet?
  100.                 }
  101.                 return 1;
  102.                 break;
  103.         }
  104. }


Az egy telefonszámra SMS-t küldő függvényem:
  1. uint8_t gsm_send_sms(uint8_t number[], uint8_t text[])
  2. {
  3.     if(sys_gsm_en == 1)
  4.     {
  5.         if(gsm_en == 1)
  6.         {
  7.             if(gsm_status >= GSM_INITIALIZED_STATE && gsm_csq_firstupdate > 0)
  8.             {
  9.                 switch(gsm_send_sms_sm)
  10.                 {
  11.                     case 0:
  12.                         if(gsm_busy > 0)
  13.                             return GSM_BUSY;
  14.                         else
  15.                             gsm_busy = 3;
  16.                         sys_led_busy();
  17.                         uart4_putstr("AT+CMGS=");
  18.                         while(!uart4_putchar('"'));
  19.                         uart4_putstr(number);
  20.                         while(!uart4_putchar('"'));
  21.                         uart4_putstr("\r\n");
  22.                         memset(buf,0x00,sizeof(buf));
  23.  
  24.                         gsm_send_sms_sm = 1;
  25.                         gsm_at_command_timeout = 0;
  26.                         return GSM_BUSY;
  27.                         break;
  28.  
  29.                     case 1:
  30.                         gsm_busy = 3;
  31.                         gsm_snd_tmr = 0;
  32.                         //l = uart4_getstring(buf);
  33.                             l = gsm_wait_for_at(">", GSM_TIMEOUT);
  34.                         if(gsm_at_command_timeout < 5000)
  35.                         {
  36.                             if(l==1)//if(l > 0)
  37.                             {
  38.                                 /*if(strstr(buf, ">") != NULL)
  39.                                 {*/
  40.                                     uart4_putstr(text);
  41.                                     while(!uart4_putchar(0x1A));
  42.                                     failure_once[FO_GSM_T8] = 0;
  43.                                     failure_once[FO_GSM_T9] = 0;
  44.                                     gsm_send_sms_sm = 2;
  45.                                     gsm_at_command_timeout = 0;
  46.                                     return GSM_BUSY;
  47.                                // }else return GSM_BUSY;;
  48.                             }else return GSM_BUSY;
  49.                             if(l == 2)
  50.                             {
  51.                                 PORTEbits.RE1 = 1;
  52.                                 if(failure_once[FO_GSM_T8] == 0)
  53.                                 {
  54.                                     failure_once[FO_GSM_T8] = 1;
  55.                                     failure_add(1213); // GSM hiba, nem lehet kommunikálni a modullal
  56.                                 }
  57.                                 sys_led_idle();
  58.                                 gsm_busy = 0;
  59.                                 gsm_send_sms_sm = 0;
  60.                                 return GSM_ERR;
  61.                             }
  62.                         }else
  63.                         {
  64.                             PORTEbits.RE1 = 1;
  65.                             if(failure_once[FO_GSM_T9] == 0)
  66.                             {
  67.                                 failure_once[FO_GSM_T9] = 1;
  68.                                 failure_add(1214); // GSM hiba, nem lehet kommunikálni a modullal
  69.                             }
  70.                             sys_led_idle();
  71.                             gsm_busy = 0;
  72.                             gsm_send_sms_sm = 0;
  73.                             return GSM_ERR;
  74.                         }
  75.                         break;
  76.  
  77.                     case 2:
  78.                         gsm_busy = 3;
  79.                         l = uart4_getstring(buf);
  80.                         if(l > 0)
  81.                         {
  82.                             if(strstr(buf, "OK") != NULL || strstr(buf, "+CMGS") != NULL)
  83.                             {
  84.                                 failure_once[FO_GSM_T10] = 0;
  85.                                 gsm_send_sms_sm = 0;
  86.                                 gsm_busy = 0;
  87.                                 sys_led_idle();
  88.                                 return GSM_SMS_SENT;
  89.                             }
  90.                         }else{
  91.                             if(gsm_snd_tmr > 10000)
  92.                             {
  93.                                 PORTEbits.RE1 = 1;
  94.                                 if(failure_once[FO_GSM_T11] == 0)
  95.                                 {
  96.                                     failure_once[FO_GSM_T11] = 1;
  97.                                     failure_add(1216); // GSM hiba, nem lehet kommunikálni a modullal
  98.                                 }
  99.                                 sys_led_idle();
  100.                                 gsm_busy = 0;
  101.                                 gsm_send_sms_sm = 0;
  102.                                 return GSM_ERR;
  103.                             }else
  104.                                 return GSM_BUSY;
  105.                         }
  106.                        
  107.                         break;
  108.  
  109.                     default:
  110.                         return GSM_BUSY;
  111.  
  112.                 }
  113.             }else return GSM_BUSY;
  114.         }else return GSM_OFF;
  115.     }
  116. }


A soros portra sztring kiküldő függvényem:
  1. bool uart4_putstring(uint8_t buffer[], int len)
  2. {
  3.     if(buffer == NULL)
  4.         return false;
  5.     while(!U4STAbits.TRMT);         // we HAD to WAIT until the last character SENT OUT
  6.     if(!UartBusy)
  7.     {
  8.         if(len > 1)
  9.         {
  10.             BytesToSend = len -1;
  11.             SentByteIndex = 1;
  12.             UartBusy = true;
  13.         }
  14.        
  15.         strcpy(TxB, buffer);
  16.        
  17.         //send the first character
  18.         while (U4STAbits.UTXBF);
  19.         U4TXREG = TxB[0];
  20.         while(!U4STAbits.TRMT);
  21.         if(len > 1)
  22.         {
  23.             IEC5bits.U4TXIE = 1;    // Tx interrupt enable
  24.         }
  25.        
  26.         return true;
  27.     }else
  28.     {
  29.         return false;
  30.     }
  31. }


Plusz egy részlet a menüből, ahol egy telefonszámot be lehet állítani és engedélyezni lehet:
  1. if(lcd_thirdlevel_step == 1) //Telefonszám 1
  2.                             {
  3.                                 lcd_putstring(2, 10, "Telefonszám 1", 0, 0);
  4.                                 lcd_putstring(2, 30, gsm_phone_1_nr, 0, 0);
  5.                                
  6.                                 if(gsm_phoneno_1_en == 0)
  7.                                 {
  8.                                     lcd_putstring(2, 42, "Inaktív", 0, 0);
  9.                                 }else
  10.                                 {
  11.                                     lcd_putstring(2, 42, "Aktív", 0, 0);
  12.                                 }
  13.                                
  14.                                 lcd_draw_line(39, 6*gsm_add_phoneno_step, 9);
  15.                                
  16.                                 arrows_input();
  17.                                
  18.                                 if(btn_up())
  19.                                 {
  20.                                     //48-57
  21.                                     if(gsm_phone_1_nr[gsm_add_phoneno_step] < 57)
  22.                                         gsm_phone_1_nr[gsm_add_phoneno_step]++;
  23.                                     else
  24.                                         gsm_phone_1_nr[gsm_add_phoneno_step] = 48;
  25.                                    
  26.                                     lcd_clear(20, 0, 45, 127, 0);
  27.                                    
  28.                                 }
  29.  
  30.                                 if(btn_down())
  31.                                 {
  32.                                     if(gsm_phone_1_nr[gsm_add_phoneno_step] > 48)
  33.                                         gsm_phone_1_nr[gsm_add_phoneno_step]--;
  34.                                     else
  35.                                         gsm_phone_1_nr[gsm_add_phoneno_step] = 57;
  36.                                    
  37.                                     lcd_clear(20, 0, 45, 127, 0);
  38.                                 }
  39.  
  40.                                 if(btn_right())
  41.                                 {
  42.                                     lcd_clear(20, 0, 45, 127, 0);
  43.                                     if(gsm_add_phoneno_step < 11) gsm_add_phoneno_step++;
  44.                                 }
  45.                                 if(btn_left())
  46.                                 {
  47.                                     lcd_clear(20, 0, 45, 127, 0);
  48.                                     if(gsm_add_phoneno_step >= 2) gsm_add_phoneno_step--;
  49.                                 }
  50.  
  51.                                 if(btn_ok())
  52.                                 {
  53.                                     for(i = 0;i<=11;i++)
  54.                                     {
  55.                                         fram_write(0,110+i,gsm_phone_1_nr[i]);
  56.                                     }
  57.                                    
  58.                                     gsm_add_phoneno_step = 1;
  59.                                     lcd_thirdlevel_state = 0;
  60.                                     lcd_clear(9, 0, 63, 127, 0);
  61.                                 }
  62.                             }
  63.                            
  64.                             if(lcd_thirdlevel_step == 2) //Telefonszám 1 állapot
  65.                             {
  66.                                 lcd_putstring(2, 10, "Telefonszám 1 állap.", 0, 0);
  67.                                
  68.                                 if(gsm_phoneno_1_en == 0)
  69.                                 {
  70.                                     lcd_putstring(41,30, "Inaktív", 0, 0);
  71.                                 }else
  72.                                 {
  73.                                     if(gsm_phoneno_1_en == 1)
  74.                                     {
  75.                                         lcd_putstring(41,30, " Aktív ", 0, 0);
  76.                                     }else
  77.                                     {
  78.                                         lcd_putstring(52,36, "HIBA kód: 2941", 0, 0);
  79.                                     }
  80.                                 }
  81.  
  82.                                 arrows_deepmenu();
  83.                                
  84.                                 if(btn_up())
  85.                                 {
  86.                                     if(gsm_phoneno_1_en == 1) gsm_phoneno_1_en = 0; else gsm_phoneno_1_en = 1;
  87.                                     lcd_clear(20, 0, 45, 127, 0);
  88.                                    
  89.                                 }
  90.  
  91.                                 if(btn_down())
  92.                                 {
  93.                                     if(gsm_phoneno_1_en == 0) gsm_phoneno_1_en = 1; else gsm_phoneno_1_en = 0;
  94.                                    
  95.                                     lcd_clear(20, 0, 45, 127, 0);
  96.                                 }
  97.  
  98.                                 if(btn_right())
  99.                                 {
  100.                                     ;
  101.                                 }
  102.                                 if(btn_left())
  103.                                 {
  104.                                     gsm_phoneno_1_en = fram_read(0,129);
  105.                                     lcd_thirdlevel_state = 0;
  106.                                 }
  107.  
  108.                                 if(btn_ok())
  109.                                 {
  110.                                     fram_write(0,129,gsm_phoneno_1_en);
  111.                                     lcd_thirdlevel_state = 0;
  112.                                     lcd_clear(9, 0, 63, 127, 0);
  113.                                 }
  114.                             }


Előre is köszönöm szépen a segítő szándékot! Nem gondoltam, hogy ennyien lesztek!

Szerk.: Van még egy szekció, ahol azonosítom, hogy mely számról érkezett SMS, mert az eszközt lehet SMS-el vezérelni és ha megfelelő számról érkezett az SMS, a menüben engedélyezve is van, akkor végrehajtja a parancsot és küld visszaigazolást. De ez sem adhat értéket:
  1. if((strstr(RxB,gsm_phone_1_nr) != NULL && gsm_phoneno_1_en == 1) || (strstr(RxB,gsm_phone_2_nr) != NULL && gsm_phoneno_2_en == 1) || (strstr(RxB,gsm_phone_3_nr) != NULL && gsm_phoneno_3_en == 1) || (strstr(RxB,gsm_phone_4_nr) != NULL && gsm_phoneno_4_en == 1) || (strstr(RxB,gsm_phone_5_nr) != NULL && gsm_phoneno_5_en == 1))
A hozzászólás módosítva: Máj 9, 2018
(#) pipi válasza Droot hozzászólására (») Máj 9, 2018 /
 
Hali!
Szerintem valahol túlcsordulsz, és felülírod a stringed...
A számokban a ? az valóban asci ? vagy "valami" ami így jelenik meg, meg kellene nézni pontosan, lehet informatív...
Esetleg kavard meg a változók sorrendjét, változik-e a hiba hogy mást ír szét.
A tápod rendben van? A gsm-ek szeretik megrángatni a tápot, ha ettől a pic ram felejt... Brownout van? Gsm modul adáskor nem szórja meg keményen az egész procis rendszert? árnyékolás?
(#) Droot válasza pipi hozzászólására (») Máj 9, 2018 /
 
Szia!

Pickit3-al debuggoltam, a proci pic32mz2048efh100. Debuggoláskor is kérdőjeleket írt a változó értékére, úgyhogy valószínűsíten ascii, illetve kiírni is ascii-ben írom. Keresgélek még errefelé is.
A táp bombabiztos, külön a pic-nek és a gsm-nek szintillesztve, nem szórhatja meg a pic-et, illetve egyszer már stabilan ment, egy sw upgrade-kor került bele, de nem emlékszem mit és mikor változtattam pontosan. Kb 10cm-re van a gsm modul a procitól. Külön step-down-ról megy, ripple filter-el és a gsm táp 3A-es, a pic 1 vagy 2A-es.
Ha esetleg még van tipp akkor szívesen fogadom és utánanézek.
(#) sdrlab válasza Droot hozzászólására (») Máj 9, 2018 /
 
A TxB hol van és milyen módon deklarálva ?
(#) Droot válasza sdrlab hozzászólására (») Máj 9, 2018 /
 
Szintén globális változó, uint8_t TxB[255].
Közben megnéztem, tényleg ASCII kérdőjel van a változóban, decimálisan 63 decimálisan.
(#) sdrlab válasza Droot hozzászólására (») Máj 9, 2018 /
 
Tehát a modulból bármi hozzáférhet...
Erre mi szükség van ? strcpy(TxB, buffer);
Illetve az adatok már a buffer tömbben rosszak, vagy a TxB-ben rosszak csak ?
(#) Droot válasza sdrlab hozzászólására (») Máj 9, 2018 /
 
Már a Tx-ben rosszak. Az strcpy szerintem még anno maradt benne amikor azt a részt teszteltem és ellenőriztem mi folyik ott.
Azért rossz már a buffer tömbben, mert a gsm_phone_X_nr változóban is rosszak már.
(#) sdrlab válasza Droot hozzászólására (») Máj 9, 2018 /
 
Elsőre én nem látok semmi rendkívülit a kódokban.
Viszont, mivel mindenhová címeket adsz át, így lényegében az összes függvényt meg kellene vizsgálni, ahová átadod a tömböt, mert valahol felülíródik!
Az is könnyen lehet, egyszerű logikai hiba csak...egy rosszkor történő értékadás következményeként...
(#) Droot válasza sdrlab hozzászólására (») Máj 9, 2018 /
 
Igen, én is ezt látom, hogy mindent egyesével át kell nézni, csak ugye az a baj, hogy van amikor pl 50 sms elküldése után jelentkezik a hiba.
Én arra gondolok, hogy a gsm_send_sms-ben vagy annál mélyebben száll el, mert ez csak az engedélyezett telefonszámoknál hívódik meg és mindig csak az engedélyezett telefonszámhoz tartozó változó értéke hülyül be.
De ott akárhogy is nézem egy értékadás sincs!
Mindenesetre az első mondatodat jó olvasni több, mint 40 ezer soros a kód, hiába én írtam, nem egyszerű hibát keresni.

Szerk.:
Most jobban megnéztem, az strcpy(TxB, buffer);-re azért van szükség, mert a buffer (jelen esetben telefonszámot tartalmaz) átmásolja a TxB-be és onnantól megszakításból megy a sorosport kiküldés a háttérben. Beállít egy flag-et is, ami jelzi, hogy most elfoglalt a soros port mert még adatot küld.
A hozzászólás módosítva: Máj 9, 2018
Következő: »»   1291 / 1320
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