Fórum témák

» Több friss téma
Fórum » Két PIC közötti kommunikáció
 
Témaindító: JohnyBravo, idő: Márc 28, 2006
Témakörök:
Lapozás: OK   3 / 8
(#) icserny válasza sityu39 hozzászólására (») Dec 11, 2008 /
 
Az I2C szerintem nem erre való, autóban tudtommal a CAN buszt használják. Az I2C egy készüléken belüli IC-k kommunikációjára lett kitalálva.

Amúgy gondot az I2C esetén az okozhat, ha valamelyik buszvonalra csatlakozó láb föld felé rövidzárat csinál, vagy egyéb ok miatt "lehúzza" valamelyik vonalat.
(#) sityu39 válasza icserny hozzászólására (») Dec 11, 2008 /
 
Sajnos a CAN kommunikációt nem ismerem, és szerintem a PIC sem.

A zavaroktól nem félek, viszont a meghibásodó PIC IO lábaktól annál inkább. Talán PIC-enként közbeiktatott master PIC-el közvetlenül vezérelhető tápellátású pufferekkel lehetséges a probléma kiküszöbölése.
(#) potyo válasza sityu39 hozzászólására (») Dec 11, 2008 /
 
Vannak picek, amik ismerik a CAN kommunikációt. Keress rá Microchipnél.
(#) qwer85 hozzászólása Jún 20, 2009 /
 
Üdv!
Lehetséges az hogy a p16f690-es hardveres I2C módban csak slave lehet?
(#) qwer85 válasza qwer85 hozzászólására (») Jún 20, 2009 /
 
Mindegy...

Íme a probléma konkrétan:
Master:
  1. #include <16F690.H>
  2. #fuses HS, NOWDT, NOPROTECT
  3. #use delay(clock=4000000)
  4. #use i2c(Master, sda=PIN_B4, scl=PIN_B6)
  5.    
  6. //====================================
  7. void main()
  8. {
  9. int8 data;
  10. while(1)
  11. {
  12. delay_ms(100);
  13. i2c_start();
  14. i2c_write(0xA0);
  15. i2c_write(0x00);
  16. i2c_write(0x70);
  17. i2c_write(0x71);
  18. i2c_write(0x72);
  19. i2c_write(0x73);
  20. i2c_stop();
  21.  
  22. // Read from the slave board and display the data.
  23. i2c_start();
  24. i2c_write(0xA0);
  25. i2c_write(0x00);
  26. i2c_start();
  27. i2c_write(0xA1);
  28. data = i2c_read(0);
  29. i2c_stop();
  30. }
  31. //while(1);    
  32. }


Slave:
  1. #include <16F690.h>
  2. #fuses HS,NOWDT,NOPROTECT
  3. #use delay(clock=4000000)
  4. #use i2c(SLAVE, SDA=PIN_B4, SCL=PIN_B6, address=0xA0)
  5.  
  6. BYTE address, buffer[0x10];
  7.  
  8. #INT_SSP
  9. void ssp_interupt ()
  10. {
  11.    BYTE incoming, state;
  12.  
  13.    state = i2c_isr_state();
  14.    
  15.    if(state <= 0x80)                     //Master is sending data
  16.    {
  17.       incoming = i2c_read();
  18.       if(state == 1)                     //First received byte is address
  19.          address = incoming;
  20.       if(state == 2)                     //Second received byte is data
  21.          buffer[address] = incoming;
  22.    }
  23.    if(state == 0x80)                     //Master is requesting data
  24.    {
  25.       i2c_write(buffer[address]);
  26.    }
  27. }
  28.  
  29.  
  30. void main ()
  31. {
  32.    enable_interrupts(GLOBAL);
  33.    enable_interrupts(INT_SSP);
  34.  
  35.    while (TRUE) { }
  36. }


Szóval Proteusban az egyik irányba működik a kommunikáció mert az I2C elemző mutatja, de a slave már nem küldi vissza az adatokat. Már SPI-vel próbálkoztam, de az I2C egyszerűbbnek tűnik.. Előre is kösz..
(#) icserny válasza qwer85 hozzászólására (») Jún 21, 2009 /
 
A master program elején nem kellene egy vonal inicializálás a késletetés előtt?

  1. output_float(PIN_B4);
  2.    output_float(PIN_B6);



(#) icserny válasza qwer85 hozzászólására (») Jún 21, 2009 /
 
Van itt még egy bibi!
Azt mondja az ERRATA, hogy a Rev6 előtti PIC16F690 mikrovezérlők nem ismerik fel az első start bitet!

2. Module: SSP (PIC16F687/689/690 only)
In any of the I2C™ modes, the SSP module will fail to recognize the first Start bit received after a transition from module disable to module enable. Subsequent Stop bits and Start bits are detected properly.

Work around: Enable the SSP module in SSPMSK Access mode before changing the mode to the desired I2C operation.

Fix: Rev. A6 Silicon and later revisions.
(#) qwer85 válasza icserny hozzászólására (») Jún 22, 2009 /
 
És azt honnan lehet megtudni, hogy rev. A6-os?
(#) potyo válasza qwer85 hozzászólására (») Jún 22, 2009 /
 
Ki kell olvastatni az ezt jelző biteket a kontrollerből (18F-nél a DEVID bitek mellett találhatók a REV bitek, többinél nem néztem), és az alapján megkeresni az adatlapokban vagy az errata lapokban a hozzá társított jelzést. De az MPLAB ki is írja, hogy A6, B1, stb. ha ICD2-t használok, de szerintem a Pickit2-vel is kiírja.
(#) icserny válasza qwer85 hozzászólására (») Jún 22, 2009 /
 
Amikor például a PICkit2 vagy az ICD2 csatlakozik, akkor kiírja a drót végén talált eszköz azonosítóját, meg valami verzió azonosítót.
(#) Jobbagyag hozzászólása Júl 31, 2009 /
 
Sziasztok!
Ha 2 PIC-et szeretnék összekötni amik egymástól kb 10m-re vannak (riasztó központban és kaypadban levő PIC-ek) és nincs túl sok vezetékem (8db), milyen(gondolom soros) kommunikáció lenne a legcélravezetőbb. Beleástam magam az I2C-be mire rájöttem ez nem igazán jó ekkora távolságra. USART?
A cél pár byte szinkronban tártása lenne (központ érzékeli az érzékelők jeleit, a keypad PIC vezérelné a kijelzőt, ill tudatná a közpottal milyen gombot nyomtunk le. Bármi segítség jól jönne de a legfontosabb az irány meghatározása lenne, hogy mibe érdemes elmélyednem. Előre is kösz.
(#) potyo válasza Jobbagyag hozzászólására (») Júl 31, 2009 /
 
(#) Jobbagyag válasza potyo hozzászólására (») Júl 31, 2009 /
 
Oké, nekilátok. Esetleg tudnál valami jó összefoglaló linket praktikus tanácsokkal? Hogy kell egy ilyen hálózatnak kinézni, assembly-ben programozva hogyan kell az adatokat átküldeni/fogadni.
Keresem persze én is közben.
(#) icserny válasza Jobbagyag hozzászólására (») Júl 31, 2009 /
 
AN774 - Asynchronous Communications with the PICmicro USART
Bővebben: Link
(#) potyo válasza Jobbagyag hozzászólására (») Júl 31, 2009 /
 
Hát ha van két szabad vezetékpárod, meg azon kívül egy GND, akkor a kábel mindkét végére teszel egy-egy SN75176 IC-t (tehát összesen négy darab kell), és ugyanúgy működik, mint a soros port. A vezetékpár jó lenne, ha csavart érpár lenne, pl. UTP kábel egy-egy érpárja.
(#) Jobbagyag hozzászólása Júl 31, 2009 /
 
Kösz mindkettőtöknek! Ebben a témában még nagyon kezdő vagyok (sosem kötöttem össze 2 PIC-et), de most már legalább tudom merre induljak...
(#) Jobbagyag válasza potyo hozzászólására (») Aug 30, 2009 /
 
Üdv!
Egész jól haladok a pic kommunikációval, simán átmennek a byte-ok. Most jönne az RS485 az SN75176 IC-kel. Átézve a javallt dokumentumokat valami nem tiszta: Pl az egyik pic elkezd küldeni egy byte-ot a buszon. Mi van ha egy másik is elkezd adatot küldeni még mielőtt emez befejezné. Ha azután kezdené küldeni akkor már nem gond, a többi pic-be érkezett adat interruptot vált ki és akkor pl tilthatjuk a transmission-t, de ha közel egyidőben kezdik? Vagy ez annyira elhanyagolható időtartam, hogy a gyakorlatban nem szoktak vele számolni?
Szóval az aggályom, hogy a közös (2eres) buszon egyik line driver pl H-t akar a másik L-t, nem fog ekkor valami kihalni?
Kösz.
(#) kissi válasza Jobbagyag hozzászólására (») Aug 30, 2009 /
 
Nem csináltam még ilyet, de ilyenkor az a teendő tudtommal, hogy adás közben figyeled a vonalon megjelent bitet és ha ez nem egyezik a kiadott bittel, akkor abbahagyod az adást és egy véletlen idő múlva indítod újra ( legalábbis más rendszerekben tudtommal így működik !).

Steve
(#) Jobbagyag válasza kissi hozzászólására (») Aug 30, 2009 /
 
Közben nekem is eszembe jutott egy lehetőség. Kinevezek egy Mastert ami sorban vegig szólongatja a slave-eket. Alap helyzetben minden slave-nél tiltva van az adatküldée és csak annál a slave-nél engedélyezzük a transmission-t amelyik meg lett szólítva.
Alap esetben én aszinkron adatátvitelt gondoltam, mert azt olvastam, nagyobb távolságokra ez a jobb. Bár attól, hogy master van ez még sztem aszinkron(nincs közös órajel),, csak van 1 PIC ami vezérli az adatforgalmat.
Szerintetek jól gondolom?
(#) potyo válasza Jobbagyag hozzászólására (») Aug 30, 2009 /
 
Igen, így szoktuk csinálni, hogy van egy Master, és az szólítja sorban a többit megfelelő időközönként. Ha kettőnél több PIC között kell megoldani a kommunikációt, és egyéb feltételeknek megfelel, akkor a legegyszerűbb, ha minden PIC-nek van egy saját címe, amivel a Master azonosítja, hogy kinek küld most, és csak a Master kezdeményez kommunikációt. Amelyik PIC felismerte a saját címét, az válaszol, a többi pedig továbbra is csak figyeli a vonalat. A cím küldéséhez létezik 9 bites adás, a PIC-ben pedig be lehet állítani, hogy azt figyelje, hogy a 9. bit micsoda, és csak akkor reagáljon a vett adatra, ha az mondjuk egyes volt, minden egyéb esetben hagyja figyelmen kívül. Ez azért jó, mert előfordulhat, hogy a válaszban olyan adat megy, amit a másik címként ismerne fel. De ha a címben eleve a 9. bit eltér, akkor nincs gond. Fusd végig ezt a témát: Link
(#) Jobbagyag válasza potyo hozzászólására (») Aug 31, 2009 /
 
Igen, igen a 9. bites címzésre gondoltam én is. Köszönöm a linket, átnézem. Már csak egy hardware-es kérdésem van: SN75176 adatlapján az A és B vezetékek 2 végpontját egy-egy 120 Ohm-os ellenállás köti össze. Más RS485 rajzokon még pluszban az A és B vezetékek a +5V-ra és GND-ra is kötve vannak egy-egy ellenállással (560 Ohm-tól pár KOhm). Kell ez utóbbi, illetve mi lehet a szerepe.
Kösz.
(#) potyo válasza Jobbagyag hozzászólására (») Aug 31, 2009 /
 
A 120ohm az érpár impedanciájának illesztésére szolgál. UTP kábel impedanciája 100 ohm, ahhoz elvileg 100ohm ellenállás kell az érpár végeire. Érdemes úgy csinálni, hogy az ellenállással egy kondenzátort sorbakapcsolsz, akkor nem fog egyenáram folyni az ellenálláson, a lezárás viszont jó lesz. Mondjuk 1µF kondenzátor jó lenne, célszerűen kerámiából.

A másik két ellenállás arra való, hogy biztosítsa a buszon a stabil jelszintet, amikor minden vevő nagyimpedanciás állapotban van. Ezen ellenállások értéke nem lényeges, én néhány kohm-ot tennék. Ha a kondenzátor bent lesz, akkor akár 10kohm is jó.
(#) Jobbagyag válasza potyo hozzászólására (») Aug 31, 2009 /
 
Ok, kösz, holnap kipróbálom.
(#) Jobbagyag válasza Jobbagyag hozzászólására (») Szept 4, 2009 /
 
Sajnos nem megy ez az RS485 dolog. A ket PIC-cel minden ok, ha Tx-Rx Rx-Tx labakat osszekotom siman kuldik/fogadjak a byte-okat. Ha azonban a 2 SN75176-on keresztul akarom akkor az egyik pic periodikusan reseteli magat. Ugy tunik, mintha a tapfesze nem lenne eleg (bemertem a ket SN75176 osszesen 86mA-t vesz fel). NEm sok ez? Mar gondoltam arra is, hogy levalasztom optocsatoloval a PIC-eket az RS485-os reszrol (bar ilyet sehol nem lattam a neten).
Amugy 2 vezeteken megy (menne) a kommunikacio mindket PIC-hez 1-1 SN75176van kotve, DE RE labak ossze vannak kotve es a PIC egy kulon laba ad H ha transmission lesz, amugy L szinten vannak.
Tudna valaki valami otletet adni mi lehet a gond?
(#) potyo válasza Jobbagyag hozzászólására (») Szept 4, 2009 /
 
Nincsenek véletlenül megcserélve az RS485 adatvezetékei? Válaszd le a PIC TX lábáról az SN75176-ot, és adj kézzel magas vagy alacsony szintet az SN75176 bemenetére. Nézd közben, hogy a túloldalon a PIC RX lábán mi jelenik meg.
(#) Jobbagyag válasza potyo hozzászólására (») Szept 4, 2009 /
 
Igen, ezt próbáltam, úgy tűnik maga az RS485 rendszer oké, mert engedélyezve a transmissiot H-t adva az egyik SN75176 D bemenetére H jelenik meg a másik R-jén. Tiltva a transmissiot (azaz vételt engedélyezve meg mindig magas szint van. Úgy gondolom ez így normális. Nincsenek felcserélve a vezetékek, az adatlapnak megfelelően vannak. Az jó úgy hogy az A B adatvezetékek közt -2V meg +2V fesz különbség van, a közös GND-hoz képest pedig 3-4V fesz különbség? Valahol tizen voltokat olvastam. Szóval az nem probléma, hogy a PIC-ek és a SN75176 ugyanazon a tápfeszen vannak?
(#) Jobbagyag válasza Jobbagyag hozzászólására (») Szept 4, 2009 /
 
Ja és persze L-t adva a D bemenetre a másikon L jelenik meg az R kimeneten. (ez a sor kimaradt az előzőekből)
(#) potyo válasza Jobbagyag hozzászólására (») Szept 4, 2009 /
 
Jónak tűnik. A 2V is jó, ha a táp csak 5V, akkor nem lehet ettől nagyob feszültség sehol sem.

A PIC-ek tápja hogyan épül fel? Tápszűrés milyen?
(#) Jobbagyag válasza potyo hozzászólására (») Szept 4, 2009 /
 
Azzal nem gondolnám, hogy gond lenne, labor tápról megy, van 100nF is közvetlen a PIC tápfesz lábnál.
(#) Jobbagyag válasza Jobbagyag hozzászólására (») Szept 4, 2009 /
 
Ami kicsit speciális, hogy mivel még csak tesztelem a dolgokat az A és B vezetékek 10cm hosszúak (nem csavart érpár) és mindkét végén van egy 120 Ohm. így írta az adatlap. De úgy tűnik nem is az RS485-tel van a baj, hisz tesztelve jól megy és nem is a PIC-ekkel (Tx-Rx direkt összekötésnél kifogástalan minden), hanem a kettőt összekötve omlik össze minden valahogy (PIC resetelget egymás után, éredekes módon csak az egyik, a másik oké, pedig mindkettőben ugyanaz a program)
Következő: »»   3 / 8
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