www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

PIC USART problem
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
wicket
Član
Član



Pridružen-a: Sob 28 Maj 2011 15:19
Prispevkov: 29
Aktiv.: 0.19
Kraj: Ljubljana

PrispevekObjavljeno: Pon Mar 17, 2014 11:55 am    Naslov sporočila:  PIC USART problem Odgovori s citatom

Zdravo,

Uporabljam PIC16F628A USART za komunikacijo s SE T610 GSM. MikroC compiler.

Vezje:


Kako program deluje - ko gre RB0 na high, uC pošlje "at" GSMu in ta odgovori "OK". Potem preverim, če dejansko prejmem "OK". Dela - če prejmem O, K, \n ali \r se ledica prižge..

Problem - Isti program in vezje (s potrebnimi pin prilagoditvami, seveda) poskušam usposobiti s PIC18F4520 in PIC16F887, ampak ne dela.

Oddajanje uC deluje, ker sem testiral s pošiljanjem komande "atd" in GSM pokliče. Prav tako nekaj prejmem nazaj (testirano pridem v interrupt routine), ampak ko primerjam prejete char-je, se mi ledica ne prižge na nobenem od O, K, \n ali \r.

GSM sem tudi direktno povezal s PC in testiral preko putty. Deluje, zato napaka sigurno ni na strani GSM.
Napetosti Tx and Rx pinov so pravilne, na žalost pa nimam dostopa do osciloskopa, da bi preveril kaj zaboga dejansko prejemam. Probal sem tudi z različnimi frek. notranjega oscilatorja in različnimi baudrate-i, ampak nič.

Ne razumem zakaj dela na 16F628A, na drugih dveh pa ne. Prebral sem datasheete vseh treh glede USARTa in ne najdem razlike v potrebni konfiguraciji.

Vsaka pomoč je dobrodošla.

Koda s PIC16F887, kjer namesto PORTB uporabljam I/O na POTRD (se opravičujem za angleške komentarje, ker pomoč pač iščem tudi na tujih forumih):
Koda:

volatile unsigned char uart_rd = 0; // serial input byte (RCREG)
unsigned int b = 0;

// UART Initialization
void uartinit()
{
   UART1_Init(9600); // initialize UART module at 9600 bps
   Delay_ms(100); // let it stabilize
   PIE1.B5 = 1; // turn on USART interrupt bit RCIE
}

// UART Interrupt: Receive character
void interrupt()
{
   if (PIR1.B5) // if interrupt occurs - if RCIF = 1(RCREG full)
   {
      uart_rd = RCREG; // read incoming byte (character)
      if (uart_rd == 79) PORTD.B1 = 1; //if incoming byte is "O", turn on LED
      PIR1.B5 = 0; // reset RCIF flag bit to 0
   }
}

// Main program
void main()
{
   uartinit();

   INTCON = 0b11000000; // enable PEIE and GIE interrupts
   ANSEL = 0b00000000; // configure all pins as digital
    CM1CON0.B7 = 0; //komparatorja OFF
    CM2CON0.B7 = 0;
   TRISD = 0b01;
   PORTD = 0b00;   

   while (1)
   {
      if ((PORTD.B0 == 1) && (b == 0)) // if input goes high
      {
         b = 1; // set flag, so this if loop is disabled in future
         UART1_Write_Text("at"); // phones response should be "OK"
         UART1_Write(13); // \r
      }      
   }
}


Nazadnje urejal/a wicket Pon Mar 17, 2014 3:00 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
xfce
Član
Član



Pridružen-a: Čet 28 Jul 2011 8:06
Prispevkov: 521
Aktiv.: 3.38

PrispevekObjavljeno: Pon Mar 17, 2014 1:06 pm    Naslov sporočila:   Odgovori s citatom

Ali imaš uart to USB? Sam imam dva modulčka za uart in spremljam kakšna je komunikacija med PIC in GSM modulom.

V katerem okolju programiraš? Sicer ne vem kaj naredi funkcija UART1_Init(9600); očitno uporabljaš neko knjižnico. Sam grem čez dokumentacijo in nastavim registre in deluje.. Ali ta funkcija primerno nastavi porte, kot vhod/izhod..

Tale zadeva mi je čudna, to je register za ADC converter
ADCON1 = 0b0111; // configure all pins as digital

Glede na komentar si hotel uporabiti ANSEL = 0b00000000;
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
forest70
Član
Član



Pridružen-a: Ned 20 Jul 2008 1:00
Prispevkov: 588
Aktiv.: 3.08
Kraj: Koper

PrispevekObjavljeno: Pon Mar 17, 2014 1:19 pm    Naslov sporočila:   Odgovori s citatom

Kje pa imaš kvarc ?? Brick wall
Interni clock je preveč ne stabilen za uporabo uarta!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
wicket
Član
Član



Pridružen-a: Sob 28 Maj 2011 15:19
Prispevkov: 29
Aktiv.: 0.19
Kraj: Ljubljana

PrispevekObjavljeno: Pon Mar 17, 2014 2:03 pm    Naslov sporočila:   Odgovori s citatom

xfce je napisal/a:
Ali imaš uart to USB? Sam imam dva modulčka za uart in spremljam kakšna je komunikacija med PIC in GSM modulom.

V katerem okolju programiraš? Sicer ne vem kaj naredi funkcija UART1_Init(9600); očitno uporabljaš neko knjižnico. Sam grem čez dokumentacijo in nastavim registre in deluje.. Ali ta funkcija primerno nastavi porte, kot vhod/izhod..

Tale zadeva mi je čudna, to je register za ADC converter
ADCON1 = 0b0111; // configure all pins as digital

Glede na komentar si hotel uporabiti ANSEL = 0b00000000;


Imam tudi TTL v USB konverter, ampak nevem kako bi GSM hkrati priklopil na PIC in koverter? Da bi kar isti signal iz GSM peljal na oboje?

Programiram v MikroC, UART1_Init(9600) je inbuilt knjižnica, ki konfigurira RCSTA, TXSTA in BAUD (SPBRG vrednost avtomatsko izračuna na podlagi Fosc in podanega bauda). Probal sem tudi sam konfigurirati registre ampak isto neuspešno.

ANSEL register pri 16F887 ne obstaja, v registru ADCON1 se določa, kateri analogni vhodi naj bodo digitalni. Mogoče je štos ravno pri konfiguraciji bitov (analog, comparators off)? Pri 16F628A sem izklopil komparatorje s CMCON = 0b111;, vendar slednjih pri 887 ne najdem.

forest70 je napisal/a:
Kje pa imaš kvarc ?? Brick wall
Interni clock je preveč ne stabilen za uporabo uarta!


Na 16F628A in 16F887 delam z internim @ 4MHz. Na prvem nimam problemov z delovanjem.

Pri 18F4520 uporabljam pa HS @ 10MHz in mi prav tako ne dela.


Nazadnje urejal/a wicket Pon Mar 17, 2014 2:09 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
xfce
Član
Član



Pridružen-a: Čet 28 Jul 2011 8:06
Prispevkov: 521
Aktiv.: 3.38

PrispevekObjavljeno: Pon Mar 17, 2014 2:05 pm    Naslov sporočila:   Odgovori s citatom

Tukaj bi skoraj morala zadeva delovati. Točnost frekvence je pri temu PIC-u določena na +-1% pri 3,3V pri sobni temperaturi. Pri drugačni napetosti večji od 2,5V je +-2%

Pri nižjih napetosti in visokih nizkih temperaturah pa je natančnost +-5% kar je preveč.

Tako, da bi za testiranje pri sobni temperaturi pri 3,3V morala zadeva delovati. Za kakšno resno zadevo pa ta stvar seveda ni Very Happy
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
wicket
Član
Član



Pridružen-a: Sob 28 Maj 2011 15:19
Prispevkov: 29
Aktiv.: 0.19
Kraj: Ljubljana

PrispevekObjavljeno: Pon Mar 17, 2014 2:59 pm    Naslov sporočila:   Odgovori s citatom

Ups, ponesreči sem zloadal 877 datasheet namesto 887. Brick wall

Sem popravil kodo:
Koda:

ANSEL = 0b00000000; // configure all pins as digital
CM1CON0.B7 = 0; //komparatorja OFF
CM2CON0.B7 = 0;


Ampak rezultat ostaja isti. Pridem v interrupt routine, ampak prejeti byte ni enak nobenemu izmed O, K, \n ali \r.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
forest70
Član
Član



Pridružen-a: Ned 20 Jul 2008 1:00
Prispevkov: 588
Aktiv.: 3.08
Kraj: Koper

PrispevekObjavljeno: Pon Mar 17, 2014 3:15 pm    Naslov sporočila:   Odgovori s citatom

xfce je napisal/a:
Tukaj bi skoraj morala zadeva delovati. Točnost frekvence je pri temu PIC-u določena na +-1% pri 3,3V pri sobni temperaturi. Pri drugačni napetosti večji od 2,5V je +-2%

Pri nižjih napetosti in visokih nizkih temperaturah pa je natančnost +-5% kar je preveč.

Tako, da bi za testiranje pri sobni temperaturi pri 3,3V morala zadeva delovati. Za kakšno resno zadevo pa ta stvar seveda ni Very Happy


Prvo pravilo pri uporabi usarta je uporabiti pravo frekvenco - crystal npr.: 3,687000MHz Pri tej frekvenci je odstopanje 0% pri vseh baud rate
4Mhz ni idealna frekvenca pri uporabi usarta, ker ima baudrate določeno odstopanje 0,2%
Že pri 4,04 Mhz kar je odstopanje 1% je za usart pre več!! Enostavno stvari ne delajo kot bi morale.

P.S.
Zakaj s enim ja s drugim pa ne ? Preprosto, notranji oscilator pri enem je bolj točen ....
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Krampus
Član
Član



Pridružen-a: Pon 08 Sep 2008 13:07
Prispevkov: 1826
Aktiv.: 9.64

PrispevekObjavljeno: Pon Mar 17, 2014 3:28 pm    Naslov sporočila:   Odgovori s citatom

ANSEL = 0 ' Configure AN pins as digital I/O
ANSELH = 0

_________________
Nisem ravno najbolj pameten na svetu, tu in tam pa imam kakšno idejo.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
xfce
Član
Član



Pridružen-a: Čet 28 Jul 2011 8:06
Prispevkov: 521
Aktiv.: 3.38

PrispevekObjavljeno: Pon Mar 17, 2014 4:38 pm    Naslov sporočila:   Odgovori s citatom

@forest70 +-1% še ni preveč. Da bi prebral 9bit, je načeloma lahko +-4% odstopanja, se pa vse zadeve seštevajo, napaka oddajnika, napaka sprejmenika, potem signal ni čisto pravokoten, potem moraš biti v nekih mejah, tako, da ostanemo pri slabih +-2% za zanesljivo komunikacijo.

Za takole testiranje je notranji kristal povsem OK, za kakšno resno zadevo mora biti absolutno primeren kristal za temperaturno in napetostno stabilnost. V primeru, da daš to za zadevo na mraz ali sonce bo gotovo nehala delovati.

Če ima napako pri baudrate, lahko prebere bit za frame error pa bo (FERR). V kodi mu manjka branje napak in brisanje zastavic - to mu lahko zaustavi prekinitve.
bit 2
FERR:
Framing Error bit
1= Framing error (can be updated by reading RCREG register and receive next valid byte)
0= No framing error
bit 1
OERR:
Overrun Error bit
1 = Overrun error (can be cleared by clearing bit CREN)
0 = No overrun erro
The error must be cleared by either
clearing the CREN bit of the RCSTA register or by
resetting the EUSART by clearing the SPEN bit of the
RCSTA register
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 19.74

PrispevekObjavljeno: Pon Mar 17, 2014 4:44 pm    Naslov sporočila:   Odgovori s citatom

MCLR puščat "v zraku" je zelo pametno, če imaš rad mistične resete...
_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
VolkD
Član
Član



Pridružen-a: Pet 24 Sep 2004 21:58
Prispevkov: 14228
Aktiv.: 64.07
Kraj: Divača (Kačiče)

PrispevekObjavljeno: Pon Mar 17, 2014 7:15 pm    Naslov sporočila:   Odgovori s citatom

gumby je napisal/a:
MCLR puščat "v zraku" je zelo pametno, če imaš rad mistične resete...

xfce je napisal/a:
@forest70 +-1% še ni preveč. Da bi prebral 9bit, je načeloma lahko +-4% odstopanja, se pa vse zadeve seštevajo, napaka oddajnika, napaka sprejmenika, potem signal ni čisto pravokoten, potem moraš biti v nekih mejah, tako, da ostanemo pri slabih +-2% za zanesljivo komunikacijo.


Pa dobro kaj se tu sploh tu usajate, saj stvar pravzaprav približno dela. Vse je odvisno od tolerance !

Bodite bolj tolerantni, pa boste tudi s takim delovanjem, kot sedaj, ko ti ne dela, zadovoljeni.

_________________
Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
wicket
Član
Član



Pridružen-a: Sob 28 Maj 2011 15:19
Prispevkov: 29
Aktiv.: 0.19
Kraj: Ljubljana

PrispevekObjavljeno: Pon Mar 17, 2014 7:44 pm    Naslov sporočila:   Odgovori s citatom

MCLR imam dizejblan. Glede oscilatorja pa čisto možno. Bom jutri probal še z različnimi kristali. Poročam...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
xfce
Član
Član



Pridružen-a: Čet 28 Jul 2011 8:06
Prispevkov: 521
Aktiv.: 3.38

PrispevekObjavljeno: Pon Mar 17, 2014 7:56 pm    Naslov sporočila:   Odgovori s citatom

@VolkD
Tukaj nič ne kompliciram. V tem primeru mogoče fant nima oscilatorja pri roki. Lahko poizkusi tako, da mu mikrokrmilnik sporoča ali prihaja do napake v paritetnem bitu in bo videl ali ga heca baudrate. Sam dostikrat poganjam UART brez kristala za DEBUG namene - končni izdelek potem ne uporablja UART.

Pri končnem izdelku, se je pa potrebno res posvetiti stabilni frekvenci. Recimo vremeska hišica in sporočanje temperature preko GSM modula. Tukaj so temperature od -20°C do + 40°C, tukaj je res potrebno izbrati pravi kristal in tudi temperaturno obstojen.

Lahko se pa borimo za vsak cent in bi lahko v programu napisali funkcijo, da nam uglasi kristal (PIC ima to funkcijo), tako, da ga sinhronizira na baudrate od GSM modema.

Vglavnem, zunanji oscilator ni nujno potreben v vsakem primeru. Tja ga moramo dati z razlogom.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
VolkD
Član
Član



Pridružen-a: Pet 24 Sep 2004 21:58
Prispevkov: 14228
Aktiv.: 64.07
Kraj: Divača (Kačiče)

PrispevekObjavljeno: Pon Mar 17, 2014 8:41 pm    Naslov sporočila:   Odgovori s citatom

Če kdo misli, da jaz nisem nikoli naredil nobene polomije, potem se še kako krepko vara. Bilo jih je ogromno. Ampak najmanj 80% jih lahko dam v kategorijo: "saj mogoče bo pa šlo". In potem gre. No ne čisto. Ampak za silo gre. Ampak ko je zadeva končana pa ne gre več!
Pa ne gre za baudrate, ampak za popolnoma vse stvari. Če nimaš ustreznega elementa se ne sme uporabiti kar nekaj, kar je približek. Tak način vodi do še večjih problemov. Treba je počakati, da element pride na mizo! Vse ostalo je brcanje v temo in proizvajanje polomij. Povem iz prve roke.

Tudi reset v zraku spada v to kategorijo.

_________________
Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
wicket
Član
Član



Pridružen-a: Sob 28 Maj 2011 15:19
Prispevkov: 29
Aktiv.: 0.19
Kraj: Ljubljana

PrispevekObjavljeno: Pon Mar 17, 2014 9:07 pm    Naslov sporočila:   Odgovori s citatom

Pa saj MCLR imam navadno pullupan na high, tokrat sem menjaval PICe, zato sem vmes MCLR izklopil in še to na edinem uCju, kjer mi zadeva dela. Drugje je vse "šolsko". Za kristale pač nisem vedel, da je UART tako občutljiv.

Bom nabavil 3.6864 MHz in 11.0592 kristale, ki naj bi imeli 0% error pri 9600 bps.

Saj ni treba vse tako sarkastično, sem začetnik, še vedno študent. Delam iz "firbca" in neke hude inženirske podlage ali izkušenj pač še nimam.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group