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 / 151
(#) 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
Következő: »»   151 / 151
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