|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
wicket Član
Pridružen-a: Sob 28 Maj 2011 15:19 Prispevkov: 29 Aktiv.: 0.18 Kraj: Ljubljana
|
Objavljeno: Pon Mar 17, 2014 11:55 am Naslov sporočila: PIC USART problem |
|
|
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 |
|
|
xfce Član
Pridružen-a: Čet 28 Jul 2011 8:06 Prispevkov: 521 Aktiv.: 3.35
|
Objavljeno: Pon Mar 17, 2014 1:06 pm Naslov sporočila: |
|
|
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 |
|
|
forest70 Član
Pridružen-a: Ned 20 Jul 2008 1:00 Prispevkov: 588 Aktiv.: 3.06 Kraj: Koper
|
Objavljeno: Pon Mar 17, 2014 1:19 pm Naslov sporočila: |
|
|
Kje pa imaš kvarc ??
Interni clock je preveč ne stabilen za uporabo uarta! |
|
Nazaj na vrh |
|
|
wicket Član
Pridružen-a: Sob 28 Maj 2011 15:19 Prispevkov: 29 Aktiv.: 0.18 Kraj: Ljubljana
|
Objavljeno: Pon Mar 17, 2014 2:03 pm Naslov sporočila: |
|
|
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 ??
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 |
|
|
xfce Član
Pridružen-a: Čet 28 Jul 2011 8:06 Prispevkov: 521 Aktiv.: 3.35
|
Objavljeno: Pon Mar 17, 2014 2:05 pm Naslov sporočila: |
|
|
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 |
|
Nazaj na vrh |
|
|
wicket Član
Pridružen-a: Sob 28 Maj 2011 15:19 Prispevkov: 29 Aktiv.: 0.18 Kraj: Ljubljana
|
Objavljeno: Pon Mar 17, 2014 2:59 pm Naslov sporočila: |
|
|
Ups, ponesreči sem zloadal 877 datasheet namesto 887.
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 |
|
|
forest70 Član
Pridružen-a: Ned 20 Jul 2008 1:00 Prispevkov: 588 Aktiv.: 3.06 Kraj: Koper
|
Objavljeno: Pon Mar 17, 2014 3:15 pm Naslov sporočila: |
|
|
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 |
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 |
|
|
Krampus Član
Pridružen-a: Pon 08 Sep 2008 13:07 Prispevkov: 1826 Aktiv.: 9.57
|
Objavljeno: Pon Mar 17, 2014 3:28 pm Naslov sporočila: |
|
|
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 |
|
|
xfce Član
Pridružen-a: Čet 28 Jul 2011 8:06 Prispevkov: 521 Aktiv.: 3.35
|
Objavljeno: Pon Mar 17, 2014 4:38 pm Naslov sporočila: |
|
|
@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 |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.61
|
Objavljeno: Pon Mar 17, 2014 4:44 pm Naslov sporočila: |
|
|
MCLR puščat "v zraku" je zelo pametno, če imaš rad mistične resete... _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
VolkD Član
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 63.67 Kraj: Divača (Kačiče)
|
Objavljeno: Pon Mar 17, 2014 7:15 pm Naslov sporočila: |
|
|
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 |
|
|
wicket Član
Pridružen-a: Sob 28 Maj 2011 15:19 Prispevkov: 29 Aktiv.: 0.18 Kraj: Ljubljana
|
Objavljeno: Pon Mar 17, 2014 7:44 pm Naslov sporočila: |
|
|
MCLR imam dizejblan. Glede oscilatorja pa čisto možno. Bom jutri probal še z različnimi kristali. Poročam... |
|
Nazaj na vrh |
|
|
xfce Član
Pridružen-a: Čet 28 Jul 2011 8:06 Prispevkov: 521 Aktiv.: 3.35
|
Objavljeno: Pon Mar 17, 2014 7:56 pm Naslov sporočila: |
|
|
@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 |
|
|
VolkD Član
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 63.67 Kraj: Divača (Kačiče)
|
Objavljeno: Pon Mar 17, 2014 8:41 pm Naslov sporočila: |
|
|
Č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 |
|
|
wicket Član
Pridružen-a: Sob 28 Maj 2011 15:19 Prispevkov: 29 Aktiv.: 0.18 Kraj: Ljubljana
|
Objavljeno: Pon Mar 17, 2014 9:07 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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: 90 dni
Powered by phpBB © 2001, 2005 phpBB Group
|