Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
 
Témaindító: histu1985, idő: Feb 11, 2006
Témakörök:
Lapozás: OK   151 / 152
(#) superuser válasza cross51 hozzászólására (») Szept 22, 2021 /
 
Cross51: Ott a pont! Viszont van egy library, amivel elvileg megvalósítható a 9 bites küldés, a paritás bit speciális felhasználásával. Ennek az élesztése van most valószínűleg folyamatban

Babakush: Nincs mit! remélem sikerül összehozni
(#) Babakush válasza cross51 hozzászólására (») Szept 23, 2021 /
 
Igen pont ez a terv.
(#) Babakush hozzászólása Szept 24, 2021 /
 
Sziasztok!

Megint én....
Sajnos nem sikerül összehozni, hogy PI-ről is fogadja az adatokat. Kimértem mind két jelet és teljesen tanácstalan vagyok, mivel szerintem ugyan olyanokat. PIC-ről tökéletesen dolgozik a cím byte-al és fogadja utána az adatot is. Viszont, ha PI-ről csinálom ugyanezt, még az Rx interrupt se hívódik meg. Kipróbáltam PI-PIC kommunikációt 8bites UART-al úgy tökéletesen működik minden. Valamiért a 9bitesnél száll el pedig, szerintem megegyezik a PIC-nél kiadott jelekkel. Remélem csak nagyon benézek valamit és ti tudtok segíteni . (0x02 a cím byte mindkét esetben és 0x06 az adat) Kipróbáltam más baudrate-en is, de semmi
A hozzászólás módosítva: Szept 24, 2021
(#) Hp41C válasza Babakush hozzászólására (») Szept 24, 2021 / 1
 
pic0x02.PNG - 44 időegység, rpi0x02.PNG - 40 időegység.
(#) Babakush válasza Hp41C hozzászólására (») Szept 24, 2021 /
 
Akkor a Pi nem is 9bitet küld ki magából?
(#) jefflynn válasza Babakush hozzászólására (») Szept 24, 2021 / 2
 
Miért nem 0x55 vagy 0xAA adatokkal tesztelsz? Ott látszanának a bitek, legalábbis egyszerűbb lenne megszámolni és eldönteni, hogy 8 vagy 9 bitet küld ki.
(#) superuser válasza Babakush hozzászólására (») Szept 24, 2021 /
 
Idézet:
„Akkor a Pi nem is 9bitet küld ki magából?”

Ezt írtam 10 hozzászólással korábban (21:37)
(#) Babakush válasza superuser hozzászólására (») Szept 25, 2021 /
 
Sikerült rájönni mi a probléma csak megoldás még nincs rá. Jefflynn ötletét felhasználva, sikerült megnézni, hogy hány bit is jön ki belőle. meg van a 9. A hiba C++ programban van, rosszul billentgeti a mark/space parity bitet
A hozzászólás módosítva: Szept 25, 2021
(#) pipi válasza Babakush hozzászólására (») Szept 25, 2021 /
 
Csak belevau, de nem lehet hogy a paritást a soros bájtnak megfelelően állítja automatikusan, és nem a te kivánságod szerint ?
(#) icserny válasza Babakush hozzászólására (») Szept 25, 2021 /
 
Nem tudom, hogy ez segít-e valamit: Bővebben: Link
(#) Babakush hozzászólása Okt 1, 2021 / 1
 
Köszönöm mindenkinek a segítő tanácsokat. A héten nem volt nagyon időm rá, hogy foglalkozzak vele, de ma neki ültem tiszta fejjel és sikerült. Ezt csak azért írom le, hogy legyen tanulsága a kálváriámnak, illetve hátha segít valakinek a jövőben. Első körben,aki ezzel próbálkozna Bővebben: Link, nálam nem működött, szerintem QT SDK nem jól kezeli jól a paritás bitet. Így visszatértem az alapokhoz és megírtam c-ben. A kulcs az egészben, amikor mark/space paritást szeretne váltani az ember( tio.c_cflag &= ~PARODD vagy tio.c_cflag |= PARODD) a paritás beállítása utána frissíteni kell a terminos struktúrát ezzel a függvénnyel tcsetattr() különben nem érvényes a paritás váltás
(#) Laja1 hozzászólása Jan 13, 2022 /
 
Sziasztok!

Abban tudnátok segíteni, hogy a k értékét miért nem tudom kiíratni LCD-re? A szöveges rész szépen megjelenik.

Köszönöm!

  1. #include <xc.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include "newxc8_header.h"
  6. //#pragma config FOSC = EXTRC     // Oscillator ion bits (RC oscillator)
  7. //#pragma config WDTE = ON        // Watchdog Timer Enable bit (WDT enabled)
  8. //#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  9. //#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
  10. //#pragma config LVP = ON         // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
  11. //#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
  12. //#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
  13. //#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
  14. #define _XTAL_FREQ 8000000
  15. #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
  16. // set up the timing for the LCD delays
  17. #define LCD_delay 20 // ~5mS
  18. #define LCD_Startup 15 // ~15mS
  19.  
  20. // Command set for Hitachi 44780U LCD display controller
  21. #define LCD_CLEAR 0x01
  22. #define LCD_HOME 0x02
  23. #define LCD_CURSOR_BACK 0x10
  24. #define LCD_CURSOR_FWD 0x14
  25. #define LCD_PAN_LEFT 0x18
  26. #define LCD_PAN_RIGHT 0x1C
  27. #define LCD_CURSOR_OFF 0x0C
  28. #define LCD_CURSOR_ON 0x0E
  29. #define LCD_CURSOR_BLINK 0x0F
  30. #define LCD_CURSOR_LINE2 0xC0
  31.  
  32. // display controller setup commands  page 46 of Hitachi datasheet
  33. #define FUNCTION_SET 0x2C // 4 bit interface, 2 lines, 5x10 font
  34. #define ENTRY_MODE 0x06 // increment mode
  35. #define DISPLAY_SETUP 0x0C // display on, cursor off, blink offd
  36.  
  37. #define LCDLine1() LCDPutCmd(LCD_HOME) // legacy support
  38. #define LCDLine2() LCDPutCmd(LCD_CURSOR_LINE2) // legacy support
  39. #define shift_cursor() LCDPutCmd(LCD_CURSOR_FWD) // legacy support
  40. #define cursor_on() LCDPutCmd(LCD_CURSOR_ON) // legacy support
  41. #define DisplayClr() LCDPutCmd(LCD_CLEAR) // Legacy support
  42.  
  43.  
  44. //----------------------------------------------------------------------
  45. // Definitions specific to the PICDEM 2 Plus
  46. // These apply to the Black (2011) version.
  47. //----------------------------------------------------------------------
  48.  
  49. // single bit for ing command register or data register
  50. #define instr 0
  51. #define data 1
  52.  
  53. // These #defines create the pin connections to the LCD in case they are changed on a future demo board
  54. #define LCD_PORT PORTD
  55. #define LCD_PWR PORTDbits.RD7 // LCD power pin
  56. #define LCD_EN PORTDbits.RD6 // LCD enable
  57. #define LCD_RW PORTDbits.RD5 // LCD read/write line
  58. #define LCD_RS PORTDbits.RD4 // LCD register  line
  59.  
  60. #define NB_LINES 2 // Number of display lines
  61. #define NB_COL 16 // Number of characters per line
  62.  
  63.  
  64.  
  65.  
  66.  
  67.    
  68.  
  69.  
  70. void LCD_Initialize(void);
  71. void LCDPutChar(char ch);
  72. void LCDPutCmd(char ch);
  73. void LCDPutStr(const char *);
  74. void LCDWriteNibble(char ch, char rs);
  75. void LCDGoto(char pos, char ln);
  76.  
  77. char k=3;
  78.  
  79. void main(void)
  80. {
  81.  
  82. LCD_Initialize();
  83.  
  84.  
  85.  
  86. LCDPutStr(" Kocka");
  87.  
  88.  
  89. __delay_ms(1000);
  90. LCDGoto(3,1); //Go to column 8 of second line
  91. DisplayClr(); // Clear the display
  92. LCDPutChar(k);
  93.  
  94. LCDPutStr(" Zsombi"); // Dispay a string "LCD Display"
  95. LCDGoto(0,1); //Go to second line
  96. LCDPutStr("Kinga");
  97. DisplayClr(); // Clear the display
  98.  
  99.  
  100.  
  101. void LCD_Initialize()
  102. {
  103. // clear latches before enabling TRIS bits
  104. LCD_PORT = 0;
  105.  
  106. TRISD = 0x00;
  107.  
  108. // power up the LCD
  109. LCD_PWR = 1;
  110.  
  111. // required by display controller to allow power to stabilize
  112. __delay_ms(LCD_Startup);
  113.  
  114. // required by display initialization
  115. LCDPutCmd(0x32);
  116.  
  117. // set interface size, # of lines and font
  118. LCDPutCmd(FUNCTION_SET);
  119.  
  120. // turn on display and sets up cursor
  121. LCDPutCmd(DISPLAY_SETUP);
  122.  
  123. DisplayClr();
  124.  
  125. // set cursor movement direction
  126. LCDPutCmd(ENTRY_MODE);
  127.  
  128. }
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135. void LCDWriteNibble(char ch, char rs)
  136. {
  137. // always send the upper nibble
  138. ch = (ch >> 4);
  139.  
  140. // mask off the nibble to be transmitted
  141. ch = (ch & 0x0F);
  142.  
  143. // clear the lower half of LCD_PORT
  144. LCD_PORT = (LCD_PORT & 0xF0);
  145.  
  146. // move the nibble onto LCD_PORT
  147. LCD_PORT = (LCD_PORT | ch);
  148.  
  149. // set data/instr bit to 0 = insructions; 1 = data
  150. LCD_RS = rs;
  151.  
  152. // RW - set write mode
  153. LCD_RW = 0;
  154.  
  155. // set up enable before writing nibble
  156. LCD_EN = 1;
  157.  
  158. // turn off enable after write of nibble
  159. LCD_EN = 0;
  160. }
  161.  
  162. void LCDPutChar(char ch)
  163. {
  164. __delay_ms(LCD_delay);
  165.  
  166. //Send higher nibble first
  167. LCDWriteNibble(ch,data);
  168.  
  169. //get the lower nibble
  170. ch = (ch << 4);
  171.  
  172. // Now send the low nibble
  173. LCDWriteNibble(ch,data);
  174. }
  175.  
  176.  
  177. void LCDPutCmd(char ch)
  178. {
  179. __delay_ms(LCD_delay);
  180.  
  181. //Send the higher nibble
  182. LCDWriteNibble(ch,instr);
  183.  
  184. //get the lower nibble
  185. ch = (ch << 4);
  186.  
  187. __delay_ms(1);
  188.  
  189. //Now send the lower nibble
  190. LCDWriteNibble(ch,instr);
  191. }
  192.  
  193.  
  194. void LCDPutStr(const char *str)
  195. {
  196. char i=0;
  197.  
  198. // While string has not been fully traveresed
  199. while (str[i])
  200. {
  201. // Go display current char
  202. LCDPutChar(str[i++]);
  203. }
  204.  
  205. }
  206.  
  207. void LCDGoto(char pos,char ln)
  208. {
  209. // if incorrect line or column
  210. if ((ln > (NB_LINES-1)) || (pos > (NB_COL-1)))
  211. {
  212. // Just do nothing
  213. return;
  214. }
  215.  
  216. // LCD_Goto command
  217. LCDPutCmd((ln == 1) ? (0xC0 | pos) : (0x80 | pos));
  218.  
  219. // Wait for the LCD to finish
  220. __delay_ms(LCD_delay);
  221. }
  222. /**
  223. End of File
  224. */
(#) Hp41C válasza Laja1 hozzászólására (») Jan 13, 2022 /
 
Az LCD a 0x03 kóddal a felhasználó által definiálható 4. karaktert azonosítja. A 3 számjegy kiíratásához a 0x33 = 51 kódot kell küldeni.
char k='3';
(#) Laja1 válasza Hp41C hozzászólására (») Jan 13, 2022 /
 
Köszönöm szépen. És ha ez a k egy fuggvennyel folyamatosan változik pl. k++;.Akkor ahhoz mit kell beirnom?
(#) Pethical válasza Laja1 hozzászólására (») Jan 13, 2022 /
 
A '3' és a 3 között az a különbség, hogy az első egy ASCII karakter és az értéke 51, a második egy bájt, értéke 3. Lásd: ASCII tábla.

Ha k számot tárol (3), akkor karakterré kell alakítani, hogy meg tudd jeleníteni. Ha karaktert ('3'), akkor egy az egyben ki tud menni. Ez itt nem egy szép és nem is túl optimális megoldás, de azt talán megmutatja, hogy miről van szó.

  1. void LCDPutByte(char ch)
  2. {
  3.   char buffer[4];
  4.   sprintf(buffer, "%d", ch);
  5.   LCDPutString(buffer);
  6. }
  7.  
  8. char k = 3;
  9. LCDPutByte(k);
  10. k++;
  11. LCDPutByte(k);
(#) Laja1 hozzászólása Jan 13, 2022 /
 
Időközben megoldottam így: LCDPutChar(k+0x30);
(#) Pethical válasza Laja1 hozzászólására (») Jan 13, 2022 /
 
Ez is jó megoldás, de vannak limitációi, próbáld ki ezt és látni fogod:
  1. k=10;
  2. LCDPutChar(k+0x30);
A hozzászólás módosítva: Jan 13, 2022
(#) Babakush hozzászólása Feb 17, 2022 /
 
Sziasztok!

Egy különös(legalábbis számomra) problémával fordulnék hozzátok. Feltöltök egy tömböt az uarton bejövő adatokkal, aztán ezt a stringet feldarabolom és egyes részeit berakom egy 2D-s tömbbe. Utána pedig egy struktúrában szereplő stringekkel szeretném összehasonlítani ebben a 2D-s tömbben szereplő stringeket. Free run módban még az első lefutásnál még úgy viselkedik a kód, ahogy szeretném, de következőknél már nem. Elkezdtem kidebugolni, hogy mégis mi szerepelhet a ezekben a tömbökben és azt vettem észre, hogy ha beteszek egy breakpointot akkor, tökéletesen működik minden, akárhányszor is hívom meg ezeket a függvényeket. Viszont, ha nem teszek vagy egy bizonyos sor után teszem a breakpointot ugyanúgy viselkedik a program, mintha free run módban futna. Debugolásnál ilyenkor látszik, hogy valamiért memória szeméttel tölti fel a 2D-s tömbömet. Csatoltam két képet, hátha segít megérteni az esetlegesen felvázolt problémámat.

PIC18fF26k83
MPLABX IDE 5.50
XC8 (V2.32)
(#) majkimester válasza Babakush hozzászólására (») Feb 17, 2022 / 1
 
Hibás esetben az rxbuffer első byte-ja 0, az strtok erre NULL-t ad vissza, de azt nem ellenőrized, hanem növeled mint pointer, és így a memória 0x0001-es címéről olvasol, és onnan dolgozol tovább. Ezért van az command-ban szemét. Azt kell megállapítanod, hogy miért van 0 az rxbuffer elején, illetve ellenőrizni az strtok visszatérési értékét, ha nulla van akkor se legyen hiba.
(#) Babakush válasza majkimester hozzászólására (») Feb 17, 2022 /
 
Igen, de egyelőre nem tudtam kideríteni, mivel ha az uart beolvasás után teszem közvetlenül a breakpointot, nem kerül bele az elejére az a 0 érték. Ezaz, amit nagyon nem értek, hogy miért számít, hova teszem a breakpointot. A többi észrevételt, amúgy köszönöm, ezek valóban hibás részek. Amúgy a pointer preinkrementálás a SOH miatt van, hogy azt már ne tegye át a másik tömbbe, de ahogy mondtad, a hibás esetben nem megfelelő ez a logika.
(#) majkimester válasza Babakush hozzászólására (») Feb 17, 2022 /
 
Én egyébként kerülöm az strtok-ot, mert manipulálja a buffert. Meg lehet oldani anélkül is, ha egy ciklussal végigmész, és másolod a byte-okat amíg elválasztó karaktert nem találsz, vagy a buffer végére nem értél, vagy a célbuffer vége-1-re nem értél. stb. Az sem bonyolultabb, és hibatűrőbbre meg lehet csinálni.

Az strcpy is egy erősen kerülendő függvény. Semmi nem garantálja, hogy nem írod túl a célbuffert, ha nem ellenőrzöd le magad előtte a forrás hosszát. Helyette lehet használni az strncpy-t, ha van ebben a környezetben.

És mit csinál addig a soros vételed, amíg az adatokat feldolgozod? Letiltod vagy továbbra is oda veszi a következő byte-ot? Mi alapján kezdi a buffer elején megint?
A hozzászólás módosítva: Feb 17, 2022
(#) Babakush válasza majkimester hozzászólására (») Feb 17, 2022 /
 
Az strtok megírtam kézzel. Csak ugye úgymond random lesz az első értékem így az összehasonlít elég nehéz, de úgy valóban nem lesz szemét benne csak néha ott a 0 érték néha nem... Köszi! Utána nézek ennek az strncpy-nek(őszintén szólva nem ismertem). Nincs letiltva, de le lesz, erősen teszt fázisban van a kód, de én küldöm ki kézzel neki az adatot uarton szóval, addig nem érkezik semmi, amíg a feldolgozás le nem ment. Közben úgy néz ki sikerült megkerülni a problémát, mivel az elején úgyis mindig ott a SOH, ezért egyszerűen nem rakok be semmit az rxbufferben, amíg be nem olvastam a SOH-ot.

Ui.: Ettől függeetlenül érdekelne, hogy mi okozza az alap problémát, ha találok rá választ, megosztom.
A hozzászólás módosítva: Feb 17, 2022
(#) Babakush válasza majkimester hozzászólására (») Feb 17, 2022 /
 
Van 1 lezáró karakterem a kiküldött stringem végén és ha az megérkezett akkor nullázom a buffer számlálót illetve feldolgozás utána memsettel nullákkal töltöm fel.
(#) miki79 hozzászólása Márc 15, 2022 /
 
Sziasztok!
Tudtok ajánlani írásokat azzal kapcsolatban,hogy hogyan kell problémákat megoldani programozásban.
Pl.:pwm jelet hogyan kell létrehozni és azt kimenetre küldeni.
Köszönöm!
(#) spenyo hozzászólása Ápr 4, 2022 /
 
Sziasztok,
Tudna valaki segíteni.
A PIC18F47Q10 típusú kontrollerrel gyűlt meg a bajom. A TIMER1 16bites számláló legfelső bitjét kéne "1"-be állítani, de valamiért nem működnek az eddigi megszokott dolgok (bit_set(Timer1H, 7), #bit, ..) csak a set_timer1(32768); és nem tudom mi a gond.
Az adatlap szerint - ami új ismeret - eleve be lehet állítani, hogy 8 vagy 16 bites működési módja legyen (RD1 bit) a számlálónak. Lehet, hogy ez a gond, mert hiába próbálom beállítani a 0x0FCD regiszter (TIMER1H) 7. bitjét, az sehogy se sikerül...
Ha valaki tud használható segítséget adni azt nagyon megköszönném...
Köszönöm.
(#) superuser válasza spenyo hozzászólására (») Ápr 4, 2022 /
 
Leírtad a kérdést és a megoldást.
Igen, kapcsold 16 bites módba a timert, ha 16 bitesként szeretnéd használni.
Ha ezt nem teszed meg, akkor 8 bites módban működik.
(#) helektro válasza spenyo hozzászólására (») Ápr 4, 2022 /
 
A 8 bites PIC-ek timer-ének 16 bites mód haszálatakor a felső byte történő írása két részletben történik meg. A pdf 19.6 Timer1 16-Bit Read/Write Mode (és a Figure 19-3. Timer1 16-Bit Read/Write Mode Block Diagram ábra) leírja, ill. szemlélteti ezt. Az MSB ténylegesen csak akkor íródik be, ha utána az LSB-t is írod.
(#) Hp41C válasza helektro hozzászólására (») Ápr 4, 2022 /
 
16 bites módban a TMR1H regiszter bufferen keresztül érhető el. Ha a TMR1L regisztert olvassák, a timer belső TMR1H regiszterének értéke a bufferbe kerül, és innen olvasható ki a mentett érték. Ha a TMR1L regisztert írják a TMR1H buffer regiszterbe előkészített érték másolódik a belső regiszterbe.

8 bites módban mennie kellene a TMR1H direkt módosításának.
(#) spenyo hozzászólása Ápr 4, 2022 /
 
Bocsi,
akkor rosszul (vagy félreérthetően) írtam valamit.
Maga a regiszter mindíg 16bit-es csak az írás/olvasása történik 16, vagy 8 bites móban (!!?).
Sajna megnérztem a fordító álltal generált asembly file-t és a normál start utasítás (setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); 16bites módba indítja a számlálót.
Köszi az ötletet, megpróbálom a megkeresni a buffer regisztert és azt írni.
Köszönöm a segítséget... ha valami nem megy akkor jövök még egy fordulóra.
Köszönöm.
(#) Hp41C válasza Hp41C hozzászólására (») Ápr 4, 2022 /
 
Az olvasási - írási műveletekre értettem a 16 bites módot.
Következő: »»   151 / 152
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