Fórum témák

» Több friss téma
Fórum » RS232 Interrupt PIC16F628
 
Témaindító: Rikfic, idő: Aug 9, 2007
Témakörök:
Lapozás: OK   2 / 3
(#) potyo válasza Gruebber hozzászólására (») Jan 3, 2008 /
 
A külső pic TX lábát kell a fogadó pic RX lábára kötni. Valamint a gnd-ket is össze kell kötni. Ezen kívül már csak szoftver kérdése a dolog. Ha mutatsz kódrészletet, akkor többet tudunk segíteni.
(#) Gruebber válasza potyo hozzászólására (») Jan 3, 2008 /
 
A két PIC egy panelon van, közös a GND. A két PIC-nek nem a hardveres RX,TX lába van használva, de ha azt mondod, hogy csak szoftver probléma lehet, akkor küzdök még vele. Nem tudtam, hogy kell-e valamilyen szintillesztés(?), vagy le-, felhúzása a vonalaknak. A két láb direktbe össze van kötve a NYÁK-on. Gondoltam még, hogy esetleg a frekik, amin dolgoznak, okozhatnak problémát.
(#) potyo válasza Gruebber hozzászólására (») Jan 3, 2008 /
 
A küldés és a fogadás bitsebessége meg kell, hogy egyezzen. Addig ne is próbálkozz mással, amíg azok nem egyeznek.
(#) Gruebber válasza Gruebber hozzászólására (») Jan 3, 2008 /
 
Most néztem meg újra a NYÁK-ot, és még egy gond van ezzel az egésszel: A 1320-as csak akkor kezdheti el küldeni az adatot, amikor a 4620-as jelzi neki. (És csak két vezeték áll rendelkezésre). Tehát egyszer az egyik a küldő, másszor a másik.
(#) Gruebber válasza potyo hozzászólására (») Jan 3, 2008 /
 
Ha nem tudom összeegyeztetni, akkor megfelelő lehet valami saját kommunikáció?
Gondolok itt arra, hogy az egyik vezeték az adás-vétel állapotára, a másik az adat értékére van használva?
(#) potyo válasza Gruebber hozzászólására (») Jan 3, 2008 /
 
Jól értem, hogy van két vezetéked a két chip között a gnd-n kívül? Ha jól, akkor semmi gond, egyik vezetéken a 1320 küldi az adatot a 4620 számára, a másik vezetéken meg ellentétes irányba történik az átvitel. Sima rs232 kommunikáció: startbit, adatbitek, stopbit. Nem kell a bitsebességnek hajszálpontosan egyezni (valószínűleg nemis lehet eltalálni pontosan a különböző oszcillátorfrekvenciák miatt), 2-3% eltérés belefér, ha jó a soros fogadás algoritmusa.


Persze lehetne csinálni i2c-t is, de azt bonyolultabb leprogramozni szoftveresen...
(#) Gruebber válasza potyo hozzászólására (») Jan 3, 2008 /
 
Megnyugtattál, hogy szoftveres a probléma, küzdelmem végére remélem "feláldozhatok majd egy kecskét"
(#) maxpack válasza Gruebber hozzászólására (») Feb 22, 2008 /
 
sziasztok!

Lenne egy talán nem ide illö kérdésem, de feleslegesnek tartok egy uj témát nyitni ez végett.

a kérdésem a következö lenne:

max. milyen hosszú lehet egy soros kábel?
(amin ugye tökéletesen megy a komunikáció)
(#) kobold válasza maxpack hozzászólására (») Feb 22, 2008 /
 
Sebességtől, kábel jellemzőitől, környezeti zavarástól erősen függ. 9600 bps mellett állítólag 50 m fölé is lehet emelni a távolságot megfelelően árnyékolt vezetékkel, de ekkora távon még nem próbáltam, 20 m-ig jól ment. Általában ahogy emelkedik a sebesség, úgy csökken a kábelhossz.
(#) dcsabi válasza Gruebber hozzászólására (») Feb 22, 2008 /
 
Most játszottam egy hasonló dologgal, nálam müködik két PIC-el az RS232... 16f628, 876,877 mindegy. Van egy PC-re tesztprogim pic-hez ...ez sokat segít. Ha kell küldök egy müködő példaprogit két pic-re rs232-re. Egyébként
nem árt ha a két Pic-nek saját quartz oszcija van, még ha egy panelon is van. Jót szívtam az I2c-vel miatta...
RS-hez még... a kommunikálandó bájtok száma is lényeges, tehát ha 10db-ot küldesz, 10dbot is várj odaát...Ez megkönnyítheti a dolgodat.

RSCheck.exe
    
(#) maxpack válasza kobold hozzászólására (») Feb 23, 2008 /
 
köszi
(#) maxpack válasza kobold hozzászólására (») Feb 23, 2008 /
 
akkor ezek szerint egy UTP kábellal megpróbálkozhatok, ugye?
(#) potyo válasza maxpack hozzászólására (») Feb 23, 2008 /
 
Attól jobbat úgyse találsz.

Viszont ha szimmetrikus átvitelt (RS485) használnál, akkor jóval nagyobb távolságra is el lehet juttatni a jelet, ha kell.
(#) maxpack válasza potyo hozzászólására (») Feb 24, 2008 /
 
köszi!
(#) alex077 hozzászólása Júl 24, 2008 /
 
sziasztok!

sztem témába illő a kérdésem:
pic18f2520-al szeretnék rs232-n keresztül pc-vel kommunikálni.
A led villog, viszont a megszakítás nem működik.
Miért?
Már próbáltam ezerféleképpen és nem akarja az igazságot.
Ha a while ciklusba beleteszem az RDA() utasítást akkor helyesen leveszi az értéket és vissza is küldi.
Tehát hardveres probléma (sztem)kizárva.
Kezd elmenni a lelkesedésem.....
(#) alex077 válasza alex077 hozzászólására (») Júl 24, 2008 /
 
A problémát sikerült megoldani. a static char data-t kellett a 2. sorba tenni
Működik.
(#) sanyika hozzászólása Feb 18, 2009 /
 
Ha véletlenül valakinek van működő, két PIC-et RS232-vel összekapcsoló programja, ha lehet C-ben 16F628-ra, (végül is a program szerkezete érdekel, lehet bármilyen PIC), megköszönném, ha elküldené. Egy- irányú a forgalom egy billentyűzet továbbítja a jeleket egy 30 m távolságra levő PIC-hez. Köszi
(#) potyo válasza sanyika hozzászólására (») Feb 18, 2009 /
 
Nekem ugyan nincs ilyen programom, de a program szerkezetéből konkrétan mi érdekel? Mindkettő felkonfigurálja a soros portot a megfelelő beállításokkal, majd az egyik a TXREG regiszterbe helyezéssel elkezdi kiküldeni az adatot, a másik meg amikor megérkezett, akkor az RCIF bit bebillentésével (és ha engedélyezve van a megszakítás, akkor annak végrehajtásával) jelzi azt.
(#) icserny válasza alex077 hozzászólására (») Feb 19, 2009 /
 
Idézet:
„A problémát sikerült megoldani. a static char data-t kellett a 2. sorba tenni”


Pontosabban szólva: az a lényeg, hogy az #int_RDA direktívát közvetlenül kövesse a RDA_isr() interrupt kiszolgáló rutin. Én is jártam már így...

  1. static char data;
  2.  
  3. #int_RDA
  4. void  RDA_isr()
  5. {
  6.  #byte RCREG = 0xFAE;
  7. data = RCREG;
  8. //data=getc();
  9.    putc(data); //hogy lássuk mit vettünk a soros vonalon
  10. output_high(PIN_B3);
  11. }

(#) sanyika válasza potyo hozzászólására (») Feb 20, 2009 /
 
Amit írtál rendben lenne, sikerült megoldani. Még van egy bizonytalannak tűnő rész: amennyiben a távolság miatt MAX232-t használok valószinüleg kell egy az adó PIC-be és egy a vevőbe. Jól gondolom? Ha ez így van ,akkor az adó oldalon a TIN TOUT lábakat használom. Mit használok a vevő oldalon? Gondolom a tagadott kimenet miatt szintén a TIN TOUT lábakat. Ha ez így van mi történik a feszültségekkel, hiszen a MAX feladata a vonali feszültség megemelése. Tudnál ebben egy kis rendet rakni a felemben?
(#) xgaborx hozzászólása Márc 27, 2012 /
 
Sziasztok,
Az a kerdesem lenne, hogy mi a kulonbseg a hardware-es , illetve a software-es sorok kommunikacio kozott, program szempontjabol? Meiknel mit kell megadni parameternek a #use rs232() nel?
(#) vilmosd válasza xgaborx hozzászólására (») Márc 27, 2012 /
 
Ugyebar ez CCS C. A parancsna kb 30 opcioja van. A help leirja szepen milyen opcio mire hasznalhato. A HW es SW soros kezeles kozott az a nagy kulonbseg, hogy a HW-s a beepitett UART-ot hasznalja, ami fel van keszitve a soros vonali adatok lekezelesere, hibakezelesre. A SW soros kezeles egy altalad megirt sorosvonal kezelo program (vagy lib), ami eleg sok helyet es idot vesz el a program futasabol. Ez hasznalatos amikor egy PIC nem tartalmaz HW UART-ot, es a felhasznalo megis akar soros vonalat.
(#) geris hozzászólása Jún 17, 2012 /
 
Sziasztok!

Hasonló témában szeretnék segítséget kérni. Számítógépről szeretnék vezérelni majd szervomotorokat, amihez először egy folytonos oda-vissza kommunikációt kell létesítenem a számítógép és a PIC között RS232-vel. A számítógépre küldöm vissza potenciométerek értékeit, ez eddig működik is. A számítógép pedig kiszámolja majd hogy hol kell állni a szervóknak. Azonban PIC általi adatfogadás nem működik. Próbáltam már rengeteg féle variációt, másféle adatcímzéssel is. Most a legutóbbit osztanám csak meg és szeretném ha segítenétek megoldani.
A küldött adat úgy néz ki, hogy 5 karakter hosszú, aminek első karakterének az ascii kódja maga az adat(pl 120), a többi 4 karakter az a cím. Első körbe csak ledet szeretnék kapcsolni vele ami úgy néz ki: " led1" a küldött adat(0 és 1 az lehet az értékeke, ami a led1 elé van írva, de azért nem jelenik meg mert asciiban ezek vezérlőkarakterek). Ha 1 értékű azt jelenti hogy kapcsolja be led1-et.
A kód:
  1. #define LED1_ON   output_high(pin_c4)
  2. #define LED1_OFF   output_low(pin_c4)
  3.  
  4. static char data[5];    
  5.  char  string[4];
  6.    char command;
  7.    
  8.   char address[4];
  9.  
  10. #int_RDA        //received rs232 data available in buffer
  11. void  RDA_isr()
  12. {
  13. gets(data);
  14. strcpy(string,"led1");
  15. if (strstr(data,string))     //ptr=strstr(s1, s2)    Search for s2 in s1
  16. // ezt próbáltam úgy is, hogy if (strstr(data,string)==data) mert elvileg a s1 a returnja ennek.
  17.  {     command=strncpy (data,command,1);     // Copy up to n characters s2->s1
  18.    if (command==1)
  19.        LED1_ON;
  20.    if (command==0)
  21.       LED1_OFF;
  22.  }
  23. }


Próbáltam már úgy is, hogy address nélkül küldtem, csak a 0-1 értéket, úgy működött, de pont az a lényeg, hogy sokféle adatot kell küldenem oda vissza, tehát szükségem van címzésre. Gondolom a string műveletekkel lehet hiba. Szerintetek?

Max232 helyett amúgy a mellékelt kapcsolást használom és így is működik. Vagy talán ez közrejátszhat mégis abban, hogy nem működik?
Köszönöm a segítséget.
(#) _vl_ válasza geris hozzászólására (») Jún 17, 2012 /
 
Idézet:
Max232 helyett amúgy a mellékelt kapcsolást használom és így is működik. Vagy talán ez közrejátszhat mégis abban, hogy nem működik?”

El nem tudom képzelni, hogy ez hogyan működhet egyáltalán, akár egy pillanatig is. Minimum +/-3V kell a szabvány szerinti működéshez, ezt tranzisztorokkal a +5V-ból nem tudod előállítani. Ha nincs +/- tápod, akkor használj MAX232-t.
(#) geris válasza _vl_ hozzászólására (») Jún 17, 2012 /
 
Tervezem a beszerzését, de ez PIC-ről számítógépre tökéletesen átviszi az adatokat, és amikor nem használtam ilyen címzést amit leírok ott 1 vagy 0 számot vittem át gépről PIC-re és akkor is működött., kapcsolgattam a ledet.
(#) Zolg hozzászólása Nov 8, 2012 /
 
Sziasztok!

Kicsit halott a téma de remélem még sokan olvassák. Belefutottam egy problémába ami szinte biztos vagyok benne hogy egy bagatel apróság de bármennyit töröm rajta a fejem nem tudok túl jutni rajta: PIC16F877, és PC közötti soros kommunikációt szeretnék létrehozni és a fogadott adatot PIC-en belül megszakítással lekezelni. A problémám az hogy fogadja az adatot, bekerül RCREG-be, még RCIF is bebillen, de nem lép bele a megszakításba hanem loop-ban marad. Mellékelem a forráskódot, nyilván itt hibádzik valami...
  1. LIST            p=16F877
  2. #include        "P16f877.inc"
  3.                 __config        0x39BA
  4.                 org             0x0000
  5.        
  6.        
  7.                 goto    main
  8.                
  9.                 org             0x04
  10.                
  11.                 goto    req
  12.  
  13.  
  14.  
  15.                 req
  16.                 banksel         portd
  17.                 movf            rcreg,w
  18.                 movwf           portd
  19.                 retfie
  20.  
  21. ;---------------------------------------------------------------------------------------------------------------------
  22.  
  23. main
  24.                 bank0
  25.                 movlw   b'11011111'                     ;T0CKI porta bemenet
  26.                 movwf   OPTION_REG
  27.                 movlw   b'11000000'                     ;GIE,PIE ON
  28.                 movwf   INTCON                          ;                               movlw   b'00110000'                     ;                               movwf   PIE1                            ;
  29.                 call    init_comport                            ;comport beállítása
  30.                 call    init_IOports
  31.                 call    loop                            ;ciklus
  32.  
  33. init_comport
  34.                 banksel TXSTA
  35.                 movlw   b'00100100       ;
  36.                 movwf   TXSTA
  37.                 movlw   d'25'                                                           movwf   SPBRG                           ;
  38.                 banksel RCSTA
  39.                 movlw   b'10010000'                     ;                               movwf   RCSTA                           ;
  40.                 return
  41.  
  42. init_IOports
  43.                 banksel trisd
  44.                 movlw   b'00000000'
  45.                 movwf   trisd
  46.                 return
  47.  
  48.  
  49.  
  50. loop
  51.                 goto    loop
  52.                        
  53.  
  54. end


Gyanús hogy valamit az initnél rontok el, de már többször is átnéztem és nem találom hogy mit. Köszönet előre is az ötletekért.
A hozzászólás módosítva: Nov 8, 2012
(#) Zolg hozzászólása Nov 8, 2012 /
 
Furán tördelte a kódot...felrakom asm-ben így talán olvashatóbb....

villog.asm
    
(#) vilmosd válasza Zolg hozzászólására (») Nov 8, 2012 /
 
Szoval a bankok valtasa nem mindig megfelelo. Pl Main utan bank0 van es irod az option regisztert, ami a Bank1-ben tartozkodik. Probald meg az egeszet a MLAB alatt szimulalni, es figyelni minden sornal mi tortenik a regiszterekkel. Igy gyorsan ra lehet jonni a hibara.
(#) Zolg válasza vilmosd hozzászólására (») Nov 8, 2012 /
 
Vááááá!!Valóban! Gondoltam hogy egy ilyen bagatel hibával állok szemben! korrigáltam és biztos ami biztos inkább a "banksel regiszter" utasítást használom ezek után...köszönöm a segítséget, el sem hiszed mily boldoggá tettél! Ismét bebizonyosodott: Több szem több csipa mondja az okosságot!
(#) Zolg hozzászólása Nov 28, 2012 /
 
Sziasztok!
Ismét lenne gy kis problémám: PC-PIC között kommunikáció, minden rendben megy megérkezik RCREG-be az adat. A problémám az hogy megszakítással szeretném lekezelni a kommunikációt, de egyszerűen olyan mintha folyamatosan bennt ragadna az IT-ben. MPlabban szimulálva Run-ra kattintva és utánna megállítva, mindig a megszakítás szubrutniban van a program. Még az Init_IOports-ig sem jut el. Viszont ha lépésről lépésre szimulálom minden rendben van...ebben az esetben viszont nem tudok soros adatküldéssel szimulálni. PIC-be égetve, külső tápról gyakorlatilag nem csinál semmit az áramkör, szóval gondolom ott is belefagy már az elején a megszakításba. Van valakinek ötlete hogy mi lehet ez? Összefügghet azzal hogy nem szűröm a soros vonalat kondival? Vagy valami programozási hibát vétettem? Felrakom az ASM-et is hogy tisztább legyen. Igyekeztem világosan fogalmazni, ha nem sikerült kérdezzetek, pontosítom!

egy.asm
    
Következő: »»   2 / 3
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