Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   1170 / 1210
(#) KBal76 válasza Bakman hozzászólására (») Jan 16, 2022 /
 
Ez egy nagyon találékony megoldás!
A másik, talán kicsivel egyszerûbb megoldás, hogy eleve kapcsolót használunk (tehát nem push-buttont), megnyomjuk a szimuláció "pause" gombját, és átbillentyjük a két kapcsolót. Utána meg folytatjuk a szimulációt. A szimulált elektronika/program ezt egyszerre gombnyomásnak veszi. Majd ugyanezt visszafelé is eljátszani, esetleg töréspont a programban amikor beugrott a gombkezelésbe.
A hozzászólás módosítva: Jan 16, 2022
(#) zoltan48 hozzászólása Jan 17, 2022 /
 
Szép napot, segitséget szeretnék kérni mert valamiért nem sikerül felprogramozni a Pic10f200 mcu. Pickit3 próbálkozom de nem sikerül, képet tudok mutatni oscal hiba van
(#) Bakman válasza zoltan48 hozzászólására (») Jan 17, 2022 /
 
Tools menü -> OSCCAL -> Auto Regenerate
(#) zoltan48 válasza Bakman hozzászólására (») Jan 17, 2022 /
 
cCsak set manual van, és oda men nem tudom mit kell irni.
A hozzászólás módosítva: Jan 18, 2022
Moderátor által szerkesztve
(#) Laja1 hozzászólása Jan 17, 2022 /
 
Sziasztok! BeuÜzemeltem egy PicIC-cel vezérelt releÉkapcsolaÁst. Először egy hétig 3 db ceruzaelemmel muŰkoÖdtettem és hibátlanul működött. Most veÉglegesiÍtettem egy 230 V-os toÖltoŐvel, ami 6,12 V-t ad ki és utána kötöttem egy 7805 feszültség stabilizaÁtort. Szépen kijön beloŐle a stabil 4,97 V. De az történik, hogy néha hiba nélkül lefut a program, néha elindul jól és nem fejezi be rendesen. Ennek lehet az az oka, hogy a 7805-t csak simán bekötöttem (betaÁp, föld, kiment) és nem használtam kondenzaÁtort?
Köszönöm!
A hozzászólás módosítva: Jan 18, 2022
Moderátor által szerkesztve
(#) nedudgi válasza Laja1 hozzászólására (») Jan 17, 2022 /
 
Igen. A 7805 előtt, és után is kötelező a kondenzátor (adatlap!). A PIC táplábaira is kell 100nF.
A relé mellett van dióda?
A hozzászólás módosítva: Jan 17, 2022
(#) Kera_Will válasza Laja1 hozzászólására (») Jan 17, 2022 /
 
Bármilyen áramkor annyira megbízható mint maga a tápellátása!
Felejtős a
Idézet:
„egy 230 V-os toltovel, ami 6,12 V-t ad ki”
.
7805 fő jellemzője hogy legalább +3 Volttal több drop feszültséget kell neki adni.
Ha 78L05 low drop akkor esetleg lehetne 6 Volt.
Persze a stabilizátor maximális disszipációját figyelembe véve növelhető a bemeneti feszültség és az össz terhelő áram.
(#) Hp41C válasza Laja1 hozzászólására (») Jan 17, 2022 /
 
A 7805 -öt cseréld le egy Low Drop feszültség stabilizátorra. pl. LM2940-5.0, LF50CV, LM1084IT-5.0.
(#) Laja1 válasza Kera_Will hozzászólására (») Jan 17, 2022 /
 
Ez a tiÍpus van berakva: L7805CV. Ez jó lehet 6 V-ra? Vagy 8-9 V-os töltőt hasznaÁljak? (Pedig nagyon stabil kimenő feszt mérek) Tehetek a kimenő oldalra 100_nF , a betaÁp oldalra 333_nF kondikat? (Ezek vannak itthon.)
Közvetlen a PIC taÁplaÁbainaÁl van egy 100 nF kondi.
ReleÉ mellett van dioÓda.
A hozzászólás módosítva: Jan 18, 2022
Moderátor által szerkesztve
(#) Bakman válasza Laja1 hozzászólására (») Jan 17, 2022 /
 
A gyors és rövid ideig tartó feszültségingadozásokat legfeljebb oszcilloszkóppal lehet megfigyelni.

Intézd úgy, hogy a relé a stabilizátor előtti részről kapjon tápfeszültséget. A stabilizátor előtt legyen 470 - 1000 µF -nyi kondenzátor, a 7805-ös lábaihoz közel, ahogy írod is, 330 nF és 100 nF. A PIC táplábaihoz tegyél még egy 4.7 - 10 µF-os és egy 330 nF-os kondenzátort, segíteni fog. A sorrend a PIC táplábaitól a tápegység felé: 100 nF, 330 nF, 4.7 µF. Arra figyelj, hogy a 7805-ös kimenetére sok kondenzátort nem szabad rakni.

Ha lehet, használj 12 V-os tápegységet és 12 V-os relét.

Vagy.

Használj olyan 5 V-os tápegységet, ami bírja a kimenetén a nagy kondenzátort, azzal csillapítani lehet a relé okozta ingadozásokat és a 7805-ös sem fog kelleni.
(#) Laja1 válasza Bakman hozzászólására (») Jan 17, 2022 /
 
Köszönöm. Mivel már a NYÁKlap is készen van, minden beforrasztva, így azt hiszem visszatérek az elemhez és figyelem a merülését .
(#) Hp41C válasza zoltan48 hozzászólására (») Jan 18, 2022 / 1
 
A PIC10F200 program memóriájában a 0xFF címen az OSCAL kalibrációs érték található egy movlw utasításként. A kontroller törlésekor ez az érték is törlődik, ezért a törlés előtt ki kell olvasni, az új programba bele kell írni.

Ha már törlődött, csak kalibrációval lehet meghatározni az értékét. Azaz movlw 0x00 -val kezdve megmérni az oszcillátor frekvenciáját és az eredmény alapján az értéket növelni, ha a mért érték magas ill. csökkenteni (negatív érték), alacsony volt.

Ha a kód nem érzékeny a sebességre ill. külső oszcillátorral működtetjük a kontrollert, a kalibrációs érték nem érdekes.

Egy movlw utasítás kódja: 0xCxx, ahol az xx helyén a kalibréciós érték van hexadecimálisan.

A PICkit3 kezelő program elavult, sőt csak azért adták ki, mert a Microchip nem készült el időben a PICkit3 szoftverével. Lényegében egy PICkit2 -t csinál a PICkit3 -ból firmware cserével. Csak gond lesz belőle.
Az MpLab X -beli IPE programot jevesolt használni.
A hozzászólás módosítva: Jan 18, 2022
(#) Laja1 hozzászólása Jan 21, 2022 /
 
Sziasztok!

Tudnátok segíteni, hogy az LCD-re miért nem írja ki a "k" értékét? Szerintem az LCD iniciálásánál lehet a probléma az LCD_PORT-nál. Nem igazán értem, hogy ott mit kellene megadni.
Köszönöm!
  1. #include <xc.h>
  2. //#include <stdio.h>
  3. //#include <string.h>
  4. //#include <stdlib.h>
  5. //#define _XTAL_FREQ 4000000 ;
  6. #pragma config FOSC = INTOSCIO     // Oscillator ion bits (RC oscillator)
  7. #pragma config WDTE = OFF    // Watchdog Timer Enable bit (WDT disabled)
  8. #pragma config PWRTE = OFF   // Power-up Timer Enable bit (PWRT disabled)
  9. #pragma config BOREN = OFF   // Brown-out Reset Enable bit (BOR disabled)
  10. #pragma config CP = OFF      // Flash Program Memory Code Protection bit (Code protection off)
  11. #pragma config MCLRE = ON
  12. #pragma config LVP = OFF  
  13.  
  14.  
  15. #define bgomb  PORTBbits.RB2
  16. #define jobbgomb  PORTBbits.RB1
  17. #define oragomb  PORTAbits.RB0
  18. #define valtas  PORTAbits.RA7  
  19.  
  20.  
  21. #define __delay_ms(x) _delay((unsigned long)((x)*(4000000/4000.0)))
  22. // set up the timing for the LCD delays
  23. #define LCD_delay 5 // ~5mS
  24. #define LCD_Startup 15 // ~15mS
  25.  
  26. // Command set for Hitachi 44780U LCD display controller
  27. #define LCD_CLEAR 0x01  // It clears everythings
  28. #define LCD_HOME 0x02  // set the cursor to first line and first row
  29. #define LCD_CURSOR_BACK 0x10 // moves curson one position back
  30. #define LCD_CURSOR_FWD 0x14 //moves curson one position forward
  31. #define LCD_PAN_LEFT 0x18   // used to scroll text left side to scroll text
  32. #define LCD_PAN_RIGHT 0x1C  // used to scroll text right side to scroll text
  33. #define LCD_CURSOR_OFF 0x0C // stops display curson on screen
  34. #define LCD_CURSOR_ON 0x0E  // turns on cursor display
  35. #define LCD_CURSOR_BLINK 0x0F // curson keeps blinking
  36. #define LCD_CURSOR_LINE2 0xC0  // move curson to scond line or second row
  37.  
  38. // display controller setup commands  page 46 of Hitachi datasheet
  39. #define FUNCTION_SET 0x2C // 4 bit interface, 2 lines, 5x10 font
  40. #define ENTRY_MODE 0x06 // increment mode
  41. #define DISPLAY_SETUP 0x0C // display on, cursor off, blink offd
  42.  
  43. #define LCDLine1() LCDPutCmd(LCD_HOME) // legacy support
  44. #define LCDLine2() LCDPutCmd(LCD_CURSOR_LINE2) // legacy support
  45. #define shift_cursor() LCDPutCmd(LCD_CURSOR_FWD) // legacy support
  46. #define cursor_on() LCDPutCmd(LCD_CURSOR_ON) // legacy support
  47. #define DisplayClr() LCDPutCmd(LCD_CLEAR) // Legacy support
  48.  
  49.  
  50. //----------------------------------------------------------------------
  51. // Definitions specific to the PICDEM 2 Plus
  52. // These apply to the Black (2011) version.
  53. //----------------------------------------------------------------------
  54.  
  55. // single bit for ing command register or data register
  56. #define instr 0
  57. #define data 1
  58.  
  59. // These #defines create the pin connections to the LCD in case they are changed on a future demo board
  60. #define LCD_PORT PORTBbits.RB4, PORTBbits.RB5,PORTBbits.RB6,PORTBbits.RB7
  61. #define LCD_PWR 1 // LCD power pin
  62. #define LCD_EN PORTBbits.RB3 // LCD enable
  63. #define LCD_RW 0 // LCD read/write line
  64. #define LCD_RS PORTAbits.RA0 // LCD register  line
  65.  
  66. #define NB_LINES 2 // Number of display lines
  67. #define NB_COL 16 // Number of characters per line
  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. unsigned int k=0;
  77.  
  78.  
  79.  
  80. void LCD_Initialize()
  81. {
  82. // clear latches before enabling TRIS bits
  83. LCD_PORT = 0;
  84.  
  85. TRISB = 0b00000111;
  86.  
  87. // power up the LCD
  88. //LCD_PWR = 1;
  89.  
  90. // required by display controller to allow power to stabilize
  91. __delay_ms(LCD_Startup);
  92.  
  93. // required by display initialization
  94. LCDPutCmd(0x32);
  95.  
  96. // set interface size, # of lines and font
  97. LCDPutCmd(FUNCTION_SET);
  98.  
  99. // turn on display and sets up cursor
  100. LCDPutCmd(DISPLAY_SETUP);
  101.  
  102. DisplayClr();
  103.  
  104. // set cursor movement direction
  105. LCDPutCmd(ENTRY_MODE);
  106.  
  107. }
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114. void LCDWriteNibble(char ch, char rs)
  115. {
  116. // always send the upper nibble
  117. ch = (ch >> 4);
  118.  
  119. // mask off the nibble to be transmitted
  120. ch = (ch & 0x0F);
  121.  
  122. // clear the lower half of LCD_PORT
  123. LCD_PORT = (LCD_PORT & 0xF0);
  124.  
  125. // move the nibble onto LCD_PORT
  126. LCD_PORT = (LCD_PORT | ch);
  127.  
  128. // set data/instr bit to 0 = insructions; 1 = data
  129. LCD_RS = rs;
  130.  
  131. // RW - set write mode
  132. //LCD_RW = 0;
  133.  
  134. // set up enable before writing nibble
  135. LCD_EN = 1;
  136.  
  137. // turn off enable after write of nibble
  138. LCD_EN = 0;
  139. }
  140.  
  141. void LCDPutChar(char ch)
  142. {
  143. __delay_ms(LCD_delay);
  144.  
  145. //Send higher nibble first
  146. LCDWriteNibble(ch,data);
  147.  
  148. //get the lower nibble
  149. ch = (ch << 4);
  150.  
  151. // Now send the low nibble
  152. LCDWriteNibble(ch,data);
  153. }
  154.  
  155.  
  156. void LCDPutCmd(char ch)
  157. {
  158. __delay_ms(LCD_delay);
  159.  
  160. //Send the higher nibble
  161. LCDWriteNibble(ch,instr);
  162.  
  163. //get the lower nibble
  164. ch = (ch << 4);
  165.  
  166. __delay_ms(1);
  167.  
  168. //Now send the lower nibble
  169. LCDWriteNibble(ch,instr);
  170. }
  171.  
  172.  
  173. void LCDPutStr(const char *str)
  174. {
  175. char i=0;
  176.  
  177. // While string has not been fully traveresed
  178. while (str[i])
  179. {
  180. // Go display current char
  181. LCDPutChar(str[i++]);
  182. }
  183.  
  184. }
  185.  
  186. void LCDGoto(char pos,char ln)
  187. {
  188. // if incorrect line or column
  189. if ((ln > (NB_LINES-1)) || (pos > (NB_COL-1)))
  190. {
  191. // Just do nothing
  192. return;
  193. }
  194.  
  195. // LCD_Goto command
  196. LCDPutCmd((ln == 1) ? (0xC0 | pos) : (0x80 | pos));
  197.  
  198. // Wait for the LCD to finish
  199. __delay_ms(LCD_delay);
  200. }
  201.  
  202.  
  203.  
  204.     /**/
  205.     unsigned char t2cnt,mpflag,mpcount,villog, bnyomogomb, bgombold,flag,keycnt,r1cnt,r2cnt,time1=60, time2=30, s,ki, led, max;
  206.      
  207.     void  __interrupt() megszak (void)
  208.     {
  209.         if(PIR1bits.TMR2IF)
  210.         {
  211.             t2cnt++;
  212.             if(t2cnt==10){t2cnt=0;flag |=1;}// lejárt 0,1 sec frissülhet a f?progi
  213.             mpcount++ ;
  214.             if(mpcount==100){mpcount=0;mpflag = 1;} // lejárt az 1 sec        
  215.           PIR1bits.TMR2IF=0;
  216.         }
  217.     }
  218.    
  219.      
  220.     void main (void)
  221.     {
  222.      
  223.      
  224.    
  225.  
  226.  
  227.      
  228.       PCONbits.OSCF=1;  // a bels? oszc. 4 Mhz
  229.       OPTION_REG = 0x55; // Set TMR0 configuration and enable PORTB pullups    
  230.       INTCON = 0b11000000; // ' Enable global interrupts, Disables all peripheral interrupts, disable timer0 interrupt        
  231.       CMCON = 0x07 ;  // analóg komparátorok kikapcsolva, RA0-1 digitális port!
  232.       PORTB = 0b00000111;
  233.       TRISA = 0b10000000;  //  RA0, RA7 port bemenet, relé vagy LED
  234.       TRISB = 0b00000111; // RB2 és RB3 bemenet, a többi kimenet
  235.      
  236.       // timer2 beállítása
  237.       PR2=249;                  //timer2 250órajel után ujrakezdi a számolást
  238.       T2CON= 0b01001101 ;       //4 el?osztó  modul on 10 utóosztó
  239.       PIE1bits.TMR2IE=1;        // tmr2 irq enable
  240.      
  241.       LCD_Initialize();
  242.      
  243.       while(1)
  244.       {
  245.          
  246.           if(mpflag)
  247.            {
  248.                 villog =  ~villog ;   //LED villogtató
  249.                // led2 =  villog ;
  250.                 mpflag = 0   ;    
  251.            }
  252.          
  253.           if(flag)              // 0.1 sec lejárt f?program frissítése
  254.           {
  255.             flag=0;
  256.             bgombold = bgomb ;
  257.             bgomb = bnyomogomb ;
  258.            
  259.             if (bgomb == 0 & bgombold == 1)   //lenyomtuk a gombot, magasból alacsony szintre vált a bemenet
  260.             {
  261.                LCDGoto(3,1);
  262.                 LCDPutStr(" SLTisztaterter");
  263.                
  264.                
  265.             }
  266.            
  267.             if(bgomb == 0)     //ha még mindig nyomva
  268.             {
  269.                
  270.                  
  271.                 keycnt++;
  272.                 if(keycnt>5){led=1;  
  273.                 // rele2=1;
  274.                 r1cnt++ ; r2cnt++;}
  275.                         //0.5 secnél led on késleltetés frissítés felfüggesztve
  276.                    
  277.               if (keycnt > max)   //100x0.1 mp, azaz 10 mp az alap id?, ha ezt túllépjük, akkor növeljük a bekapcsolási id?t
  278.               {keycnt = max;
  279.                  
  280.              
  281.               led=0; }
  282.                  
  283.             }
  284.              
  285.              
  286.          
  287.             if (bgomb == 1 & bgombold == 0)   //elengedtük a gombot, alacsonyból magas szintre vált a bemenet    
  288.             {
  289.                
  290.                
  291.                 if(keycnt>5) //sokáig nyomva volt
  292.                 {
  293.                  
  294.                     k==0;
  295.                    
  296.                  
  297.                 }
  298.                 k++;
  299.                 LCDGoto(3,1);
  300.                 LCDPutStr(" SL Tisztaterte");
  301.                 if(k<10) LCDPutChar(k+0x30);
  302.                 else
  303.                     {LCDPutChar((k/10)+0x30);
  304.                     LCDPutChar((k%10)+0x30);
  305.                     }  
  306.            
  307.      
  308.            
  309.            
  310.          
  311.          
  312.            
  313.          
  314.                
  315.             }  
  316.          
  317.          
  318.       }
  319.      
  320.     }
  321.     }
(#) Hp41C válasza Laja1 hozzászólására (») Jan 22, 2022 /
 
Milyen típusra írtad? ANSEL / ANSELA / ANSELB és a TRISA beállítása hiányzik.
(#) Laja1 válasza Hp41C hozzászólására (») Jan 22, 2022 /
 
PIC16F627A-ra írtam. Szerintem az LCD Port-nál hibazhatok, de nem tudom, hogy mit kell ott irni. Maga a program még félkész, csak az LCD megjelenítés a kérdés még.
(#) Hp41C válasza Laja1 hozzászólására (») Jan 22, 2022 /
 
CMCON és a TRISA felprogramozását nem látom. A komparátor modul miatt az RA0 analóg módban marad.
Idézet:
„#define LCD_RS PORTAbits.RA0 // LCD register line”
(#) Laja1 válasza Hp41C hozzászólására (») Jan 22, 2022 /
 
A 231. sorban van a CMCON és a 233. sorban TRISA.
(#) Tasznka válasza Laja1 hozzászólására (») Jan 22, 2022 / 1
 
Szia!
  1. Az  LCD_PORT PORTBbits.RB4, PORTBbits.RB5,PORTBbits.RB6,PORTBbits.RB7


helyett ,vagyis ahol portra írsz oda inkább a LATxbits.xxx
  1. Az  LCD_PORT LATBbits.LATB4, LATBbits.LATB5,LATBbits.LATB6,LATTBbits.LATB7
(#) Laja1 válasza Tasznka hozzászólására (») Jan 22, 2022 /
 
Sajnos így le se fordul.
(#) Josi777 válasza Laja1 hozzászólására (») Jan 22, 2022 /
 
De mi a hibaüzenet? Csak nem 1-1-be másoltad le és benne hagytad a végén lévő szintaktikai hibát, ahol a LAT helyett véletlenül LATT van írva?
(#) Laja1 válasza Josi777 hozzászólására (») Jan 22, 2022 /
 
Nem oktondi módon másoltam.
Ezt írja:
  1. fatal error: too many errors emitted, stopping now [-ferror-limit=]
  2. 1 warning and 20 errors generated.
  3. (908) exit status = 1
  4. nbproject/Makefile-default.mk:107: recipe for target 'build/default/production/eredmeny.p1' failed
  5. make[2]: Leaving directory 'C:/Users/Lajos/MPLABXProjects'
  6. nbproject/Makefile-default.mk:91: recipe for target '.build-conf' failed
  7. make[1]: Leaving directory 'C:/Users/Lajos/MPLABXProjects'
  8. make[2]: *** [build/default/production/eredmeny.p1] Error 1
  9. make[1]: *** [.build-conf] Error 2
  10. make: *** [.build-impl] Error 2
  11. nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
  12.  
  13. BUILD FAILED (exit value 2, total time: 867ms)
A hozzászólás módosítva: Jan 22, 2022
(#) Hp41C válasza Tasznka hozzászólására (») Jan 22, 2022 /
 
PIC16F627 -en lincsenek LAT regiszterek.
(#) Hp41C válasza Laja1 hozzászólására (») Jan 23, 2022 /
 
Szia!

Ha a PORTA és PORTB beállítása megvan és működik a következőkkel lehet még probléma:
LCD_Initialize():
A HD44780 adatlapja szerint a tápfeszültség megérkezése után el kell telnie 15ms -nek.
Az első parancsot még 8 bitesen azaz E pulzussal kell küldeni és meg kell ismételni még kétszer ( az elő után min. 4.1 ms-et, a második után min. 100us -et kell várni). Ezek után mehet a 4 bites mód.
(#) Laja1 válasza Hp41C hozzászólására (») Jan 23, 2022 /
 
PIC16F877A-an fut ez a megoldás. Én csak a PORT-okat írtam át.
Most csináltam egy olyat, hogy a PORTA-n van az LCD, a gombok a PORTB-n. Mindent lecsupaszítottam, csak a Hello World-t kellene kiírnia, de már ezt se tudja. Nem tudom, mi lehet a baja.
  1. #include <xc.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. #pragma config FOSC = INTOSCIO     // Oscillator ion bits (RC oscillator)
  7. #pragma config WDTE = OFF    // Watchdog Timer Enable bit (WDT disabled)
  8. #pragma config PWRTE = OFF   // Power-up Timer Enable bit (PWRT disabled)
  9. #pragma config BOREN = OFF   // Brown-out Reset Enable bit (BOR disabled)
  10. #pragma config CP = OFF      // Flash Program Memory Code Protection bit (Code protection off)
  11. #pragma config MCLRE = ON
  12. #pragma config LVP = OFF  
  13.  
  14.  
  15. #define bgomb  PORTBbits.RB2
  16. #define jobbgomb  PORTBbits.RB1
  17. #define oragomb  PORTAbits.RB0
  18. #define valtas  PORTAbits.RA7  
  19.  
  20.  
  21. #define __delay_ms(x) _delay((unsigned long)((x)*(8000000/4000.0)))
  22. // set up the timing for the LCD delays
  23. #define LCD_delay 5 // ~5mS
  24. #define LCD_Startup 15 // ~15mS
  25.  
  26. // Command set for Hitachi 44780U LCD display controller
  27. #define LCD_CLEAR 0x01  // It clears everythings
  28. #define LCD_HOME 0x02  // set the cursor to first line and first row
  29. #define LCD_CURSOR_BACK 0x10 // moves curson one position back
  30. #define LCD_CURSOR_FWD 0x14 //moves curson one position forward
  31. #define LCD_PAN_LEFT 0x18   // used to scroll text left side to scroll text
  32. #define LCD_PAN_RIGHT 0x1C  // used to scroll text right side to scroll text
  33. #define LCD_CURSOR_OFF 0x0C // stops display curson on screen
  34. #define LCD_CURSOR_ON 0x0E  // turns on cursor display
  35. #define LCD_CURSOR_BLINK 0x0F // curson keeps blinking
  36. #define LCD_CURSOR_LINE2 0xC0  // move curson to scond line or second row
  37.  
  38. // display controller setup commands  page 46 of Hitachi datasheet
  39. #define FUNCTION_SET 0x2C // 4 bit interface, 2 lines, 5x10 font
  40. #define ENTRY_MODE 0x06 // increment mode
  41. #define DISPLAY_SETUP 0x0C // display on, cursor off, blink offd
  42.  
  43. #define LCDLine1() LCDPutCmd(LCD_HOME) // legacy support
  44. #define LCDLine2() LCDPutCmd(LCD_CURSOR_LINE2) // legacy support
  45. #define shift_cursor() LCDPutCmd(LCD_CURSOR_FWD) // legacy support
  46. #define cursor_on() LCDPutCmd(LCD_CURSOR_ON) // legacy support
  47. #define DisplayClr() LCDPutCmd(LCD_CLEAR) // Legacy support
  48.  
  49.  
  50.  
  51.  
  52. // single bit for ing command register or data register
  53. #define instr 0
  54. #define data 1
  55.  
  56. // These #defines create the pin connections to the LCD in case they are changed on a future demo board
  57. #define LCD_PORT PORTA
  58. #define LCD_PWR 1 // LCD power pin
  59. #define LCD_EN PORTAbits.RA6 // LCD enable
  60. #define LCD_RW 0 // LCD read/write line
  61. #define LCD_RS PORTAbits.RA4 // LCD register  line
  62. #define led PORTAbits.RA7
  63.  
  64. #define NB_LINES 2 // Number of display lines
  65. #define NB_COL 16 // Number of characters per line
  66.  
  67.    
  68. void LCD_Initialize(void);
  69. void LCDPutChar(char ch);
  70. void LCDPutCmd(char ch);
  71. void LCDPutStr(const char *);
  72. void LCDWriteNibble(char ch, char rs);
  73. void LCDGoto(char pos, char ln);
  74. unsigned int k=0;
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.     /**/
  82.     unsigned char t2cnt,mpflag,mpcount,villog, bnyomogomb, bgombold,flag,keycnt,r1cnt,r2cnt,time1=60, time2=30, s,ki,  max;
  83.      
  84.  
  85.      
  86.     void main (void)
  87.     {
  88.      
  89.      
  90.    
  91.  
  92.  
  93.      
  94.       PCONbits.OSCF=1;  // a bels? oszc. 4 Mhz
  95.      
  96.      
  97.      
  98.       OPTION_REG = 0x55; // Set TMR0 configuration and enable PORTB pullups    
  99.          
  100.       CMCON = 0x07 ;  // analóg komparátorok kikapcsolva, RA0-1 digitális port!
  101.       PORTB = 0b00000111;
  102.        PORTA = 0;
  103.       TRISA = 0b00000000;  //  RA0, RA7 port bemenet, relé vagy LED
  104.       TRISB = 0b00001111; // RB2 és RB3 bemenet, a többi kimenet
  105.      
  106.      
  107.        LCD_Initialize();
  108.       while(1)
  109.       {
  110.       LCDPutStr(" Hello World!");
  111.        __delay_ms(3000);
  112.          
  113.        
  114.      
  115.     }
  116.     }
  117.    
  118. void LCD_Initialize()
  119. {
  120. // clear latches before enabling TRIS bits
  121. LCD_PORT = 0;
  122.  
  123. TRISA = 0b00000000;
  124.  
  125. // power up the LCD
  126. //LCD_PWR = 1;
  127.  
  128. // required by display controller to allow power to stabilize
  129. __delay_ms(LCD_Startup);
  130.  
  131. // required by display initialization
  132. LCDPutCmd(0x32);
  133.  
  134. // set interface size, # of lines and font
  135. LCDPutCmd(FUNCTION_SET);
  136.  
  137. // turn on display and sets up cursor
  138. LCDPutCmd(DISPLAY_SETUP);
  139.  
  140. DisplayClr();
  141.  
  142. // set cursor movement direction
  143. LCDPutCmd(ENTRY_MODE);
  144.  
  145. }
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152. void LCDWriteNibble(char ch, char rs)
  153. {
  154. // always send the upper nibble
  155. ch = (ch >> 4);
  156.  
  157. // mask off the nibble to be transmitted
  158. ch = (ch & 0x0F);
  159.  
  160. // clear the lower half of LCD_PORT
  161. LCD_PORT = (LCD_PORT & 0xF0);
  162.  
  163. // move the nibble onto LCD_PORT
  164. LCD_PORT = (LCD_PORT | ch);
  165.  
  166. // set data/instr bit to 0 = insructions; 1 = data
  167. LCD_RS = rs;
  168.  
  169. // RW - set write mode
  170. //LCD_RW = 0;
  171.  
  172. // set up enable before writing nibble
  173. LCD_EN = 1;
  174.  
  175. // turn off enable after write of nibble
  176. LCD_EN = 0;
  177. }
  178.  
  179. void LCDPutChar(char ch)
  180. {
  181. __delay_ms(LCD_delay);
  182.  
  183. //Send higher nibble first
  184. LCDWriteNibble(ch,data);
  185.  
  186. //get the lower nibble
  187. ch = (ch << 4);
  188.  
  189. // Now send the low nibble
  190. LCDWriteNibble(ch,data);
  191. }
  192.  
  193.  
  194. void LCDPutCmd(char ch)
  195. {
  196. __delay_ms(LCD_delay);
  197.  
  198. //Send the higher nibble
  199. LCDWriteNibble(ch,instr);
  200.  
  201. //get the lower nibble
  202. ch = (ch << 4);
  203.  
  204. __delay_ms(1);
  205.  
  206. //Now send the lower nibble
  207. LCDWriteNibble(ch,instr);
  208. }
  209.  
  210.  
  211. void LCDPutStr(const char *str)
  212. {
  213. char i=0;
  214.  
  215. // While string has not been fully traveresed
  216. while (str[i])
  217. {
  218. // Go display current char
  219. LCDPutChar(str[i++]);
  220. }
  221.  
  222. }
  223.  
  224. void LCDGoto(char pos,char ln)
  225. {
  226. // if incorrect line or column
  227. if ((ln > (NB_LINES-1)) || (pos > (NB_COL-1)))
  228. {
  229. // Just do nothing
  230. return;
  231. }
  232.  
  233. // LCD_Goto command
  234. LCDPutCmd((ln == 1) ? (0xC0 | pos) : (0x80 | pos));
  235.  
  236. // Wait for the LCD to finish
  237. __delay_ms(LCD_delay);
  238. }
(#) Hp41C válasza Laja1 hozzászólására (») Jan 23, 2022 /
 
Ez a program is 4 bitesen kezeli az LCD már az első parancs kiadásakor is. Kellene egy
void LCDPutCmd8(char ch) eljárás, ami a felső nibblet írja ki, de csal egy E pulzust csinál. Ezt kellene meghívni háromszor, köztük az előírt időnék egy kicsit többet várva.
Bekapcsolás után és a program lefuttatása nélkül a kontrasztot tekergetve látszanak a teli karakterek az első sorban?
A hozzászólás módosítva: Jan 23, 2022
(#) Laja1 válasza Hp41C hozzászólására (») Jan 23, 2022 /
 
De miért lehet, hogy ez így működik a 877A PIC-cel?
(#) Bakman válasza Laja1 hozzászólására (») Jan 23, 2022 /
 
Ezt próbáld ki, hátha:
  1. // PIC16F627A Configuration Bit Settings
  2. #pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
  3. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  4. #pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
  5. #pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
  6. #pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
  7. #pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
  8. #pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
  9. #pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
  10.  
  11. #define _XTAL_FREQ (4000000)
  12.  
  13. #include <xc.h>
  14.  
  15.  
  16.  
  17. #define RS RA1
  18. #define EN RA0
  19. #define D4 RA7
  20. #define D5 RA6
  21. #define D6 RB7
  22. #define D7 RB6
  23. #define ROWCNT 2    //1, 2, 4
  24. #define COLCNT 16   //16, 20, 40
  25.  
  26. void lcd_rawsend(uint8_t in, uint8_t mask) {
  27.     uint8_t pt;
  28.  
  29.     RS = 0;
  30.     EN = 0;
  31.     D4 = 0;
  32.     D5 = 0;
  33.     D6 = 0;
  34.     D7 = 0;
  35.  
  36.     pt = ((in >> 4) & 0x0F);
  37.  
  38.     if (pt & 0x01) {
  39.         D4 = 1;
  40.     }
  41.     if (pt & 0x02) {
  42.         D5 = 1;
  43.     }
  44.     if (pt & 0x04) {
  45.         D6 = 1;
  46.     }
  47.     if (pt & 0x08) {
  48.         D7 = 1;
  49.     }
  50.     if (mask) {
  51.         RS = 1;
  52.     }
  53.     __delay_us(100);
  54.     EN = 1;
  55.     __delay_us(100);
  56.     EN = 0;
  57.     pt = (in & 0x0F);
  58.     __delay_us(100);
  59.     D4 = 0;
  60.     D5 = 0;
  61.     D6 = 0;
  62.     D7 = 0;
  63.     RS = 0;
  64.     EN = 0;
  65.  
  66.     if (pt & 0x01) {
  67.         D4 = 1;
  68.     }
  69.     if (pt & 0x02) {
  70.         D5 = 1;
  71.     }
  72.     if (pt & 0x04) {
  73.         D6 = 1;
  74.     }
  75.     if (pt & 0x08) {
  76.         D7 = 1;
  77.     }
  78.     if (mask) {
  79.         RS = 1;
  80.     }
  81.     __delay_us(100);
  82.     EN = 1;
  83.     __delay_us(100);
  84.     EN = 0;
  85.     __delay_us(100);
  86. }
  87.  
  88. void lcd_clear(void) {
  89.     lcd_rawsend(0x01, 0); //display clear
  90.     __delay_ms(2);
  91.     lcd_rawsend(0x02, 0); //cursor to 0;0
  92.     __delay_ms(2);
  93. }
  94.  
  95. void lcd_start(void) {
  96.     D4 = 0;
  97.     D5 = 0;
  98.     D6 = 0;
  99.     D7 = 0;
  100.     RS = 0;
  101.     EN = 0;
  102.     __delay_ms(12);
  103.     lcd_rawsend(0x33, 0);
  104.     __delay_ms(2);
  105.     lcd_rawsend(0x33, 0);
  106.     __delay_ms(2);
  107.     lcd_rawsend(0x33, 0);
  108.     __delay_ms(2);
  109.     lcd_rawsend(0x2C, 0);
  110.     __delay_ms(2);
  111.     lcd_rawsend(0x06, 0);
  112.     __delay_ms(2);
  113.     lcd_rawsend(0x0C, 0);
  114.     __delay_ms(2);
  115.  
  116.     lcd_clear();
  117. }
  118.  
  119. void lcd_printascii(uint8_t character) {
  120.     lcd_rawsend(character, 0x10);
  121. }
  122.  
  123. void lcd_command(uint8_t in) {
  124.     lcd_rawsend(in, 0);
  125.     __delay_ms(2);
  126. }
  127.  
  128. void lcd_cursor(uint8_t x, uint8_t y) {
  129. #if (ROWCNT == 1)
  130.     y = 0x80;
  131. #endif
  132.  
  133. #if (ROWCNT == 2)
  134.     if (y == 0) {
  135.         y = 0x80;
  136.     } else {
  137.         y = 0xC0;
  138.     }
  139. #endif
  140.  
  141. #if (ROWCNT == 4)
  142.     if (y == 0) {
  143.         y = 0x80;
  144.     } else if (y == 1) {
  145.         y = 0xC0;
  146.     }
  147. #if (COLCNT == 16)
  148.     else if (y == 2) {
  149.         y = 0x90;
  150.     } else {
  151.         y = 0xD0;
  152.     }
  153. #endif
  154.  
  155. #if (COLCNT == 20)
  156. else if (y == 2) {
  157.         y = 0x94;
  158.     } else {
  159.         y = 0xD4;
  160.     }
  161. #endif
  162. #endif
  163.  
  164.     lcd_rawsend(y + x, 0);
  165.     __delay_ms(2);
  166. }
  167.  
  168. void lcd_printnumber(int16_t number) {
  169.     signed int tmp_int;
  170.     uint8_t tmp_byte;
  171.  
  172.     if (number < 0) {
  173.         lcd_rawsend('-', 0x10);
  174.         number = 0 - number;
  175.     }
  176.  
  177.     tmp_int = number;
  178.     if (number >= 10000) {
  179.         tmp_byte = tmp_int / 10000;
  180.         lcd_rawsend('0' + tmp_byte, 0x10);
  181.  
  182.         while (tmp_byte > 0) {
  183.             tmp_int = tmp_int - 10000;
  184.             tmp_byte--;
  185.         }
  186.     }
  187.     if (number >= 1000) {
  188.         tmp_byte = tmp_int / 1000;
  189.         lcd_rawsend('0' + tmp_byte, 0x10);
  190.  
  191.         while (tmp_byte > 0) {
  192.             tmp_int = tmp_int - 1000;
  193.             tmp_byte--;
  194.         }
  195.     }
  196.     if (number >= 100) {
  197.         tmp_byte = tmp_int / 100;
  198.         lcd_rawsend('0' + tmp_byte, 0x10);
  199.  
  200.         while (tmp_byte > 0) {
  201.             tmp_int = tmp_int - 100;
  202.             tmp_byte--;
  203.         }
  204.     }
  205.     if (number >= 10) {
  206.         tmp_byte = tmp_int / 10;
  207.         lcd_rawsend('0' + tmp_byte, 0x10);
  208.  
  209.         while (tmp_byte > 0) {
  210.             tmp_int = tmp_int - 10;
  211.             tmp_byte--;
  212.         }
  213.     }
  214.     lcd_rawsend('0' + tmp_int, 0x10);
  215. }
  216.  
  217. void lcd_printstring(char * str) {
  218.     uint8_t idx = 0;
  219.  
  220.     for (idx = 0; str[idx] != 0; idx++) {
  221.         lcd_rawsend(str[idx], 0x10);
  222.     }
  223. }
  224.  
  225. void lcd_clearline(uint8_t line) {
  226.     uint8_t count;
  227.     uint8_t rowcount;
  228.  
  229. #if (ROWCNT == 1)
  230.     rowcount = 80;
  231. #endif
  232.  
  233. #if (ROWCNT == 2)
  234.     rowcount = 40;
  235. #endif
  236.  
  237. #if (ROWCNT == 4)
  238. #if (COLCNT == 16)
  239.     rowcount = 16;
  240. #endif
  241. #if (COLCNT == 20)
  242.     rowcount = 20;
  243. #endif
  244. #endif
  245.  
  246.     lcd_cursor(0, line);
  247.  
  248.     for (count = 0; count < rowcount; count++)
  249.         lcd_rawsend(' ', 0x10);
  250.  
  251.     lcd_cursor(0, line);
  252. }
  253.  
  254. void lcd_ramwrite(uint8_t nIdx, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) {
  255.     lcd_rawsend(64 + (nIdx << 3), 0);
  256.     __delay_ms(2);
  257.  
  258.     lcd_rawsend(d0, 0x10);
  259.     lcd_rawsend(d1, 0x10);
  260.     lcd_rawsend(d2, 0x10);
  261.     lcd_rawsend(d3, 0x10);
  262.     lcd_rawsend(d4, 0x10);
  263.     lcd_rawsend(d5, 0x10);
  264.     lcd_rawsend(d6, 0x10);
  265.     lcd_rawsend(d7, 0x10);
  266.  
  267.     lcd_clear();
  268. }
  269.  
  270. void main(void) {
  271.  
  272.     CMCON = 0x07; // analóg komparátorok kikapcsolva
  273.  
  274.  
  275.     TRISA = 0b00111100;
  276.     TRISB = 0b00111111;
  277.  
  278.     lcd_start();
  279.     lcd_printstring("Hello!");
  280.  
  281.  
  282.     while (1) {
  283.  
  284.  
  285.  
  286.     }
  287. }
(#) Laja1 válasza Bakman hozzászólására (») Jan 23, 2022 /
 
Köszönöm szépen, hogy ezt megirtad. Holnap kipróbálom. Nem sokat értek belőle. Ha számot akarok kiíratni, akkor azt ezzel tegyem:lcd_printnumber(int16_t number) ?
(#) Bakman válasza Laja1 hozzászólására (») Jan 24, 2022 /
 
Igen. -32768 - 32767 között működik, kurzor adott pozíciójánál kezdi. Pl.:
lcd_printnumber(-243);
(#) Laja1 válasza Bakman hozzászólására (») Jan 24, 2022 /
 
Köszönöm nagyon hasznos volt! Összehasonlítottam az én programommal, sok minden érthetővé vált és rájöttem a hibára. Az RS az RA4 tűn volt, ami nem tud magasba kapcsolni. Áttettem az RA7-re és működik!
Köszönöm még egyszer!
Következő: »»   1170 / 1210
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