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   1086 / 1210
(#) szolen válasza superuser hozzászólására (») Máj 11, 2019 /
 
Sajnos én is így módosítottam a programot hogy működjön,csak nem értem. A hardware blokséma ugyanezt valósítja meg, akkor csak akkor hívódik meg az interrupt rutin, ha a két feltétel fennáll amit felírtál. Akkor az interrupt rutinban miért nem elég csak a GPIF-et vizsgálni? És miért van az ha az interrupt rutinban a GPIE=0 ra állítom az IOC továbbra is kiváltja a megszakítást, a PGIF et beállítja egyre és valóban csak a kettő együttes vizsgálatval tudom eldönetni hogy a GPIO ról jött e a megszaktás. De letiltott GPIE nél mi váltja ki a megszakítás, mert e rutin végrehajtódik?
(#) Hp41C válasza szolen hozzászólására (») Máj 11, 2019 /
 
Idézet:
„És miért van az ha az interrupt rutinban a GPIE=0 ra állítom az IOC továbbra is kiváltja a megszakítást, a PGIF et beállítja egyre és valóban csak a kettő együttes vizsgálatával tudom eldönteni hogy a GPIO ról jött e a megszakítás.”

Egy másik engedélyezett megszakítás kérés miatt kerül a vezérlés a megszakítási rutinra.
(#) szolen válasza superuser hozzászólására (») Máj 11, 2019 /
 
A timer0 nál is csak T0IF-et szoktam vizsgálni hiszen a hardwer nem váltja ki a megszakítás amíg a T0IE && T0IF együtt nem igaz.
(#) szolen válasza Hp41C hozzászólására (») Máj 11, 2019 /
 
Több szem többet lát:
void pic_beallitas(void)
{
CMCON= 0b00000111;
TRISIO = 0b00011001;
ANSEL = 0b00010001;
ADCON0 = 0b10000001;
OPTION_REG = 0b11000101;
IOC = 0b00001000;

UZEMLED=0;
VILAGITAS_KAPCSOLO=0;
TMR0=0;
T0IF=0;
T0IE=1;
GPIF=0;
GPIE=1;
}
Ezzel indítom a picet, a cél két megszakítás volt timer0 és GP3
(#) Hp41C válasza szolen hozzászólására (») Máj 11, 2019 / 1
 
Ha a Timer0 megszakítás engedélyezett, akkor amikor a T0IF 1 -re vált, a vezérlés a megszakítási rutinra kerül. Ha ott csak a GPIF -et vizsgálja a kód, a GPIO megszakítás kiszolgálása ekkor lefut annak ellenére, hogy a GPIE nem engedélyezi. Ezért kell vizsgálni, hogy a GPIE engedélyezi-e a megszakítás kérését.
(#) szolen válasza szolen hozzászólására (») Máj 11, 2019 /
 
Megértettem. Én rontottam el. A timer0 miatt sokszor hívódik a rutin és hiába kapcsoltam ki a GPIE, a timer0 által kiváltott megszakítás nál csak a GPIF-et figyeltem az meg kiváltódik a GPIE-től függetlenül. Ez megoldódott. Köszönöm. Viszont amit végkép nem értek: A GPIF=1 re váltott és utánna egy sorral egy feltételben ellenőrizve mindíg ugyanazt az értéket olvastam be a lábról. Ha a GPIF ellenőrzése és az utánna lévő jel vizsgálata közé tettem egy 100ms os szünetet, akkor már helyes adatot hozott be. itől lehet ez?
if (GPIF)
{
__delay_ms(100);
if (AJTO_ERZEKELO)//ajtó nyit
{
beep(100,100);
nyitas_idozito=0;

}
else //ajtó bezárt
(#) lastewer hozzászólása Máj 15, 2019 /
 
Sziasztok!

UART-on lehet olvasni egy pic lábának állapotát? (Magas vagy alacsony értéken van?)
(#) pipi válasza lastewer hozzászólására (») Máj 15, 2019 /
 
Nem, a portláb vagy i/o módban van, akkor tudod olvasni, vagy UART módban.
(#) usane válasza lastewer hozzászólására (») Máj 15, 2019 / 1
 
Alapból nem, de ki lehet trükközni, ha írsz hozzá egy rutint, ami adott UART parancs beérkezésekor lekérdezi és azt visszaküldi.
(#) lastewer válasza usane hozzászólására (») Máj 15, 2019 /
 
Ez kellene nekem , ehhez van valami example kód?
(#) superuser válasza lastewer hozzászólására (») Máj 15, 2019 /
 
Keress UART kezelő rutinokat, próbáld ki őket, utána tedd fel az esetleges további kérdéseket.
Egyébként meg nem írtad le a PIC típusát és azt, hogy milyen környezetben szeretnéd programozni, pl. MPASM vagy XC8 compiler, vagy bármi más amit használni szeretnél.
(#) lastewer válasza superuser hozzászólására (») Máj 15, 2019 /
 
Igazából kerestem már erre, de nem találtam olyat, amit tudok használni belőle.

A PIC egy 16f628A és mikroC-ben programozom.

Az uart kezelő részt már megírtam, csak a port láb állapotának a lekérdezését nem tudom.

RB7-6-5 lábak állapotát akarom lekérdezni és nem a serial lábakét.
A hozzászólás módosítva: Máj 15, 2019
(#) pipi válasza lastewer hozzászólására (») Máj 15, 2019 / 1
 
Nem világos, mit is szeretnél? Ha beolvasod a PORTB-t benne vannak a lábak állapotai...
(#) lastewer válasza pipi hozzászólására (») Máj 15, 2019 /
 
UART-on szeretném átküldeni az RB6 - os láb állapotát.
(#) superuser válasza lastewer hozzászólására (») Máj 15, 2019 / 1
 
Az vmi. ilyesmi lesz, (bár mikroC-t sosem használtam)

  1. if (PORTB.RB6 == 0)
  2. {
  3. PutStringUSART("RB6=0");
  4. }
  5. else
  6. {
  7. PutStringUSART("RB6=1");
  8. }


Vagy mi a kérdés??
A hozzászólás módosítva: Máj 15, 2019
(#) lastewer válasza superuser hozzászólására (») Máj 15, 2019 /
 
Ehh, erre nem is gondoltam Köszi , így már megvan . Ez volt. Csak túlbonyolítottam.
A hozzászólás módosítva: Máj 15, 2019
(#) Hp41C válasza lastewer hozzászólására (») Máj 15, 2019 / 1
 
Kell-e hogy az átvitel olvasható (human readable) legyen?
Ha nem:
PutCharUSART(PORTB & 0xE0); // A PORTB 7,6,5 bitjeit tartalmazó adat megy át: Az adat felső 3 bitje (balról) az RB7, RB6, RB5 értékének felel meg.
Ha kell:
PutCharUSART(((PORTB >> 5) & 0x07)+ 0x30); // A PORTB 7,6,5 bitjeit tartalmazó adat megy át, a nyolc állapotbak megfelelően a "0" .. "7" karakter kódja.
(#) lastewer válasza Hp41C hozzászólására (») Máj 15, 2019 /
 
Köszönöm.
(#) szucsistvan123 hozzászólása Máj 17, 2019 /
 
Üdv!

Egy HD44780 kijelzőhöz írok programot, a PIC 3,3V-rol üzemel, az LCD pedig 5V-rol.
Ha a kijelzőn vizsgálni akatom a foglaltságot (D7) akkor 5V-os jelszintet fog kiadni az LCD?
Adatlapban nem találtam meg a választ.
Köszi!
(#) szucsistvan123 válasza szucsistvan123 hozzászólására (») Máj 17, 2019 /
 
Lenne még egy kérdésem:
Ha a D0-D7 kimenetnek van állítva, akkor az irány átállítása nélkül a PORTXbits.RXy -al ki tudom olvasni vagy ez így nem működik?
(#) Tasznka válasza szucsistvan123 hozzászólására (») Máj 17, 2019 / 1
 
Igen,5V -ot küld vissza,de van jó pár megoldás,hogy ne legyen gond. A legegyszerűbb,hogy megnézed,hogy melyik láb 5V toleráns,és azokra kötöd .A másik lehetőség,hogy nem használod a busy-t ,hanem késleltetett rutinnal vezéreled.(ha jól írod meg,akkor is eléggé gyors lesz).És még van jó pár lehetőség .
A hozzászólás módosítva: Máj 17, 2019
(#) szucsistvan123 válasza Tasznka hozzászólására (») Máj 17, 2019 /
 
Köszi a választ!
Marad az 5V toleráns láb akkor!
(#) Tasznka válasza szucsistvan123 hozzászólására (») Máj 17, 2019 / 1
 
Ha kimenetnek van állítva,akkor összetűzésbe fog kerülni az lcd-vel,és valamelyik beadja a kulcsot
(#) szucsistvan123 válasza Tasznka hozzászólására (») Máj 17, 2019 /
 
Értem, akkor jol gondoltam!
Köszi!
(#) Tasznka válasza szucsistvan123 hozzászólására (») Máj 17, 2019 / 1
 
Jobban járnál szerintem,a sima késleltetéssel(1-2db Nop).Nálam 128*64-es oled megy,minden gond nélkül.
A figyelés a tft-k felbontásánál számít nagyon,bár ott már használatos a PMP(bár ez 1 picit más).
(#) szucsistvan123 válasza Tasznka hozzászólására (») Máj 17, 2019 /
 
Na megírtam késleltetéssel, csak valami gond van a programmal!
nem ír ki egy karaktert sem! a felső soron látszik hogy teljesen ki van töltve, ha tekerem a kontrasztállítót. Pedig követtem az adatlap leírását, meg a PIC-kwik-es oldal leírását is.
  1. /*HD44780 2x16 LCD 8bit v0.2*/
  2.  
  3. #include <xc.h>
  4. #define FCY 4000000UL
  5. #include <libpic30.h>
  6. #include <stdint.h>
  7.  
  8. #define D0 (LATBbits.LATB8)
  9. #define D1 (LATBbits.LATB9)
  10. #define D2 (LATBbits.LATB10)
  11. #define D3 (LATBbits.LATB11)
  12. #define D4 (LATBbits.LATB12)
  13. #define D5 (LATBbits.LATB13)
  14. #define D6 (LATBbits.LATB14)
  15. #define D7 (LATBbits.LATB15)
  16.  
  17. #define E (LATBbits.LATB7)
  18. #define RS (LATBbits.LATB6)
  19.  
  20. #define E_High() (E = 1)
  21. #define E_Low() (E = 0)
  22.  
  23. #define RS_High() (RS = 1)
  24. #define RS_Low() (RS = 0)
  25.  
  26.  
  27.  
  28. void E_Pulse();                     //E pulzálás
  29. void Init_LCD(uint8_t u8_Init_LCD); //LCD inicializálás
  30. void Display_Controll(uint8_t u8_Disp_Cmd);
  31. void Clear_Display();
  32. void Return_Home();
  33. void Entry_mode_set(uint8_t u8_Ent_Cmd);
  34. void Cursor_or_Disp_Shift(uint8_t u8_CDS_Cmd);
  35. void LCD_Print(uint8_t u8_Data);
  36. void Pos_Setting_DDRAM(unsigned char uc_x, unsigned char uc_y); //x - sor , y - oszlop
  37.  
  38.  
  39. int main() {
  40.    
  41.     SYSTEM_Initialize();
  42.    
  43.    
  44.     Init_LCD(0x02);
  45.     Display_Controll(0x04);
  46.     Entry_mode_set(0x02);
  47.     Return_Home();
  48.     LCD_Print(0x48); //01001000
  49.    
  50.  
  51.     return 0;
  52. }
  53.  
  54.  
  55. Pos_Setting_DDRAM(unsigned char uc_x, unsigned char uc_y) {
  56.    
  57.     __delay_us(50);
  58.     uint8_t u8_pos = (uc_x*0x40)+uc_y;
  59.    
  60.     RS_Low();
  61.     D7 = (u8_pos >> 7) & 0x01;
  62.     D6 = (u8_pos >> 6) & 0x01;
  63.     D5 = (u8_pos >> 5) & 0x01;
  64.     D4 = (u8_pos >> 4) & 0x01;
  65.     D3 = (u8_pos >> 3) & 0x01;
  66.     D2 = (u8_pos >> 2) & 0x01;
  67.     D1 = (u8_pos >> 1) & 0x01;
  68.     D0 = u8_pos & 0x01;
  69.     E_Pulse();
  70.    
  71. }
  72.  
  73. void LCD_Print(uint8_t u8_Data) { //D7....D0  
  74.    
  75.     __delay_us(50);
  76.     RS_High();
  77.     D7 = (u8_Data >> 7) & 0x01;
  78.     D6 = (u8_Data >> 6) & 0x01;
  79.     D5 = (u8_Data >> 5) & 0x01;
  80.     D4 = (u8_Data >> 4) & 0x01;
  81.     D3 = (u8_Data >> 3) & 0x01;
  82.     D2 = (u8_Data >> 2) & 0x01;
  83.     D1 = (u8_Data >> 1) & 0x01;
  84.     D0 = u8_Data & 0x01;
  85.     E_Pulse();
  86.    
  87. }
  88.  
  89. void Init_LCD(uint8_t u8_Init_LCD) {  // 000000NF
  90.     __delay_ms(20);
  91.     RS_Low();
  92.     D7 = 0;
  93.     D6 = 0;
  94.     D5 = 1;
  95.     D4 = 1; //DL = 1 -> 8 bites uzemmod
  96.     E_Pulse();
  97.     __delay_ms(5);
  98.     E_Pulse();
  99.     __delay_us(100);
  100.     E_Pulse();
  101.     __delay_us(100);
  102.     D3 = (u8_Init_LCD >> 1) & 0x01; //N erteket veszi fel
  103.     D2 = u8_Init_LCD & 0x01; //F felveszi a beallitott erteket
  104.     Display_Controll(0x00); //LCD off
  105.     Clear_Display();
  106.     Display_Controll(0x04); //LCD on
  107.  
  108. }
  109.  
  110. void Cursor_or_Disp_Shift(uint8_t u8_CDS_Cmd) {  //000000 S/C R/L
  111.    
  112.     __delay_us(50);
  113.     RS_Low();
  114.     D7 = 0;
  115.     D6 = 0;
  116.     D5 = 0;
  117.     D4 = 1;
  118.     D3 = (u8_CDS_Cmd >> 1) & 0x01; //felveszi az S/C ereket
  119.     D2 = u8_CDS_Cmd & 0x01; //felveszi az R/L erteket
  120.     E_Pulse();
  121.    
  122. }
  123.  
  124. void Entry_mode_set(uint8_t u8_Ent_Cmd) { //000000 I/D S
  125.    
  126.     __delay_us(50);
  127.     RS_Low();
  128.     D7 = 0;
  129.     D6 = 0;
  130.     D5 = 0;
  131.     D4 = 0;
  132.     D3 = 0;
  133.     D2 = 1,
  134.     D1 = (u8_Ent_Cmd >> 1) & 0x01; //felveszi az I/D erteket
  135.     D0 = u8_Ent_Cmd & 0x01; //felveszi az S erteket
  136.     E_Pulse();
  137.    
  138. }
  139.  
  140. void Return_Home() {
  141.    
  142.     __delay_us(50);
  143.     RS_Low();
  144.     D7 = 0;
  145.     D6 = 0;
  146.     D5 = 0;
  147.     D4 = 0;
  148.     D3 = 0;
  149.     D2 = 0;
  150.     D1 = 1;  
  151.     E_Pulse();
  152.    
  153. }
  154.  
  155. void Clear_Display() {
  156.    
  157.     __delay_us(50);
  158.     RS_Low();
  159.     D7 = 0;
  160.     D6 = 0;
  161.     D5 = 0;
  162.     D4 = 0;
  163.     D3 = 0;
  164.     D2 = 0;
  165.     D1 = 0;
  166.     D0 = 1;
  167.     E_Pulse();
  168.    
  169. }
  170.  
  171. void Display_Controll(uint8_t u8_Disp_Cmd) { //00000DCB
  172.    
  173.     __delay_us(50);
  174.     RS_Low();
  175.     D7 = 0;
  176.     D6 = 0;
  177.     D5 = 0;
  178.     D4 = 0;
  179.     D3 = 1;
  180.     D2 = (u8_Disp_Cmd >> 2) & 0x01; //felveszi a D erteket
  181.     D1 = (u8_Disp_Cmd >> 1) & 0x01; //felveszi a C erteket
  182.     D0 = u8_Disp_Cmd & 0x01; //felveszi a B erteker
  183.     E_Pulse();
  184.    
  185. }
  186.  
  187. void E_Pulse() {
  188.    
  189.     __delay_us(1);
  190.     E_High();
  191.     __delay_us(1);
  192.     E_Low();
  193.     __delay_us(1);
  194.  
  195. }
  196.  
  197. /*
  198.     *http://fab.cba.mit.edu/classes/863.06/11.13/44780.pdf
  199.  45. oldal, init menete
  200.  */
  201. /*
  202. 1. Display clear
  203. 2. Function set:
  204. DL = 1; 8-bit interface data
  205. N = 0; 1-line display
  206. F = 0; 5 × 8 dot character font
  207. 3. Display on/off control:
  208. D = 0; Display off
  209. C = 0; Cursor off
  210. B = 0; Blinking off
  211. 4. Entry mode set:
  212. I/D = 1; Increment by 1
  213. S = 0; No shift*/
  214.  
  215. /*
  216. I/D = 1: Increment
  217. I/D = 0: Decrement
  218. S = 1: Accompanies display shift
  219. S/C = 1: Display shift
  220. S/C = 0: Cursor move
  221. R/L = 1: Shift to the right
  222. R/L = 0: Shift to the left
  223. DL = 1: 8 bits, DL = 0: 4 bits
  224. N = 1: 2 lines, N = 0: 1 line
  225. F = 1: 5 × 10 dots, F = 0: 5 × 8 dots
  226. BF = 1: Internally operating
  227. BF = 0: Instructions acceptable
  228.  */
  229. /*28.o*/
(#) icserny válasza szucsistvan123 hozzászólására (») Máj 17, 2019 / 1
 
A 103. sor után kimaradt egy E_Pulse(), így nem történik meg a 0x38 parancs kiküldése: adatút-szélesség (DL), sorok száma (N) és fontméret (F) beállítása.
(#) szucsistvan123 válasza szucsistvan123 hozzászólására (») Máj 17, 2019 /
 
Odáig eljutottam, hogy ha a mainen belül a függvényeket beteszem egy while ciklusba akkor kiíratja, de összefolynak a betűk. Az LCD-nek nem kellene megtartaniaa a karaktereket, ha beleírtam egy memóriacímre? Vagy folyamatosan frissíteni kell?
(#) icserny válasza szucsistvan123 hozzászólására (») Máj 17, 2019 / 1
 
A main() függvényben a return 0 helyett egy while(1); ciklus kellene.
A HD44780 LCD kijelzőt nem kell frissíteni, ha egyszer beírtál valamit, akkor kikapcsolásig (vagy felülírásig) mutatja.
(#) Tasznka válasza szucsistvan123 hozzászólására (») Máj 18, 2019 / 1
 
Ha csak 1 while-be raktad,akkor folyamatosan meghívja,így olyan,mintha folyamatosan változna,felülírná. Icserny -nél elég jól le van írva,hogy mi-mi.
Következő: »»   1086 / 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