Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   110 / 118
(#) sysy válasza Dempsey hozzászólására (») Aug 14, 2015 /
 
Ez azért van, mert csak 2 byte a soros porti buffer hossza. Az első két byte beérkezik, amit nem olvasol ki rögtön és bedugul a soros portod, mivel overrun hibával leáll, ha tele lesz mindkét buffere. Ilyenkor resetelni kell a soros port hardverét.

Én ezt úgy csináltam, hogy megszakításosan kezeltem a soros portot.
Tehát, ha beesik egy byte, akkor jön egy megszakítás és kiolvastam a byte-ot és átmásoltam egy tetszőlegesen hosszú bufferbe.
Minden <LF> beérkezése esetén megvizsgáltam, hogy hány byte van a tetszőleges hosszúságú bufferben. Ha több, mint 2, akkor a lezáró <LF> jött és ki lehet elemezni a beérkezett szöveget.
(Egyébként a <CR>, <LF> karaktereket kidobtam és le sem raktam a tetszőlegesen hosszú bufferbe, mert bonyolította az elemzést. Az elemzés után a tetszőleges hosszúságú buffer tele lett írva 0x00-val, hogy tudjam hol van vége a következő beérkező szövegnek)
(#) Dempsey válasza sysy hozzászólására (») Aug 14, 2015 /
 
Itt a kód:
  1. #include <18f25k20.h>
  2. #include <string.h>  
  3.  
  4. #fuses put,nolvp,noprotect,intrc_io,nowdt,debug
  5. #use delay (clock=16MHz)
  6. #use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7,bits=8,parity=N,stop=1,ERRORS)
  7.  
  8. /////////////////////////////////////////////////////////////
  9. // Változók/pinek definiálása az LCD vezérléshez
  10.  
  11. #define LCD_DB4   PIN_B4
  12. #define LCD_DB5   PIN_B5
  13. #define LCD_DB6   PIN_B6
  14. #define LCD_DB7   PIN_B7
  15.  
  16. #define LCD_E     PIN_C3
  17. #define LCD_RS    PIN_C1
  18. #define LCD_RW    PIN_C2
  19.  
  20.  
  21. // LCD programrész
  22.  
  23. #define USE_LCD_RW   1    
  24.  
  25. //========================================
  26.  
  27. #define lcd_type 2        // 0=5x7, 1=5x10, 2=2
  28. #define lcd_line_two 0x40 // LCD RAM cím a második sorhoz
  29.  
  30.  
  31. int8 const LCD_INIT_STRING[4] =
  32. {
  33.  0x20 | (lcd_type << 2), // Funkció beállítások: 4-bites, 2 soros, 5x8 pixeles beállítás
  34.  0xc,                    // Kijelző be
  35.  1,                      // Kijelző törlése
  36.  6                       // Kurzor inkrementálása
  37.  };
  38.                              
  39.  
  40. //-------------------------------------
  41. void lcd_send_nibble(int8 nibble)
  42. {
  43.  
  44.  
  45.  output_bit(LCD_DB4, !!(nibble & 1));
  46.  output_bit(LCD_DB5, !!(nibble & 2));
  47.  output_bit(LCD_DB6, !!(nibble & 4));  
  48.  output_bit(LCD_DB7, !!(nibble & 8));  
  49.  
  50.  delay_cycles(1);
  51.  output_high(LCD_E);
  52.  delay_us(2);
  53.  output_low(LCD_E);
  54. }
  55.  
  56.    
  57.  
  58. #ifdef USE_LCD_RW
  59. int8 lcd_read_nibble(void)
  60. {
  61. int8 retval;
  62.  
  63. #bit retval_0 = retval.0
  64. #bit retval_1 = retval.1
  65. #bit retval_2 = retval.2
  66. #bit retval_3 = retval.3
  67.  
  68. retval = 0;
  69.    
  70. output_high(LCD_E);
  71. delay_cycles(1);
  72.  
  73. retval_0 = input(LCD_DB4);
  74. retval_1 = input(LCD_DB5);
  75. retval_2 = input(LCD_DB6);
  76. retval_3 = input(LCD_DB7);
  77.  
  78. output_low(LCD_E);
  79.    
  80. return(retval);  
  81. }  
  82. #endif
  83.  
  84.  
  85.  
  86. #ifdef USE_LCD_RW
  87. int8 lcd_read_byte(void)
  88. {
  89. int8 low;
  90. int8 high;
  91.  
  92. output_high(LCD_RW);
  93. delay_cycles(1);
  94.  
  95. high = lcd_read_nibble();
  96.  
  97. low = lcd_read_nibble();
  98.  
  99. return( (high<<4) | low);
  100. }
  101. #endif
  102.  
  103.  
  104.  
  105. void lcd_send_byte(int8 address, int8 n)
  106. {
  107. output_low(LCD_RS);
  108.  
  109. #ifdef USE_LCD_RW
  110. while(bit_test(lcd_read_byte(),7)) ;
  111. #else
  112. delay_us(60);
  113. #endif
  114.  
  115. if(address)
  116.    output_high(LCD_RS);
  117. else
  118.    output_low(LCD_RS);
  119.      
  120.  delay_cycles(1);
  121.  
  122. #ifdef USE_LCD_RW
  123. output_low(LCD_RW);
  124. delay_cycles(1);
  125. #endif
  126.  
  127. output_low(LCD_E);
  128.  
  129. lcd_send_nibble(n >> 4);
  130. lcd_send_nibble(n & 0xf);
  131. }
  132.  
  133. //----------------------------
  134. void lcd_init(void)
  135. {
  136. int8 i;
  137.  
  138. output_low(LCD_RS);
  139.  
  140. #ifdef USE_LCD_RW
  141. output_low(LCD_RW);
  142. #endif
  143.  
  144. output_low(LCD_E);
  145.  
  146. delay_ms(15);
  147.  
  148. for(i=0 ;i < 3; i++)
  149.    {
  150.     lcd_send_nibble(0x03);
  151.     delay_ms(5);
  152.    }
  153.  
  154. lcd_send_nibble(0x02);
  155.  
  156. for(i=0; i < sizeof(LCD_INIT_STRING); i++)
  157.    {
  158.     lcd_send_byte(0, LCD_INIT_STRING[i]);
  159.    
  160.     #ifndef USE_LCD_RW
  161.     delay_ms(5);
  162.     #endif
  163.    }
  164.  
  165. }
  166.  
  167. //----------------------------
  168.  
  169. void lcd_gotoxy(int8 x, int8 y)
  170. {
  171. int8 address;
  172.  
  173. if(y != 1)
  174.    address = lcd_line_two;
  175. else
  176.    address=0;
  177.  
  178. address += x-1;
  179. lcd_send_byte(0, 0x80 | address);
  180. }
  181.  
  182. //-----------------------------
  183. void lcd_putc(char c)
  184. {
  185.  switch(c)
  186.    {
  187.     case '\f':
  188.       lcd_send_byte(0,1);
  189.       delay_ms(2);
  190.       break;
  191.    
  192.     case '\n':
  193.        lcd_gotoxy(1,2);
  194.        break;
  195.    
  196.     case '\b':
  197.        lcd_send_byte(0,0x10);
  198.        break;
  199.    
  200.     default:
  201.        lcd_send_byte(1,c);
  202.        break;
  203.    }
  204. }
  205.  
  206. //------------------------------
  207. #ifdef USE_LCD_RW
  208. char lcd_getc(int8 x, int8 y)
  209. {
  210. char value;
  211.  
  212. lcd_gotoxy(x,y);
  213.  
  214. while(bit_test(lcd_read_byte(),7));
  215.  
  216. output_high(LCD_RS);
  217. value = lcd_read_byte();
  218. output_low(lcd_RS);
  219.  
  220. return(value);
  221. }
  222. #endif
  223.  
  224.  
  225.  
  226.  
  227. #include <input.c>
  228.  
  229.  
  230.    #define BUFFER_SIZE 32
  231.    BYTE buffer[BUFFER_SIZE];
  232.    BYTE next_in = 0;
  233.    BYTE next_out = 0;
  234.    
  235.    
  236.    #int_rda
  237.    void serial_isr() {
  238.       int t;
  239.    
  240.       buffer[next_in]=getc();
  241.       t=next_in;
  242.       next_in=(next_in+1) % BUFFER_SIZE;
  243.       if(next_in==next_out)
  244.         next_in=t;           // Buffer full !!
  245.    }
  246.    
  247.    #define bkbhit (next_in!=next_out)
  248.    
  249.    BYTE bgetc() {
  250.       BYTE c;
  251.    
  252.       while(!bkbhit) ;
  253.       c=buffer[next_out];
  254.       next_out=(next_out+1) % BUFFER_SIZE;
  255.       return(c);
  256.    }
  257.    
  258.    void main() {
  259.  
  260.           lcd_init();
  261.  
  262.       enable_interrupts(int_rda);
  263.       enable_interrupts(global);
  264.    
  265.       do {
  266.    
  267.          delay_ms(10000);
  268.        
  269.          while(bkbhit)
  270.  
  271.           lcd_putc( bgetc() );
  272.                
  273.       } while (TRUE);
  274.  }

Ha gépről küldtem neki hogy 0D 0A 52 49 4E 47 akkor a kijelzőn az jelent meg amit a csatolt képen látsz. De ha megcsörgetem a gsm modult akkor semmi nem érkezik be pedig kicsöng.

DSC_0071.JPG
    
(#) Dempsey válasza Dempsey hozzászólására (») Aug 14, 2015 /
 
Rosszul írtam előbb mert GSM ről a képen látható "jelek" érkeznek.

DSC_0072.JPG
    
(#) sysy válasza Dempsey hozzászólására (») Aug 14, 2015 /
 
a GSM modulénak nem két soros portja van véletlenül?
A számítógépen megnézted már a GSM module átküldött karaktereit?
A hozzászólás módosítva: Aug 14, 2015
(#) Dempsey válasza sysy hozzászólására (») Aug 14, 2015 /
 
Megnéztem ott ez jön CR LF RING CR LF. Ha gépről küldök adatot a picnek tökéletes. Látszik az előzőleg csatolt képen. A fura karakter a CR aztán már új sorba van a RING. De ha a GSM modult csörgetem meg akkor az a pár hülye karakter jön. Ha terminál programba nézem a GSM et akkor újsor RING újsor RING és így tovább. Tehát jó adatot küld.
A hozzászólás módosítva: Aug 14, 2015
(#) sysy válasza Dempsey hozzászólására (») Aug 14, 2015 /
 
Gondolom, hogy a GSM module 3V-ról megy, a PIC pedig 5V-ról. Lehet, hogy szintillesztést kellene alkalmazni?
Az RS232 kábel valószinüleg áthidalta a problémát eddig.
(#) Dempsey válasza sysy hozzászólására (») Aug 14, 2015 /
 
3.3V os PIC-et használok. Ha jól tudom ilyenkor nem kell szintillesztés. A GSM is 3.3V on megy ahogy írtad. Nem a 9 pólusú csatin kommunikálok a GSM el hanem a Tx Rx tüskéken ami ki van vezetve a modulból. Van egy USB soros átalakítóm ami tud 3.3V os UARTot azzal néztem a bejövő adatot mikor géphez kötöttem. Amúgy amit küldtem program az jó szerinted? Végülis egy ccs-es példaprogi.
(#) Gyimate hozzászólása Aug 27, 2015 / 2
 
Sziasztok!
Gondoltam, hogy közreadom az egyik nemrég megírt programom, mivel hasonlóval nem találkoztam eddig (nem jelenti, hogy nem is létezik...). A program lényege a Timer2 modul beállításának a segítése. Olyan programmal már találkoztam, hogy megadjuk az előosztást, utó osztást és a túlcsordulások számát majd a program kiszámolja, hogy ez milyen időközönként jelent megszakítást, de a fordítottjával még nem találkoztam, vagyis, hogy mi adjuk meg a kívánt megszakítások számát és a program meg megállapítja a leghatékonyabb timer beállítást. Ez a program mind a két változatra képes. Ha kérdésetek van vele kapcsolatban, akkor szóljatok. Még annyit, hogy .Net Framework 3.5 kell a futtatásához.
(#) Dempsey válasza Gyimate hozzászólására (») Aug 27, 2015 /
 
Köszi hogy közzétetted!
(#) Gyimate válasza Gyimate hozzászólására (») Aug 27, 2015 /
 
A használat közben észrevettem egy hibát, amit javítok, hogy ha ti adjátok meg a kívánt osztásokat és a program csak a frekvenciát számolja, akkor hibásan írja ki alul a szükséges kódrészletet, erre figyeljetek. Ha bárkinek van valami észrevétele a programmal, akkor írjátok meg. A javított verziót nemsokára közzéteszem.
(#) Buvarruha válasza Gyimate hozzászólására (») Aug 27, 2015 /
 
Épp a CCSC-vel nyitogatok új projekt wizard-ot, ennek kiszotyizására, köszi. Nem lenne mód a többi timert kalkuláló megodlásra?
(#) Gyimate válasza Buvarruha hozzászólására (») Aug 27, 2015 /
 
Ezért nem adtam még közre a javított verziót ebből, mert éppen a több timeres programon dolgozom. Még körülbelül 1 óra és közreadom a következő verziót, persze ha rendben fog futni.
A hozzászólás módosítva: Aug 27, 2015
(#) Gyimate válasza Gyimate hozzászólására (») Aug 27, 2015 /
 
Ahogy elnézem majdnem letelt az ígért 1 óra, így közzéteszem az újabb programot, amely már az összes (Timer0, Timer1 és Timer2) Timert kezelni tudja. Igyekeztem a program kibővített tudása mellett is megőrizni a kezelhetőségét. Ha bármi kérdés vagy kérés merülne fel a program használatával kapcsolatban, vagy valami hibát fedeznétek fel a működésében, azt nyugodtan megírhatjátok. Szeretném megjegyezni, hogy a Timer1 fordított számítása lassabb gépeken több időt vehet igénybe, mivel a programnak rengeteg opció közül kell a legoptimálisabbat kiválasztani.
A hozzászólás módosítva: Aug 27, 2015
(#) Buvarruha válasza Gyimate hozzászólására (») Aug 28, 2015 /
 
Hasznos lenne még, ha a Timer2 mindjárt PWM frekvenciát is tudna számolni én konkrétan arra használnám, meg még sokan mások is szerintem. Valamint, ha átnyomod kereső módba, majd vissza a manuális beállításra, akkora keresésnél megmaradnak a keresett értékek, azok ilyenkor törlődhetnének, mert félrevezető is lehet akár.
(#) Gyimate válasza Buvarruha hozzászólására (») Aug 28, 2015 /
 
Szia!
Köszönöm szépen az észrevételed. A keresett értékeket már átírtam, hogy ha üzemmódot változtatsz, akkor törölje a program. A PWM frekvenciát már csak holnap fogom beleírni, mára eléggé belefáradtam. (Holnap, azaz majd ha felkeltem ma reggel )
(#) Buvarruha válasza Gyimate hozzászólására (») Aug 28, 2015 /
 
Hadd szóljon, én örülnék neki, akkor nem kéne a CCSC varázslójával szotyiznom.
(#) usane válasza Gyimate hozzászólására (») Aug 28, 2015 /
 
Szuper. Én úgyis lusta vagyok számolgatni
(#) Gyimate válasza Buvarruha hozzászólására (») Aug 28, 2015 / 1
 
Sziasztok!
Úgy gondoltam, belinkelem a program letöltési helyét és ha frissül, akkor is ugyan erről a linkről letölthetitek.
PROGRAM LETÖLTHETŐ INNEN
Ebben a verzióban helyet kapott a PWM frekvenciájának a számítása is, továbbá kivettem az előzőekben tárgyalt számolt értékeket. Továbbra is várom az észrevételeteket illetve a kívánságokat...
A hozzászólás módosítva: Aug 28, 2015

PROG_V1.1.png
    
(#) Buvarruha válasza Gyimate hozzászólására (») Aug 28, 2015 /
 
Na ez így már baba, most aztán tényleg nem kell szotyiznom a CCSC warázslóval, köszi.
(#) Gyimate válasza Buvarruha hozzászólására (») Aug 28, 2015 /
 
Örülök, hogy tetszik a program, nagyon szívesen!
Amit még mindenképpen megszeretnék oldani, hogy átdolgozom az algoritmust, ami alapján keresi a lehetőségeket, mivel jelen állapotában ~520MB RAM-ra van szüksége (Ennyi számítást végez el, a program amikor megnyomjátok a keresés gombot...)
A hozzászólás módosítva: Aug 28, 2015
(#) Buvarruha válasza Gyimate hozzászólására (») Aug 28, 2015 /
 
Űha most nézem, hogy csak a programot elindítva is benyel 1GB-ot
(#) Gyimate válasza Buvarruha hozzászólására (») Aug 28, 2015 /
 
A hibát már javítottam, mellesleg ha minden rendben van a gépeden, akkor elindítva csak ~7MB RAM-ot szabad lefoglalnia.
A hozzászólás módosítva: Aug 28, 2015
(#) Buvarruha válasza Gyimate hozzászólására (») Aug 28, 2015 /
 
Igen, de előtte volt keresve és azóta nem volt semmi ramigényes dolog indítva és ilyenkor újra tölti. Restart után nem lenne ilyen gondolom. De akkor már a javított van feltöltve?
(#) jani87 hozzászólása Aug 28, 2015 / 1
 
Sziasztok!
Én is feltöltöm akkor a kis PIC-es segédprogramomat, igaz nem CCS-hez írtam, hanem C18-hoz és van benne elég sok plusz funkció, amit CCS-ben nem éri meg használni, de a timer számításokhoz jól jöhet. Amúgy egy USB-s PIC-hez csatlakoztatva (igazából 18F4550-hez készült) a program felismeri a kontrollert és képes is azt real-timeban vezérleni (Timerek, PWM, Interruptok, Portok) és monitorozni (ADC, Portok), tehát kb. egy futás idejű programozást valósítok meg vele, nem kell állandóan fordítgatni és beégetni a módosításokat.
Kétféle számítás van a timereknél: vagy a preload regiszterek alapján számol frekvenciát és periódusidőt, vagy fordítva; a frekvenciából, illetve a periódusidőből számolja ki a preload regiszterek értékét (a prescalert kézzel kell bekattintgatni). A jobb alsó sarokban mutatja a freki és a periódus minimum és maximum értékét, amik értelemszerűen a prescalerektől is függenek.
(#) dinokal válasza jani87 hozzászólására (») Aug 29, 2015 /
 
Szia! Miben írtad a programot?
(#) Taki33 hozzászólása Aug 29, 2015 /
 
Sziasztok!

Hasonlót én is készítettem Mplab X alá, egy timer kalkulátort és egy bit konvertert.
Telepítése: Mplab X elindít -> Tools -> Plugins majd a Downloaded fülön az Add Plugins..
gombra kattintva megadni a kicsomagolt nbm kiterjesztésű fájlt.
(#) jani87 válasza dinokal hozzászólására (») Aug 29, 2015 /
 
Szia! Microsoft Visual C#-ban.
(#) Buvarruha válasza Taki33 hozzászólására (») Aug 29, 2015 /
 
Kösz!
(#) madazg77 hozzászólása Szept 1, 2015 /
 
Sziasztok!

Szeretnék segítséget kérni egy kód részlet megértésében. Dempsey feltett 14.-én egy programot amit nézegettem és ez a rész nem világos számomra:
#define bkbhit (next_in!=next_out)

BYTE bgetc() {
BYTE c;

while(!bkbhit) ;
c=buffer[next_out];
next_out=(next_out+1) % BUFFER_SIZE;
return(c);
}
Megkérhetek valakit hogy kommentezze vagy magyarázza el az egyes sorokat.
Köszönöm.
(#) foxi63 válasza madazg77 hozzászólására (») Szept 19, 2015 /
 
Szia!
1. #define bkbhit (next_in!next_out)
Egyszerű definíció bkbhit ezentúl egyenlő (next_in!=next_out) szöveggel
2. while ciklusból csak akkor van kilépés, ha nem igaz bkbhit ,azaz ha next_in =next_out-al. Itt kettős tagadás van.(next_in valahol globális változó)
3. C változó felveszi a bufferből a next_out értékének megfelelő számot. (next_out egy tömbelem mutató)
4. Ezután a tömbelem mutató felveszi a következő hely címét, majd eloszódik a tömb méretével, és annak a maradékát veszi fel értéknek. Magyarul mindegy mekkora a tömb, amikor a végére ér, kezdi a címzést elölről.
üdv.: Foxi
5. A függvény visszatér a tömb valamelyik elemével.
A hozzászólás módosítva: Szept 19, 2015
Következő: »»   110 / 118
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