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:
Lapozás: OK   1 / 3
(#) kobela1969 hozzászólása Aug 26, 2008 /
 
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.
(#) lidi válasza kobela1969 hozzászólására (») Aug 26, 2008 /
 
Hű, miez a rettenet ? Nem lenne egyszerűbb egy stringbe olvasni be a bejövő karaktereket ?
(#) kobela1969 válasza lidi hozzászólására (») Aug 26, 2008 /
 
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.
(#) Gory válasza kobela1969 hozzászólására (») Aug 26, 2008 /
 
Milyen órajelen járatod?
(#) kobela1969 válasza kobela1969 hozzászólására (») Aug 26, 2008 /
 
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
}
(#) kobela1969 válasza Gory hozzászólására (») Aug 26, 2008 /
 
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
(#) MPi-c válasza kobela1969 hozzászólására (») Aug 26, 2008 /
 
Ö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!
(#) kobela1969 válasza kobela1969 hozzászólására (») Aug 26, 2008 /
 
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 ...
(#) kobela1969 válasza MPi-c hozzászólására (») Aug 26, 2008 /
 
bocsánat, valóban && a logikai "és"

(#) pici válasza kobela1969 hozzászólására (») Aug 26, 2008 /
 
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!
(#) MPi-c válasza kobela1969 hozzászólására (») Aug 26, 2008 /
 
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?
(#) kobela1969 válasza MPi-c hozzászólására (») Aug 26, 2008 /
 
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.
(#) kobela1969 válasza pici hozzászólására (») Aug 26, 2008 /
 
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.


(#) pako hozzászólása Aug 26, 2008 /
 
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.
(#) MPi-c válasza kobela1969 hozzászólására (») Aug 26, 2008 /
 
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.
(#) lidi válasza kobela1969 hozzászólására (») Aug 26, 2008 /
 
És ha előre lekodolt üzenetet küldesz a pic-ből, az jól megjön a terminálba ?
(#) pako válasza MPi-c hozzászólására (») Aug 26, 2008 / 4
 
Azert kell mind a 4 karakter a RING-bol, mert ha a hivo szamat akarja kiolvasni, abbol nem eleg egy szamjegy
(#) MPi-c válasza pako hozzászólására (») Aug 26, 2008 /
 
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.

(#) pako válasza MPi-c hozzászólására (») Aug 26, 2008 / 4
 
Ugy, hogy ha a RING-bol csak egy karaktert vesz hiba nelkul akkor nem valoszinu, hogy a hivoszam hibatlan lesz Es ha jol ertelmeztem az eddigieket a prolema az, hogy hibasan erzekeli a visszajovo parancsokat
Amugy az AT parancsokhoz nem ertek, de USART-ot majdnem minden projectemben hasznalok.
(#) MPi-c válasza pako hozzászólására (») Aug 26, 2008 /
 
Ha úgy nem.
(#) accesid válasza kobela1969 hozzászólására (») Aug 27, 2008 / 4
 
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
(#) kobela1969 válasza MPi-c hozzászólására (») Aug 27, 2008 /
 
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.
(#) kobela1969 válasza lidi hozzászólására (») Aug 27, 2008 /
 
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.
(#) kobela1969 válasza accesid hozzászólására (») Aug 27, 2008 /
 
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?
(#) lidi válasza kobela1969 hozzászólására (») Aug 27, 2008 / 4
 
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.
(#) kobela1969 válasza lidi hozzászólására (») Aug 27, 2008 /
 
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.
(#) kobela1969 válasza kobela1969 hozzászólására (») Aug 27, 2008 /
 
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;
}
(#) kobela1969 válasza pako hozzászólására (») Aug 27, 2008 /
 
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.
(#) accesid válasza kobela1969 hozzászólására (») Aug 27, 2008 /
 
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...
(#) MPi-c válasza kobela1969 hozzászólására (») Aug 27, 2008 /
 
É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.

terminal.png
    
Következő: »»   1 / 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