Fórum témák
» Több friss téma |
Fórum » PIC16F877 kommunikáció
Témaindító: kobela1969, idő: Aug 26, 2008
Témakörök:
Sziasztok.
Nem régen kezdtem el PIC-ekkel foglalkozni. Építettem egy 16F877 próbapanelt MAX232-vel kommunikációs feladathoz mobilokkal. Van némi elektronikai és programozási ismeretem is, de elakadtam egy problémával: At parancsot küldve a mobilnak, a válasz infót (pl ki a hívó) szeretném felhasználni (MikroC). Ha pl. egy nyomógomb felhasználásával at parancsot küldök a mobilra (pl sms küldés egy számra) az rendben működik. Azt gondoltam a rutinom nem jó, ezért a Windmill Comdebug terminál programmal elkezdtem tesztelni a kommunkációt. R-I-N-G adatot várnék a mobiltól, ezért ezzel kezdtem a tesztet. Válaszként a terminál progiban azonban furcsa dolgot tapasztaltam, ilyen érték jön: R-I-N-R-I-N-R-I ha több karaktert küldök, még furcsább értékek íródnak a változókba. program fontosabb részei a következők: int fogadott1; int fogadott2; int fogadott3; int fogadott4; int fogadott5; int fogadott6; int fogadott7; int fogadott8; USART_Init(19200); if(USART_Data_Ready()) { // ha adat erkezik fogadott1=fogadott2; fogadott2=fogadott3; fogadott3=fogadott4; fogadott4=fogadott5; fogadott5=fogadott6; fogadott6=fogadott7; fogadott7=fogadott8; fogadott8=USART_Read(); // erkezo adatok beolvasasa } if (Button(&PORTB, 2, 1, 1)) rb2lab = 1; if (rb2lab && Button(&PORTB, 2, 1, 0)) { USART_WRITE(fogadott1); USART_WRITE(fogadott2); USART_WRITE(fogadott3); USART_WRITE(fogadott4); USART_WRITE(fogadott5); USART_WRITE(fogadott6); USART_WRITE(fogadott7); USART_WRITE(fogadott8); rb2lab = 0; } Minden segítséget előre is köszönök.
Hű, miez a rettenet ? Nem lenne egyszerűbb egy stringbe olvasni be a bejövő karaktereket ?
szia
köszi a választ. az usart_read() nem int tipusban adja vissza az értéket? a helpben ezt olvastam, ezért gondoltam hogy ez jó lesz. most is olvasgatok a neten ez ügyben, másoknak is hibáznak a visszajövő értékek, a pic doksija szerint SPBRG értékét 19200-as sebességnél 12-re kell állítani, de így sem jók a visszajövő adatok.
Milyen órajelen járatod?
igazából ezt szeretném elsőre, itt is int tipusra hivatkozok:
// RING-e a fogadott adat if(fogadott1==82 & fogadott2==73 & fogadott3==78 & fogadott4==71) { PORTD = ~PORTD; delay_ms(300); PORTD = ~PORTD; /led villogtatas }
4 MHz-es osc, azt írja a pic pdf, hogy SPBRG 12 legyen, így a tévesztés is kb. 0,16 vagy valami ilyesmi
Önmagában szrtring típus c-ben nincs csak karakter tömb. Amikor lidi azt írta, hogy sztringbe bizonyára tömbre gondolt. A bejövő adatokat szépen egy ciklusban, amit annyiszor hajtasz végre ahány bájt kell, (vagy addig, amig egy bizonyos bájt nem jön) olvasod be egy tömbbe, miközben a tömb indexét növeled.
Idézet: „if(fogadott1==82 & fogadott2==73 & fogadott3==78 & fogadott4==71)” Itt bizonyára a "&" helyett "&&"-t akartál írni. Nem mindegy!
ezzel is próbálkoztam, nem sikerül:
SPBRG = 0x0C; // 19200 sebesseghez decimalis 12 spbrg tartozik 16F877 picnel RCSTA = 0x90; TXSTA = 0x24; Ezt: 013 010 R I N G 013 010 küldök, ez jönne a mobilról is, de ilyen jön vissza pl: 255 254 255 031 191 013 010 R még egy küldés és ez: 031 191 013 010 R 013 010 R még egy küldés és ez: 010 R 013 010 R 013 010 s olyan mintha csak 3 byte-tot kapna küzdök tovább ...
bocsánat, valóban && a logikai "és"
Sziasztok
A osc órajele nagyon befolyásolhatja az UART pontosságát. Kerek órajelekre adják meg a hibalehetőséget, ami azt jelenti, hogy pár karakter után tévesztenek... Én is szívtam ezzel, 460800 baudon nyomtam a kommunikációt és tévesztett, pedig 40Mhz-n ment a proci. Ezért ha UART-ot alkalmaztok, akkor használjatok erre fejlesztett QUARZokat. Lehet kapni és árban ugyan az! Mivel a 877-es bírja a 20Mhz-t is, a következő órajeleket tudod hozzá használni/megvenni: 3.686400Mhz 7.372800Mhz 11.059200Mhz 14.745600Mhz 18.432000Mhz mindegyik kapható és csak 29Ft A hibázás a szinkronban 0!
Idézet: „SPBRG = 0x0C; // 19200 sebesseghez decimalis 12 spbrg tartozik 16F877 picnel RCSTA = 0x90; TXSTA = 0x24;” Ezek abeállítások 4MHz-re és 19200 baud-ra jók. A többit nem értem. Te küldöd a mobilnak a "RING"-et?
Azt szeretném konkrétan elsőre megcsinálni, hogy ha valaki megcsörgeti "a picre kapcsolt mobilomat", akkor ellenőrizni szeretném hogy RING jön-e a mobilról, és ha igen akkor at parancsot küldve a hívószámot ellenőrizni.
Csak az a baj, hogy ha valaki pl csörgeti, csörgeti a mobilt és nem jön mind a négy karakter(82,73,78,71) akár sorban, akár nem sorban akkor a hívószám ellenőrzésnél pláne bajban leszek később.
Köszönöm szépen a válaszodat.
Amikor megépítettem az ezidáig első és egyetlen panelemet, akkor csak vettem egy 4Mhz-es kvarcot 2 db 15pF-es kondival és kész. Minál magasabb az órajel, annál pontosabb az átvitel? Megpróbálom a felsorolt kvarcokkal.
Udv!
A PICet csak siman rakototted a telefonra, vagy hasznalsz illesztest is? Gondolom a PICet 5V-rol jaratod, a telefonok digitalis resze viszont 3.3V-osak. Esetleg ha valtanal 18F-es szeriara, azokat jarathatnad 3.3V-rol is, es az illesztessel sem lenne gond.
Miért kellen mind a négy karakter a ring-ből. Nézd végig az at parancs leírásodat, de szerintem egy másik válasz sem kezdődik 'R'-rel, így szerintem elég azt ellenőrizni, hogy az jött-e.
És ha előre lekodolt üzenetet küldesz a pic-ből, az jól megjön a terminálba ?
Azert kell mind a 4 karakter a RING-bol, mert ha a hivo szamat akarja kiolvasni, abbol nem eleg egy szamjegy
![]()
Hogy függ össze a 'RING' 4 karaktere a hívószámmal?
Bejön a 'RING' elkezded kiolvasni, az RCREG-ből először az 'R' jelenik meg. Erre kiküldöd a hívószám bekérést: AT+CLCC 'CR' A választ a telefon elküldi. A bufferben benne van még a 'RING' többi része, de azzal nem foglalkozol, mert először megkeresed a telefonszámod elejét. Mivel úgy jön a válasz hogy benne van a "+36", addig olvasod, amig az első 6-ossal találkozol, azután már a kérdéses számnak kell jönnie. Ezt is egyesével olvasva az első eltérésnél már ki is léphetsz az ellenőrzésből.
Ugy, hogy ha a RING-bol csak egy karaktert vesz hiba nelkul akkor nem valoszinu, hogy a hivoszam hibatlan lesz
![]() Amugy az AT parancsokhoz nem ertek, de USART-ot majdnem minden projectemben hasznalok.
en is 16f877-esel akarok UART-os dolgot csinalni
ugyanez a problemam ring aztan telefonszam edig szivtam mar 16f628-al es volt mukodot cuccom 16f84-el softwaresen megoldva szerintem fejleszthetnenk egyut
azért szeretném nem csak a "R" karaktert ellenőrizni, mert később a hívó telszámára is szükségem van és ott már minden szám pontosan kell.
most nincs rajta mobil, csak a pc terminált használom.
küldök valamit a pic-nek, beírom változókba és ezek értékeit visszaküldöm a terminálra. addig amíg nem jók a visszakapott értékek, telefont ráse kötök. ha pl. rákötöm a telót és egy nyomógombra küldök egy sms-t, az simán működik. de válaszokra is szükségem lenne majd a telótól.
szia
mikor elkezdtem "pic-ezni", nézegettem, hogy milyennel is kellene kezdeni. Csak Microchip félékkel akartam, ehhez van fejlesztő ingyenes. 16F628, 16F84 és 16F877 tipusok valamelyikén gondolkodtam. Azért 16F877-re esett a választásom, mert olvastam a "topi" féle Nullától a robotokig esszét. Vettem a többi tipusból is, hátha .... "pici" válaszában sejtem a probléma gyökerét, az órajel körül lehet a hiba szerintem. Jelenleg 4Mhz kvarcot és kétszer 22pF kondit használok, mivel épp PIC16F877-04I/P tipusú picem van. Lehet hogy ez az osc nem pontos?
külön kéne választani a problémát, ezért mondtam hogy probalj meg elore lekodolt uzenetet küldeni picből. Igy kiderül hogy a vétellel van e gond vagy az adással.
szia
tettem egy pic bemenetre nyomógombot és hozzárendeltem egy at sms küldés egy telszámra parancsot, ez szépen működik telóval és pc terminállal egyaránt. az a baj, hogy telóval és pc terminállal is a pic-re érkező adatok nem pontosak, így hiába próbálom változóba írni őket, nem tudok velük mit kezdeni. érdekes dolgot vettem észre: 8 karaktert küldök, és minden egyes küldés után a változókba írt 8 érték úgy változik, hogy az utolsó 5 karakter 3 helyiértékkel sorban feljebb kerül és új 3 kerül sorban a végére, de a néha a 3 karakterből egy hibás.
a program fontosabb részei mégegyszer:
Usart_Init(19200); SPBRG = 0x0C; RCSTA = 0x90; TXSTA = 0x24; if(USART_Data_Ready()) { // ha adat erkezik fogadott1=fogadott2; fogadott2=fogadott3; fogadott3=fogadott4; fogadott4=fogadott5; fogadott5=fogadott6; fogadott6=fogadott7; fogadott7=fogadott8; fogadott8=USART_Read(); // erkezo adatok beolvasasa } if (Button(&PORTB, 2, 1, 1)) rb2lab = 1; if (rb2lab && Button(&PORTB, 2, 1, 0)) { USART_WRITE(fogadott1); USART_WRITE(fogadott2); USART_WRITE(fogadott3); USART_WRITE(fogadott4); USART_WRITE(fogadott5); USART_WRITE(fogadott6); USART_WRITE(fogadott7); USART_WRITE(fogadott8); r2lab = 0; }
Kérdésedre, hogy használok-e szintillesztést, igen max232-vel 1 mikros kondikkal.
A picen 4Mhz kvarc 2x22pF kondenzátorral, 100 mikro az 5V-os stabic bemeneten, a kimeneten 100 nF-os kondi szűrés a pic felé. Telefonnal működik a küldés, ha utasítom a pic-et, vissza nem azt kapom a telótól, amit várnék. Most csak pc terminállal próbálom tesztelni, de ezzel sem sikerül. A terminálon jól megjelenik, ha valamit direktbe kiküldök a pic-ről, de ha küldök valamit a pic-nek és ha ezt Usart_read() függvénnyel változókba írom, nem jók az adatok.
tehat ugyanarrol beszelunk...
a vetellel van a gond, es nagyon valoszinu hogy amit mar fonteb leirtak a quartz frekvenciaja a ludas en ohsonnal fejlesztek, mert nekem az szimpatikus de asm-ben irt programmal is ugyanaz volt... 100% hogy hardwarebol jon a problema a PIC sokkal erzekeneybb a vetelnel mint pl. egy PC uart-ja probalkoztam mar szintilesztessel a telefon 3.3V-ja miatt... de nemt persze rajottem hogy pc-vel sem megy... en sajnos most nem tudok beszerezni megfelelo frekvenciaju quartzot... de ki kellene probalni azzal... en erre a problemara nem gondoltam de nagyon valoszinu hogy az lesz kobela adj egy messengeres elerest...
Én is azt mondom, válaszd szét a kommunikáció ellenőrzését.
Először a telefont kösd össze a PC-vel. Nézd meg, hogy hogy jól válaszol-e. (Milyen telefonod van?) ATE0-val kapcsold ki a parancs echot, majd sima 'at'-kre OK-val kell válaszolnia. Csörgesd meg a telefont! Ekkor jönnek a 'RING'-ek, ha közben kiküdöd az 'at+clcc' parancsot meg is kell kapnod a választ. Ha ez már működik jöhet a pic. Melléklet, amit most csináltam. A terminálban a kisbetűs, amit én küldtem, nagybetűs, amit a telefon válaszolt. |
Bejelentkezés
Hirdetés |