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   1212 / 1225
(#) glaci válasza majkimester hozzászólására (») Márc 13, 2025 /
 
Szia! Ezt hol tudom állítani?
(#) majkimester válasza glaci hozzászólására (») Márc 13, 2025 /
 
Fordítótól függően, például a config macroval:
  1. __CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & BOREN_OFF);

vagy pragma-val:
  1. #pragma config FOSC = INTOSCIO
(#) glaci válasza majkimester hozzászólására (») Márc 13, 2025 /
 
Microc-ben programozok. Abban a macro ugye jó?
(#) majkimester válasza glaci hozzászólására (») Márc 13, 2025 /
 
Ott nem tudom mi van, a fentiek xc8-ban használhatóak.
(#) wincso válasza glaci hozzászólására (») Márc 13, 2025 /
 
A microc Ben az osszcilátort a projekt tulajdonságoknál modosítható ,bvalamint az osscon és osctune byteok helyes beállításával.
(#) Lali67 hozzászólása Márc 14, 2025 /
 

GY21 cím kiolvasás

Nagyon régen programoztam PicbasicPro-ba és most kellene egy páratartalom mérő amihez GY21-et választottam de nem tudok még címet sem kiolvasni, 20Mhz -en 16f877-t használok. Mit csinálok rosszul? Valaki tudna segíteni?
DEFINE OSC 20
DEFINE I2C_SLOW 1

SDA VAR PORTB.4
SCL VAR PORTB.0
TRISB.4 = 1
TRISB.0 = 1
OPTION_REG.7 = 0

address VAR BYTE
ack VAR BYTE
found VAR BYTE

LCDOUT $FE, 1, "I2C kereses..."
PAUSE 1000

found = 0

FOR address = $08 TO $7F '
I2CWRITE SDA, SCL, address, 0, ack
IF ack = 0 THEN
found = 1
LCDOUT $FE, $C0, "Cim: ", HEX2 address
PAUSE 2000
ENDIF
NEXT address

IF found = 0 THEN
LCDOUT $FE, $C0, "Nincs eszkoz!"
ENDIF

END
(#) KoblogPerGyok válasza Lali67 hozzászólására (») Márc 18, 2025 /
 
Szia!

Ehhez a programhoz nem értek, de nem világos minden nekem. Van logikai analizátorod? Az sokat segít ilyen esetben.

De ha a PIC a master, és az adja ki az órajelet is, akkor annak a lábnak nem digitális kimenetnek kell lennie? Mert mintha most input lenne.

IGEN, tévedtem, azok jók, bocsánat!

De persze tévedhetek is, mert itt van ez:
I2CWRITE
Lehet ez a függvény beállít mindent, bár nem tudom hogy ebben a környezetben ez a lib hogy van meghívva.
Illetve nem tudom, hogy minden regisztert beállít-e ez a függvény vagy sem.

Nem lehetne C-ben? Mplab X-el megoldani a problémát?
A hozzászólás módosítva: Márc 18, 2025
(#) KoblogPerGyok válasza Lali67 hozzászólására (») Márc 18, 2025 /
 
Mert elvileg itt egy jó leírása az egésznek, amiben kódok is vannak. A .h fájlokat meg kell csinálni és utána include-al berántani. A keresést meg ciklusba tenni.

Bővebben: Link
(#) Máté Tibor Zoltán hozzászólása Márc 20, 2025 /
 

PIC16F877A

Sziasztok!
Most kezdek PIC-el foglalkozni, de már is elakadtam. Lehet-e a PIC16F877A PIC EEPROM memoriáját előre beprogramozni karaktergenerátornak és, ha igen hogyan? Egy rövid leírás és egy program jól jönne! Köszönettel.
(#) Pali79 válasza Máté Tibor Zoltán hozzászólására (») Márc 20, 2025 /
 
Szia!
Először is milyen nyelven írod a programot?
Másodszor pedig, ha most kezdesz el a PIC programozással foglalkozni, szvsz nem pont az eeprom kezeléssel kellene kezdeni.
(#) Máté Tibor Zoltán válasza Pali79 hozzászólására (») Márc 20, 2025 /
 
Ha nem tudom megoldani a karaktergenerátort nem is érdemes foglalkozni, hogy mely nyelven írom a programot! Amúgy minden tanácsot, segítséget örömmel fogadok.
(#) Bakman válasza Máté Tibor Zoltán hozzászólására (») Márc 20, 2025 / 1
 
Idézet:
„nem is érdemes foglalkozni, hogy mely nyelven írom a programot”
Akkor legyen XC8-ra pár példa:

Fordítás közben EEPROM tartalom készítése (egyszerűsített változat):
  1. #if _PIC18
  2. #define DELTA_EEPROM 1
  3. #else
  4. #define DELTA_EEPROM 2
  5. #endif
  6.  
  7. #define EEPROM_DATA(startaddress, ...)                            \
  8.    asm(" psect eeprom,class=EEDATA,delta="___mkstr(DELTA_EEPROM)  \
  9.        ",space="___mkstr(3)",noexec");                            \
  10.    asm(" org " #startaddress         );                           \
  11.    asm(" irp arg," #__VA_ARGS__ );                                \
  12.    asm("  db arg               ");                                \
  13.    asm(" endm                  ")
  14.  
  15. EEPROM_DATA(0x10, 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33, 32, 32, 32, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 13, 34, 56, 128, 255, 0b0010);

XC8 belső funckióit használva:
  1. uint8_t x;
  2. x = EEPROM_READ(3); //olvasás (cím)
  3. EEPROM_WRITE(3, x); //írás (cím, adat)

Igény szerint, saját funkció (PIC16F18426-hoz írtam):
  1. //address 0 - 255
  2.  
  3. void ee_write(uint8_t address, uint8_t data) {
  4.     uint8_t int_value = INTCON;
  5.  
  6.     NVMCON1bits.NVMREGS = 1;
  7.     NVMADR = 0x7000 | address;
  8.     NVMDATL = data;
  9.     NVMCON1bits.WREN = 1;
  10.     GIE = 0;
  11.     NVMCON2 = 0x55;
  12.     NVMCON2 = 0xAA;
  13.     NVMCON1bits.WR = 1;
  14.     while (NVMCON1bits.WR);
  15.     NVMCON1bits.WREN = 0;
  16.     INTCON = int_value;
  17. }
  18.  
  19. uint8_t ee_read(uint8_t address) {
  20.     NVMADR = 0x7000 | address;
  21.     NVMCON1bits.NVMREGS = 1;
  22.     NVMCON1bits.RD = 1;
  23.     return (NVMDATL);
  24. }


Tényleg kellene pontosítani pár dolgot. Legfőképpen azt, milyen nyelven akarsz programozni, melyik fejlesztőkörnyezetet akarod használni. Milyen karakterket, milyen kijelzőhöz akarsz generálni? Biztos vagy, a műszaki szemmel nézve őskövület, PIC16F877A használatában? Ez utóbbi annyira nem kritikus meg talán jobb is egyszerűbbel kezdeni, de jó ha tudod, ma már eljárt felette az idő.
(#) Máté Tibor Zoltán válasza Bakman hozzászólására (») Márc 21, 2025 /
 
Köszönöm a választ. Valóban grafikus kijelzőhöz kell és olyan ami nem felejti el kikapcsolás után sem, tehát mint egy PROM, EPROM vagy EEPROM. Külső karaktergenerátort tudok készíteni EPROM
2732 -vel a gond hogyan kerül be a PIC -be? A PIC16F877A a kezdőknek ajánlott, elnyűhetetlen PIC alapján került képbe és a sok IO miatt!
(#) Bakman válasza Máté Tibor Zoltán hozzászólására (») Márc 21, 2025 /
 
Az EEPROM mérete nevezett PIC-ben 256 bájt. Ha egyre gondolunk, a 2732-es EPROM 4096 bájtot tud tárolni. Ha a PIC programmemóriáját is felhasználod, akkor 256 + 8192 bájtnyi területed van.

Bekerülni a már említett módon tud. Esetleg a programmemóriát használva (pl. egy CRC tábla DS18B20 hőmérő IC-hez):
  1. const uint8_t crctable[256] = {0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
Talán ez a legegyszerűbb feltöltési mód.
(#) Máté Tibor Zoltán válasza Bakman hozzászólására (») Márc 21, 2025 /
 
Köszönöm a választ és az önzetlen segítséget! Én nem akarom mindkettőt ezért szeretném, ha már a PIC tartalmazná a karaktergenerátort. (A PIC EEPROM területe elegendő.) Említetted a PIC16F877 már elavult típus. Ha tudsz (szerintem igen) ajánlani modernebb hasonló tulajdonságokkal rendelkező típust tedd meg. (Még nincs kész tervem csak most alakul.) A programírást MPLAB x IDE (MPLAB-v.6.25) a feltöltést pickit3 segítségével gondoltam. (A pickit3 összes kisegítője megvan!) Ha továbbra is tudsz segíteni előre is köszönöm!
(#) Hp41C válasza Máté Tibor Zoltán hozzászólására (») Márc 21, 2025 /
 
PIC16F877 helyett 16F877A, 16F887, 16F1937, 18F2620, 18F46Q84 stb.
(#) Bakman válasza Máté Tibor Zoltán hozzászólására (») Márc 21, 2025 /
 
Idézet:
„szeretném, ha már a PIC tartalmazná a karaktergenerátort”
Nem teljesen értem ezt a részt. A karakter generálása és annak tárolása két külön dolog. Generálni azzal generálod, amivel neked egyszerű, akár papíron is meg lehet csinálni. Az EEPROM (és/vagy a programmemória) adatokat tud tárolni, a feltöltésre írtam pár példát.

40 lábú PIC-ből van sok típus. Hacsak valami extra szolgáltatás nem kell, én PIC18F47Q43-at szoktam használni (EEPROM: 1024 bájt), az kb. mindenre elég, sőt. Nekem egyszerűbb így, mégha néha túl sokat is tud a feladathoz képest de nem kell megtanulnom 20 különböző adatlapot (és errata doksit), egyszerre többet véve általában van mennyiségi kedvezmény is. Csináltam már belőle három számjegyes nyomásmérőt is hétszegmenses kijelzővel. A tudásának kb. 0.2 %-a lett kihasználva de nem vacakoltam kisebb/régebbi kontrollerrel (eleve nagyon ügyes ADC van benne).

PIC16F877A: 2800 Ft nettó
PIC18F47Q43: 1200 Ft nettó
(#) Bakman válasza (Felhasználó 32034) hozzászólására (») Márc 21, 2025 /
 
Jó meglátások, valahogy nem jutott eszembe a lista:

LED villogtatás, "Hello world!" stb.
(#) Pali79 válasza Máté Tibor Zoltán hozzászólására (») Márc 21, 2025 /
 
Lehet előrébb jutnánk ha leírnád pontosan milyen célt szeretnél megvalósítani. Az eddigiekből én nem vagyok meggyőződve róla, hogy neked feltétlenül az eeprom-ra szükséged.
(#) reiti válasza Pali79 hozzászólására (») Márc 23, 2025 /
 
A perifériás mező a gyors mozgásokra van kihegyezve.
Ott a "sípoló" led is zavar hogy villog.
Annak ellenére hogy az idegrendszer 40...60Hz-en ketyeg elvileg.
(#) Máté Tibor Zoltán válasza Pali79 hozzászólására (») Márc 24, 2025 /
 
Lehet igazad van! Tehát kell egy 40 - ig számláló számláló és ezt az értéket megjeleníteni, PORTB (grafikus kijelzőn) és (PORTC) hex adatként kivezetni. A folyamat közben minden számváltás után a PORTC fennmaradó egyik kimenetén jelenjen meg egy beíró impulzus. (L). A számláló nullázza önmagát. (0-39) A számlálót PORTA (nyomógombról) léptetni előre-hátra. Ezért lenne jó, ha mindkettő (számláló és karaktergenerátor) PIC -en belül lenne. A fennmaradó 6 db PORTA bemenet nyomógomb lenne és mindig a számláló által kijelölt értéknél váltana L és H színt között. (A szint váltást én végezném.) Ez lenne a PORTD ( 6 db) kimenet. Ezt a kimenetet kell látni a PORTB kimeneten is. Röviden ennyi!
Kérlek csak akkor foglalkozz ezzel ha időd és energiád is van hozzá!
Köszönettel.
(#) KoblogPerGyok válasza Máté Tibor Zoltán hozzászólására (») Márc 24, 2025 /
 
Szia!

Meg tudnád itt mutatni, hogy milyen kijelzőre gondoltál pontosan?

Milyen nyomógombra?

A kimeneteknek hány biteseknek kell lennie?
(#) Pali79 válasza Máté Tibor Zoltán hozzászólására (») Márc 25, 2025 /
 
Idézet:
„Tehát kell egy 40 - ig számláló számláló és ezt az értéket megjeleníteni, PORTB (grafikus kijelzőn) és (PORTC) hex adatként kivezetni.”
Tehét ha jól értem a PORTA valamelyik két lábára kötnél két nyomógombot, egyet az előre, egyet a hátra léptetéshez, ami egy számlálót 0-39-ig léptet. Ez eddig nem sima ügy. A grafikus kijelző kezelése már kicsit macerásabb, de az sem nagy gond (írtam cikket róla jópár éve). A HEX megjelenítése a PORTC-n részt nem egészen értem. Hogyan akarunk HEX adatot megjeleníteni egy 8 bites porton. Simán lehet, hogy én vagyok lemaradva valamiről, de ennek a megoldását nem igazán látom még. Jó lenne egy kapcsolási rajz is, hogy biztosan értsük a dolgot.
(#) Máté Tibor Zoltán válasza Pali79 hozzászólására (») Márc 26, 2025 /
 
Először is köszönet Neked hogy ezzel foglalkozol!
Igen a rajz sokat segít a megértésben. Így elkészítettem az első változatot amely szerintem a FÓRUM tagok segítségével még változni fog. Remélve nem követtem el nagy hibákat így most feltöltöm.

PIC-DIP.jpg
    
(#) Pali79 válasza Máté Tibor Zoltán hozzászólására (») Márc 26, 2025 /
 
Valami más formátumban vagy jobb minőségben kellene feltenni, mert alig kivehető rajta bármi is.
(#) otvenkilenc válasza Lali67 hozzászólására (») Márc 26, 2025 /
 
Nekem az órarutin működik ezzel:
'DEFINE I2C_HOLD 1 'Adás ideje alatt az órajel mennyi
'ideig van alacsony szinten
'IDO
LCD_HOUR VAR BYTE
LCD_MIN VAR BYTE
LCD_SEC VAR BYTE
DUMY VAR BYTE


'I2C BUSZ Ricoh óra ic kiolvasás és írás
SDA VAR PORTC.4
SCL VAR PORTC.3

I2CRead SDA, SCL, $64, $0, [LCD_SEC, LCD_MIN, LCD_HOUR]

I2CWrite SDA, SCL, $64, $0, [LCD_SEC, LCD_MIN, LCD_HOUR] 'IDO BEALLITASA

INIT_RICOH:
I2CWrite SDA, SCL, $64, $F0, [$20] 'FORMATUM BEALLITASA
Return
(#) otvenkilenc válasza Máté Tibor Zoltán hozzászólására (») Márc 26, 2025 /
 
A grafikus kijelzőben van egy karakterkészlet csak a karaktereket kell megcímezni. Ha egyéb más szimbólumot akarsz megjeleníteni, akkor azt leszoktam tölteni a PIC program indulásakor a kijelzőbe.
(#) otvenkilenc válasza (Felhasználó 32034) hozzászólására (») Márc 26, 2025 /
 
Részlet az LCD kezelésre és I2C re

A hétköznapi karakteres kijelzőt 4 bites módban használom. Ez a láb kiosztás de mindenki úgy használja ahogy neki éppen kedve van. Nálam ez a kiosztás:

  1. DEFINE  LCD_DREG        PORTD   ' adatregiszter port
  2. DEFINE  LCD_BITS        4               '       'hánybites az adat
  3. DEFINE  LCD_DBIT        4                       ' Melyik bitnél kezdődik az adat itt A4 nél
  4. DEFINE  LCD_RSREG       PORTD   ' melyik vezérlő regiszter
  5. DEFINE  LCD_RSBIT       1               ' Az RS bit a PORTD.1 kimenet kék lcd 4
  6. DEFINE  LCD_RWREG       PORTD
  7. DEFINE  LCD_RWBIT       2               ' RW bit a PORTD.2 piros lcd 5
  8. DEFINE  LCD_EREG        PORTD
  9. DEFINE  LCD_EBIT        3                       ' Engedélyező kimenet PORTD.3 zöld lcd 6
  10. DEFINE  LCD_LINES       2               ' Kétsoros LCD
  11.  
  12. DEFINE WATCHDOG TRUE
  13.  
  14. csipogo         VAR PORTD.0             '19  láb  buzzer  narancssárga
  15. RS                      VAR PORTD.1             '20. láb' lcd 4 láb kék
  16. '--------------------------------------------------------
  17. RW                      VAR PORTD.2             '21. láb  lcd 5 láb piros
  18. E                       VAR PORTD.3             '22. láb  lcd 6 láb zöld
  19. '                       VAR PORTC.4             '23. láb  SDI/SDA
  20. '                       VAR PORTC.5             '24. láb  SDO
  21. '                       VAR PORTC.6             '25. láb  TX
  22. '                       VAR PORTC.7             '26. láb  RX
  23. '                       VAR PORTD.4             '27. láb  LCD D4
  24. '                       VAR PORTD.5             '28. láb  LCD D5
  25. '                       VAR PORTD.6             '29. láb  LCD D6
  26. '                       VAR PORTD.7             '30  láb  LCD D7
  27. '                                                       '31 GND
  28. '                                                       '32 +
  29. ford_be         VAR PORTB.0             '33  láb INTERUPT
  30. balra                   VAR PORTB.1             '34  láb sárga        1 nyomógombok
  31. jobbra          VAR PORTB.2             '35  láb kék  2
  32. Elfogad         VAR PORTB.3             '36. láb zöld 3      
  33. Kilep                   VAR PORTB.4             '37. láb piros 4
  34. '                       VAR PORTB.5             '38. láb
  35. '                       VAR PORTB.6             '39. láb PGC
  36. '                       VAR PORTB.7             '40. láb PGD
  37.  
  38.  
  39. jobbra_ny         VAR BYTE
  40. balra_ny          VAR BYTE
  41. csillag   VAR BYTE
  42. algomb    VAR BYTE
  43.  
  44. jobbra_ny = 126 '  Ez a karakter ASCCII kódja
  45. balra_ny  = 127 '
  46. OK              = 33 ' !
  47. csillag = 42 '*
  48.  
  49. ----------  Letöltöm a hosszú ó  betü karakter mintáját. A motor indítási kérésnél ott van hogyan kell  formailag megadni hogy ez jelenjen meg kijelzőn: Valóban indít?  
  50.  
  51. LCDOut $02,$04,$00,$0E,$11,$11,$0E,$00 'ó (ASCII $05) ó
  52.  
  53. A grafikus annyiban bonyolultabb, hogy ki kell jelölnöd, hogy a felső vagy az alsó tömbbe írsz.
  54.  
  55.  
  56. 'Input  ford_be
  57. Input   jobbra
  58. Input   balra
  59. Input   elfogad
  60. Input   Kilep
  61. Output  PORTD.4
  62. Output  RS
  63. Output  RW
  64. Output  E
  65.  
  66.  
  67.  Itt töltöm le az ékezetes betüket az Lcd-b és
  68. motor_indit_kerdes:
  69.         inditani = 0
  70.         LCDOut $fe, 1                   ' Törli az  LCD -t
  71.         LCDOut $FE,$80," Val",$05,"ban indit?" ', DEC sz
  72.         LCDOut $FE,$C0," ",csillag," Igen ", ok," Nem"
  73.         sz=sz+1
  74.  
  75. Ricoh óra ic
  76. DEFINE  I2C_HOLD   1    ' Adás ideje alatt az óra jel mennyi
  77.                                         ' ideig van alacsony szinten
  78.  
  79. IDO
  80. LCD_HOUR        VAR     BYTE
  81. LCD_MIN         VAR     BYTE
  82. LCD_SEC         VAR     BYTE
  83.  
  84.  
  85. 'I2C BUSZ
  86. SDA             VAR     PORTC.4
  87. SCL             VAR     PORTC.3
  88.  
  89. I2CRead SDA, SCL, $64, $0, [LCD_SEC, LCD_MIN, LCD_HOUR]
  90.  
  91. INIT_RICOH:
  92.  I2CWrite SDA, SCL, $64, $F0, [$20]     'FORMATUM BEALLITASA
  93. Return
  94.  
  95. ---------------------
  96. De lehet használnia PIC belső I2C modulját is.  Az kicsit macerásabb.
  97. ' Regiszter jelző bitjeinek meghatározása
  98. SSPIF    VAR     PIR1.3          ' SSP (I2C) megszakitás flag
  99. BF         VAR     SSPSTAT.0       ' SSP (I2C) Buffer tele jelző bit
  100. R_W      VAR     SSPSTAT.2       ' SSP (I2C) Olvas/Ir
  101. D_A       VAR     SSPSTAT.5       ' SSP (I2C) Adat/Cím
  102. CKP       VAR     SSPCON.4        ' SSP (I2C) SCK órajel polaritás jelző bit
  103. WCOL    VAR     SSPCON.7        ' SSP (I2C) SSPBUF-be irást jelző bit
  104. SSPOV   VAR     SSPCON.6        ' SSP (I2C) Vétel túlcsordolás jelző
  105. SSPEN    VAR     SSPCON.5        ' SSP (I2C) I2C mód Engedélyezés
  106. ' ezzel a bittel engedélyezem a 18. és 23 láb I2C módban való működését
  107. ' ha nem teszem a lábak hagyományos I/O -ban múködnek!!!
  108. '
  109. 'Write 1,2                                      ' EEPROM 1, cellába 2 -t teszek eszközcím
  110. 'Read 1,EEADR                           ' Cím beolvasás
  111. 'I2Caddress = EEADR                     ' cím beállitás bekapcsoláskor
  112. ' kiosztáskor figyelni az azonos címekre!
  113.  
  114. '  I2C slave  mód és fizikai cím beállítás
  115. '  Az SSPADD regiszterbe került értéket hasonlitja össze a master-által
  116. '  elküldöttel. Az SSPADD -ban lévő érték a fizikai címe az eszköznek
  117. '  PIC 16F87X  Databook 73. oldal ha egyezik bebillenti a SSPSTAT 5,
  118. '  bitejét ez most egy D_A nevú bitváltozó
  119.  
  120.         SSPADD = I2Caddress             ' az eszközcime, ezt elküldheti egy másik ezsköz is
  121.                                         ' Kiirja EEPROM-ba újrainditás után az új cimen van
  122.                                         ' ez lehet egy ön RESET is! ha régi cím nem egyezik
  123.                                         ' a küldöttel! Egyik láb a MCRL - re kötve!
  124.         SSPCON2 = 0             ' általános hivás cim tiltva, erre nem válaszol
  125.         SSPCON = $36            ' I2C slave-hez 7 bites címzést használok
  126.                                         ' elég a 127 eszköz egy dróton bocs 2 -n
  127.         readcnt = 0             ' Byte számláló nullázás
  128.  
  129.  '**************************************************************************
  130.  
  131.          i2cslave:                      ' I2C slave szubrutin
  132.  
  133.                 SSPIF = 0       ' megszakítás jelzö bit törlés
  134.        IF R_W = 1 Then i2crd   ' ha R/W bit egy akkor olvasni akar a MASTER
  135.         IF BF = 0 Then i2cexit  ' ha a buffer üres (nincs adat) vissza
  136.        IF D_A = 1 Then i2cwr   ' Adat kérés jött és nem cím!!
  137.                                 ' Ha a puuferban lévő adat egyezik
  138.                                 ' a cimmel a következőt kell tenni
  139.  
  140.         IF SSPBUF != I2Caddress Then i2cexit    ' Törli a Címet a bufferből
  141.  
  142.                                         ' mert az jön először!!!
  143.         readcnt = 0             ' majd törli a  Byte számlálót mert a cím
  144.                                         ' BYTE eggyel növelte!
  145.         GoTo i2cexit
  146.  
  147. i2cwr:                                  ' I2C adat irás az eszközbe
  148.         datain = SSPBUF         ' Puffer tartalom változóba
  149.         GoTo i2cexit                    ' és vissza
  150.  
  151. i2crd:                                  ' I2C adat olvasás az eszközről
  152.         IF D_A = 0 Then         ' adat jött az offset értéke!!
  153.                 readcnt = 0             ' a Byte számláló törlése
  154.         EndIF
  155.                                                 ' adat küldés a BYTE számláló szerint
  156.         SSPBUF = dataout[readcnt]       ' Adat a Ki/Bemeneti bufferbe index szerint
  157.         CKP = 1                         ' SCL drót H szinten
  158.         readcnt = readcnt + 1           ' Byte számláló növelés
  159.        
  160.         'GoTo i2cexit                   '
  161. ' most csak 1 BYTE-ot küldünk mert a MASTER annyiszor fogja kérni ahány
  162. ' Byte kell neki ez igy nézki a MASTER program ban:
  163. ' I2CRead SDA,SCL,$02,[STR a\8] azaz 8 BYTE-t kér
  164. i2cexit:
  165.                 Return


Részletek egy programból
A hozzászólás módosítva: Márc 27, 2025
Moderátor által szerkesztve
(#) Máté Tibor Zoltán válasza Pali79 hozzászólására (») Márc 26, 2025 /
 
Megpróbáltam egy .pdf fájlt létrehozni remélem sikerrel.

w.pdf
    
(#) Pali79 válasza Máté Tibor Zoltán hozzászólására (») Márc 26, 2025 /
 
Igazából nem lett jobb a minőség sajnos. Milyen programmal készült a rajz?
Következő: »»   1212 / 1225
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