Fórum témák

» Több friss téma
Fórum » CAN busz kezelése PIC18F-el
Lapozás: OK   1 / 2
(#) abdul hozzászólása Okt 12, 2006 /
 
Sziasztok!

CAN buszos kommunikációt szeretnék létrehozni PIC18-al.
Elolvastam a MicroChip AN713-as ( An introduction to the CAN protocol that discusses the basics and key features), AN228-as ( A CAN Physical Layer Discussion), az AN754-es ( Understanding Microchip's CAN Module Bit Timing) és az AN738-as ( PIC18C CAN Routines in 'C') leírásait.

Az lenne a kérdésem, hogy kezelt/használt-e már közületek CAN buszt (mindegy, hogy Standard vagy extended keret), mert a C-ben megírt rutinok jól használhatónak tűnnek, csak azt nem értem, hogy a PIC18FXXXX (értelemszerűen CAN buszos protokollt is használni képes) eszköz adatlapjában több Receive és Transmit buffer is van, azonban a C rutinok csak adott illetve vett üzenetekről szólnak.

A másik problémám, hogy az üzeneteknél van Mask-olási és Filter (szűrési) lehetőség is, de egyenlőre nem találom, hogy mi is a különbség a kettő között, mert mind a kettőre azt írja, hogy az azonosítót nézi és nem egyezés esetén nem foglalkozik a csomaggal.

Előre is köszönöm a válaszokat!

Üdv!

AN713
AN228
AN754
AN738
(#) Danix hozzászólása Jan 7, 2007 / 4
 
Hali!

Bocsánat a késői válaszért, most is csak véletlen találtam ezt a topicot. Egyszer csináltam egy készüléket pic18f458-cal CAN (nem ECAN!) buszra, szívesen segítek, ha tudok. Kérdéseidre válaszolva dióhéjban:
1. A bufferekben vannak az üzenetek, azért van több, mert ha pl multitaskos rendszert fejlesztesz, teljesen külön tudják összerakni az egyes (vagy együvé tartozó) üzeneteket a folyamatok. Fogadásnál, azért van több h az üzeneteket le tudd már eleve válogatni.
2. ha érkezik egy üzenet, akkor az csak akkor lesz fogadva, ha vmelyik, filter regiszterben megadott cím egyezik az üzenetben címzettként megadottal, de elegendő csak a filterhez tartozó maszk regiszter által kijelölt biteknél. Így megoldható, h a piced ne csak egy bizonyos címmel fogadjon, hanem egy komplett címtartománnyal, vagy akár többel is.

Remélem nem érkeztek a válaszok későn, ha nem volt világos, vagy van még kérdésed nyugodtan írj.
(#) Norberto válasza Danix hozzászólására (») Jan 7, 2007 /
 
Sziasztok!

Ki tudnátok fejteni esetleg bővebben, hogy egy PIC-es rendszerben hogy is megy a multitaszkos vezérlés/kezelés?
(#) Tomee válasza Norberto hozzászólására (») Jan 7, 2007 /
 
Ha jól tudom akkor minden taszk kap egy időegységet ami alatt futhat.
Szerintem egy timer + ugrótábla szükséges hozzá.
Ha lejár a timer akkor megszakítás és ha timer megszakítás volt akkor tábla ponter növelése és ugrás a következő taszkra.
Ha rosszul gondolom/tudtam akkor javitsatok ki.
(#) Danix hozzászólása Jan 7, 2007 /
 
Tomee jól gondoltad, tényleg lehet így is csinálni, ezt hívják időosztásos fix időközös rendszernek (vagy vmi hasonlónak). Időosztásosból is létezik több féle, és ezen kívűl van még prioritásos, és abból is több fajta. A multitaszknál nem az a legnagyobb nehézség, h az egyes process-ek h váltják egymást (hogy birtokolják a processzort mint erőforrást), hanem h hogyan osztoznak az erőforrásokon.
Nem szeretnék belemenni a részletekbe mert az nagyon hosszú lenne, erre vannak külön technikák. Sztem a multitaszkot, nem ebben a topicban kéne megvitatni, ha tényleg érdekel akkor sztem hozzunk létre neki egy topicot, bár sajna annyira nem vok otthon ebben a témában, úgyhogy olyan túlsokat nem tok segíteni.
(#) abdul válasza Danix hozzászólására (») Jan 8, 2007 /
 
Szia Danix!

Köszönöm a választ, időközben én is rájöttem a megoldásra!


Egyébként amit írtál az operációs rendszerről, azt a Microchip azt hiszem úgy hívja a honlapján (persze nem a Microchip találta ezt ki) hogy RTOS (Real Time Operating System), de még nem volt olyan alkalmazásom amihez kellett volna.

Sziasztok!
(#) tmarcell hozzászólása Máj 27, 2008 /
 
Sziasztok!

CAN buszon szeretnék összekötni néhány 18F458-as PIC-et. A CCS fordítóhoz adott példaprogramot rátöltöttem 2 PIC-re. Az egyiknek elvileg 2 másodpercenként kellene küldenie egy csomagot, amit a másik vesz, és RS232-n keresztül megjelenít. A gyakorlatban azonban csak 3db csomag feladása történik meg, vétel egy se.
Ez az első CAN buszom, és nem tudom, hol keressem a hibát. Tudna valaki tanácsot adni?

Előre is köszönöm.
(#) Last_Scout válasza tmarcell hozzászólására (») Máj 28, 2008 /
 
hát lehet, hogy írnék bele olyat, hogy ha megnyomsz egy gombot azon ami a soros porton van, akkor küld valamit a portra, hogy az biztos legyen, hogy működik...
Megnézném a buszcímeket, hogy mindenhol jól vannak-e írva....
honnan tudod, hogy 3 megy ki, és hogy nincsen vétel?
(#) tmarcell válasza Last_Scout hozzászólására (») Máj 29, 2008 /
 
A 3 kimenőt onnan tudom, hogy a küldőt rákötöttem a sorosportra, és sikeres küldés esetén kiírja az elküldött adatot. Ez összesen 3x történik meg. A vételt meg abból gondolom hogy nem működik, mert ha a vevő van a sorosportra kötve, akkor a bejelentkező üzenet után semmi mást nem ír ki, pedig sikeres vétel esetén a vett adatnak meg kéne jelennie.
Elküldöm a mintaprogramot. Az egyik pic-be a küldő, a másikból a vevő kódrészlet van kihagyva.
A buszcímeket hogy érted? Elvileg az összes csomagot fogadnia kellene. Vagy nem?
(#) Last_Scout válasza tmarcell hozzászólására (») Máj 30, 2008 /
 
Ajánlom figyelmedbe a mikrovezérlő leírását... egyetlen sikeres küldés sem történt, mindössze annyi, hogy 3 db send buffer van, és ezek megteltek, azért nem megy tovább...
tovább még nem tudom, sosem foglalkoztam még CAN-el, meg C-ben még nem írtam PIC progit, de nézem még mert teccik
(#) Last_Scout válasza tmarcell hozzászólására (») Máj 30, 2008 /
 
valószínűleg nem történik meg egyetlen sikeres küldés sem...
Azt a makrós részt nem tudom micsoda, ahol a can_kbhit(), meg a can_tbe() van definiálva, de valószínűleg működik, ha az első 3 alkalommal jön cucc...
Igazából a can_init() és az abból meghívott dolgokban kéne keresni a problémát, mert úgytűnik, hogy a küldés része jó... ami a főprogramban van jó...
igazából én abban sem látok semmi kivetni valót...
áttálítja config módba, beállítgatja a kis dolgait, és visszaállítja normál módba....
Elvileg annak a résznek nem is kéne baja legyen, gondolom az a gyári microchipes téma....
esetleg átírhatnád az adót, hogy a két másodperces rész mindenképpen lefusson, és belül legyen még egy if a küldéssel, és 2 másodpercenként kiírhatná a bus-off bit állapotát, vagy a TXERRCNT tartalmát, és akkor lehet, hogy közelebb lennénk a megoldáshoz...
(#) Last_Scout válasza tmarcell hozzászólására (») Máj 30, 2008 /
 
ja valami kép a hardwerről?
bár ennél szerintem olyan nagy baj nem lehet...
nem tudom, olvastál-e a can működéséről... én lég régen, de van a bitfolyamban egy arbitrációs mező, ami arra jó, hogy a fonotosabb üzenetek élvezzenek elsőbséget...
vannak recesszív, meg domináns bitek, már nem tudom melyik melyik, de asszem a 0 a domináns... elkezdik küldeni a biteket, és figyelik, hogy mi jelenik meg a buszon, ha valaki fontosabb üzenetet akar küldeni, akkor domináns bitek vannak elöl az arbitrációs mezőben, vagyis ha aki véletlenül pont vele egyszerre kez el küldeni és recesszívet küld annak az üzenetét elnyomja... és az tudja ettől, hogy be kell kussolni, és a fontosabb üzenet áttmegy pl "légzsák nyíjjá ki!" fontosabb minthogy "több üzemanyagot kell befecskendezni, mer mittommivan" mivelhogy ezt a buszrendszert igazából autókhoz fejlesztették ki.
Szóval ha valami nem jól van bekötve, és folyamatosan el van nyomva az adás, akkor nem megy átt az üzenet...
minden egyes alkalommal amikor nem megy átt az üzenet az növeli az error countert... ha az eléri a 255-t akkor feladja, vagy nem tudom, de arra vár, hogy x db valamilyen bitet vegyen, és csak akkor próbálkozik újra...

szóval jólenne látni a számláló tartalmát, ezzel csak arra akartam kilukadni.

írjál, ha van valami....

remélem nem volt nagyon összevissza amit írtam...
(#) tmarcell válasza Last_Scout hozzászólására (») Jún 1, 2008 /
 
Egyenlőre teszt jelleggel van egy toldott foldott panel. CAN illesztőnek mcp2551-et használok. Könnyen lehet, hogy valamit félre kötöttem, mert az IC adatlapján nincsen ajánlott bekötési rajz. Így kötöttem be:

1. láb: a PIC CANRX lábára
2. láb: GND
3. láb: +5V
4. láb: a PIC CANTX lábára
5. láb: -
6. láb: CANL
7. láb: CANH
8. láb: GND

A busz 2 vezetéke közé mindkét végén 1-1 120 Ohmos ellenállást kötöttem.
Ha ez így szerinted is jó, akkor legalább a hardverhibát ki lehet zárni (bár azt könnyebb kijavítani) és mélyebben bele kell ásni magam a szoftverbe.

Tudsz valami doksit ajánlani a CAN buszról? Okulásként nem ártana valamit olvasnom róla.
(#) Last_Scout válasza tmarcell hozzászólására (») Jún 2, 2008 /
 
Igazából én sem sokat tudok a CAN-ról, csal beleolvastam a doksiba, ahol láttam magyar leírást az a Kónya féle mikrovezérlős könyv, hát ha nagyon akarsz, akkor ki lehet belőle szűrni információkat, azt nem hiszem, hogy a CAN specifikáció elolvasásával többre mennél...
http://zeus.nyf.hu/~elat/can_busz.ppt
talán nézd meg ezt, nem tudom ki csinálta, de ugylátom elég lényegretörő.
De amit eddig biztosan tudok neked mondani az az, hogy a program küldés részével nincsen baj, beteszi az adatokat a küldő bufferba, és amikor megtelik a 3 buffer, akkor nem tudja már őket hova tenni, és azért telik meg a buffer, mert valamiért nem tudja elküldeni, vagy rosszul van beállítva, vagy vagy valami hardverhiba van...
kapcsolási rjazod nincsen?
(#) kobold válasza tmarcell hozzászólására (») Jún 2, 2008 /
 
Ajánlott rajz ugyan valóban nincs, de leírják egy párszor, melyik lábnak mi a funkciója. Ha úgy kötötted be, ahogy írtad is, akkor az 1-es és 4-es lábak fel vannak cserélve, vagyis semmiféle üzenet nem jut ki a buszra, illetve nem érkezik meg onnan, a kontroller felé.
(#) tmarcell válasza kobold hozzászólására (») Jún 2, 2008 /
 
Mégegyszer átnéztem a doksikat, és igazad van. Tényleg felcseréltem.
Megzavart, hogy az RS232-nél Rx-et Tx-el kötjük össze. Megcseréltem a két lábat, de továbbra is ugyanaz a hejzet. Lehet hogy kipurcant a buszillesztő IC. Majd kipróbálom újakkal is, de azt előbb venni kell.

Köszönöm az eddigi segítségeteket.
Majd írok, mi lett.
(#) kobold válasza tmarcell hozzászólására (») Jún 2, 2008 /
 
Tehetnél fel egy képet a kapcsolásról, lehet, gyorsabban menne a dolog. A 2551-est amúgy nem olyan könnyű kinyírni, strapabíró kis darab. Vcc lábán van kondi (100 nF)? A buszvezetékek mindkét oldalon jó polaritással vannak csatlakoztatva? Egyesével is le tudod őket tesztelni: kösd össze a buszt, vedd ki a kontrollereket, csak a 2551-esek maradjanak a panelon, na meg a táp. Ha mindkét transceiver TxD lábát szabadon hagyod, akkor a CANH és CANL vezetékeken a testhez képest 2.5 V körül kell mérned (a kettő közti különbség 0.5 V alatt), az RxD lábaikon pedig logikai "1"-et, azaz 4 V fölött valamit. Ezután felváltva 0-ra kell húzni előbb az egyik, aztán a másik 2551-es TxD vonalát; a buszon mindkét esetben a CANH vonal szintjének legalább 0.5 V-tal a CANL vonal fölött kell lennie, az RxD vonalakon pedig logikai "0", azaz max. 0.8 V kell, hogy legyen. Ha ez kézzel kapcsolgatva így működik, a transceiver-ek üzemképesek, és inkább a progiban lesz valami baj.
(#) tmarcell válasza kobold hozzászólására (») Jún 3, 2008 /
 
Itt a nyák rajza. Kapcsolási rajzot nem csináltam róla, de szerintem elég jól el lehet igazodni rajta. A rajzon még a PIC és a 2551 között fordítva van az összeköttetés. Azóta már átfordítottam, és kondit is raktam a Vcc lábra.

Megmértem amiket írtál. Szabadon hagyva a TxD lábat CANL és CANH is testhez képest 2,53V, RxD lábakon 5,03V. TxD-t 0-ra húzva a helyzet változatlan. A CANL és CANH között mért fesz mindig 0V.

A busz bekötését is kimértem: a 2551 lábain mérve CANL-CANL illetve CANH-CANH 0 Ohm, CANL-CANH mindkét variációban 60 Ohm.

névtelen.JPG
    
(#) kobold válasza tmarcell hozzászólására (») Jún 3, 2008 /
 
Az említett korrekciókat figyelembe véve jónak tűnik a rajz. Talán annyit mondanék, hogy ha legközelebb tervezel ilyet, a CAN vezetékeit a lehető legrövidebbre készítsd a csatlakozás és az interface-chip között (főleg 250 kbps és afölötti sebességnél), és ha nem muszáj, ne keresztezd őket átkötésekkel.
A leírásod alapján mindkét transceiver rossz; esetleg meg lehetne még próbálni ugyanezt a mérést, de nyitott buszon, vagyis külön-külön a két panelt, de sokat már nem várhatunk ettől. Csak azért említettem, mert mindig utálom, ha egyszerre két elem is tönkremegy...
(#) tmarcell válasza kobold hozzászólására (») Jún 3, 2008 /
 
Nyitott busszal megváltozik a helyzet!
CANH 2,46 V
CANL 2,54 V
De sajnos csak ennyi változik. TxD akár 0, akár 1 RxD mindig 1, és a CANH és CANL sem változik.
Tehát mehetek a boltba...
(#) kobold válasza tmarcell hozzászólására (») Jún 3, 2008 /
 
Valami olyasmi, igen...
(#) Last_Scout válasza kobold hozzászólására (») Jún 6, 2008 /
 
Szerintem a programja jó...
Gyári init rutint használ hozzá, és a send bufferbe bekerülnek az adatok amíg van hely.

(#) tmarcell válasza kobold hozzászólására (») Jún 7, 2008 /
 
Megvettem az új IC-ket és ugyanazt mértem mint a régiekkel. A CANL-CANH közötti különbség csak nyitott busz esetén van meg, az RxD pedig mindíg logikai 1. Feszültség értéke a TxD-től függ. Ha lebeg a TxD akkor 4,9V, ha 0-ra húzom akkor 5,02 körül. Átnéztem a panelt is hogy nincs e benne szakadás vagy zárlat, de nem talátam semmi ilyesmit. Mit lehet kezdeni ilyenkor?
(#) tmarcell válasza tmarcell hozzászólására (») Jún 7, 2008 /
 
MŰKÖDIK!!!
Nem tudom mi volt a hiba, de az új IC-ket beraktam a panelba, betöltöttem a progikat, és elindult rendben!
Köszönöm mindenkinek a segítséget!
(#) dino05 hozzászólása Szept 17, 2008 /
 
Sziasztok!

Kezdőként egy Can illesztést szeretnék csinálni, PC-s játékpedálok can buszon történő kommunikációjára a pc-vel. A hardver fő elemei ugye a kontroller és a can adó-vevő. Az a kérdésem, hogy milyen szempontok alapján válasszak mikrovezérlőt? Nincs semmi tapasztalatom ilyenben, mekkora flash + eeprom stb... szükséges? Ehhez ha adnátok vmi támpontot azt megköszönném.

Üdv, dino
(#) jym válasza dino05 hozzászólására (») Szept 18, 2008 /
 
Szia.

Ha PIC-el akarod, akkor olyant amiben van HW-CAN, tehát ne külső MCP2515 kelljen mellé. Pl. 18F2480 vagy 18F2580. Ezek rendelkeznek akkora program/RAM memóriával, hogy egy C-ben implementált CAN+kisebb körítés is bőven 40-60%-ba belefér (tapasztalat). Ha CANopen vagy DeviceNet is kell, akkor nagyobbat válassz. Ipari helyen a CAN illesztő IC optoval (2db 1 a TX-re, 1 az RX-re) le van választva a kontrollertől, és egy galvanikusan leválasztott DC5/5 konverterrel van a táp átvive. CAN illesztőnek PCA82C251 javasolt, ezt alkalmazzák szinte minden "gyári" ipari környezetbe is alkalmasnak talált készülékben (tehát nem MCP2551-et). A CAN timing elég szűk, mindenképp KVARC kell a kontrollerre, és abból leosztani a CAN timer-t. Néhány fórum szerint a MicroChip kontrollerek belső PLL-jének jitterje olyan nagy, hogy 1Mbps sebességen nem használható, vagyis ilyenkor ezt ki kell kapcsolni, és egy nagyobb kvarcot kell használni. Általános probléma a microchip kontrollerekkel, hogy a CAN regiszterek bonyolult bitszervezésűek, így egy C-ben írt programnak olyan sok dolga van, hogy képtelen egy 1Mbps kapcsolatot full sávszélességgel kiszolgálni. Ha AVR, akkor AT90CAN32 vagy AT90CAN64 vagy AT90CAN128.

Imi.
(#) jym válasza dino05 hozzászólására (») Szept 18, 2008 /
 
Szia.

PC oldalra: mindenképp valamilyen szabványos, a nagy gyártók által is alkalmazott technikákat kell alkalmazni az illesztésre. Vagy RS232<->CAN vagy USB<->CAN.

Példa USB<->CAN-re:
Bővebben: Link
Erről van tapasztalatunk, ipari környezetben is extra stabil, linux alatt is jól megy.

Példa RS232<->CAN-re:
Bővebben: Link
És itt a jobboldali. A downloads alatt van manual, ott részletesen leírja, hogy hogyan kell programozni. Ez alapján lehet készíteni egy saját implementációt is akár.

Imi.
(#) ciw hozzászólása Szept 18, 2008 /
 
Én éppen mcp2515-el szívok. Olyan sok regisztere van, hogy elveszek bennük.

Nagy segítség lenne egy demo, vagy valami, ami htpicc18 alatt lefordul.

AVR re van rengeteg projekt, de pic-re csak a mikrocsippes maszlagok amik rommádefiniálhatóak.

Csak annyit akarok vele, hogy listen módban ráakasztom a buszra és minden forgalmat kiolvas.
(#) jym válasza ciw hozzászólására (») Szept 18, 2008 /
 
Szia.

Én a Microchip féle fordítót használom, de szerintem átültethető htpicc-re.

Lásd melléklet.

Imi.

mcp2515.zip
    
(#) ciw válasza jym hozzászólására (») Szept 18, 2008 /
 
Köszönöm, ez brutálisan jó !

Végülis van mcc fordítóm, próbának meg mindegy, hogy miben fordítok.

A mainben elég csak a szokásos:

-cpu és port init
-spi init
-MCP2515 init

és lehet is garázdálkodni ?
Következő: »»   1 / 2
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