|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
xfce Član
Pridružen-a: Čet 28 Jul 2011 8:06 Prispevkov: 521 Aktiv.: 3.34
|
Objavljeno: Pon Mar 17, 2014 9:33 pm Naslov sporočila: |
|
|
wicket je napisal/a: |
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. |
Nimajo 0% Errorja, amapk lahko dejansko izbereš natančno frekvenco, ki je mnogokratnik hitrosti prenosa. Kot se za uro izbere tak kristal, da ti točno 1 seknda obrne 16bitni timer.
Deviacija od prave frekvence je še vedno prisotna. Kristal ima natančnost frekvence in še temperaturno odstopanje. Potem moraš pa še izračunati, kakšna napaka je še sprejemljiva zate. In še odvisno je kako natančno frekvenco ima UART.
Lahko probaš z drugim kristalom, lahko pa v program, kjer obdeluješ prekinitev napišeš stavek, da ti pohendla paritetni bit (FERR)
Sicer ne vem sintakse za tvoj kompajler, ampak je gotovo nekaj tekega. V primeru, da se ti bo prižigala LED dioda, to signalizira napako na pariteti, kar je napačen baudrate ali napačen kristal.
Zadevo lahko rešuješ s primernim zunanjim oscilatorjem ali kalibracijo notranjega kristala.
Koda: |
void interrupt()
{
if (PIR1.B5) // if interrupt occurs - if RCIF = 1(RCREG full)
{
if (RCSTA.B2){//napaka na paritetnem bitu
LED=1;//tukaj lahko prizges LED za opozorilo
}else{
LED=0;// LED off
}
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
}
}
|
Povej nam še kaj več, ali uporabljaš MPLAB, kakšno napetost ima PIC, kakšni napetostni njivoji so na UART pinih od GSM modula itd.. |
|
Nazaj na vrh |
|
|
wicket Član
Pridružen-a: Sob 28 Maj 2011 15:19 Prispevkov: 29 Aktiv.: 0.18 Kraj: Ljubljana
|
Objavljeno: Tor Mar 18, 2014 8:42 pm Naslov sporočila: |
|
|
Trenutno uporabljam MikroC, bom pa jutri probal še v MPLAB. Vezje napajam preko 7805 regulatorja.
Vdd - 5,02 V
PIC Tx pin (GSM Rx) - 5,02 V
PIC Rx pin (GSM Tx) - 2,78 V
Od zdaj naprej bom probal tole reševati na 18F4520, ker sem ga nameraval uporabiti tudi v končnem projektu. Doma sem našel 7.3728 MHz oscilator, ki mu prav tako paše UART. Bom poskusil tale test s pariteto. |
|
Nazaj na vrh |
|
|
wicket Član
Pridružen-a: Sob 28 Maj 2011 15:19 Prispevkov: 29 Aktiv.: 0.18 Kraj: Ljubljana
|
Objavljeno: Sre Mar 19, 2014 2:39 pm Naslov sporočila: |
|
|
Poskusil tudi z MPLAB. Rezultat je enak. Pridem v interrupt, od tam naprej ne dela. Zdaj grem preverjati pariteto.
Koda: |
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <xc.h>
#define _XTAL_FREQ = 7372800
// CONFIG1H
#pragma config OSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
// CONFIG2L
#pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = SBORDIS // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 3 // Brown Out Reset Voltage bits (Minimum setting)
// CONFIG2H
#pragma config WDT = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768)
// CONFIG3H
#pragma config CCP2MX = PORTC // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config PBADEN = OFF // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
#pragma config LPT1OSC = OFF // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
// CONFIG4L
#pragma config STVREN = ON // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = ON // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
#pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
// CONFIG5L
#pragma config CP0 = OFF // Code Protection bit (Block 0 (000800-001FFFh) not code-protected)
#pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh) not code-protected)
#pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh) not code-protected)
#pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh) not code-protected)
// CONFIG5H
#pragma config CPB = OFF // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
#pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
// CONFIG6L
#pragma config WRT0 = OFF // Write Protection bit (Block 0 (000800-001FFFh) not write-protected)
#pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh) not write-protected)
#pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh) not write-protected)
#pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh) not write-protected)
// CONFIG6H
#pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF // Boot Block Write Protection bit (Boot block (000000-0007FFh) not write-protected)
#pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
// CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)
// CONFIG7H
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) not protected from table reads executed in other blocks)
volatile unsigned char uart_rd;
unsigned int b = 0;
void USART_init(void)
{
TRISCbits.RC7 = 1;
TRISCbits.RC6 = 1;
TXSTAbits.TXEN = 1; // TXEN
TXSTAbits.BRGH = 1; // BRGH
RCSTAbits.SPEN = 1; // SPEN
RCSTAbits.CREN = 1; // CREN
SPBRG = 47;
PIE1bits.RCIE = 1;
}
void USART_putc(unsigned char c)
{
while (!TXSTAbits.TRMT); // wait until transmit shift register is empty
TXREG = c; // write character to TXREG and start transmission
}
void USART_puts(unsigned char *s)
{
while (*s)
{
USART_putc(*s); // send character pointed to by s
s++; // increase pointer location to the next character
}
}
int main(void)
{
USART_init();
CMCON = 0b111; // comparators off
ADCON1 = 0b1111; // all inputs digital
INTCONbits.PEIE = 1; // enable peripheral interrupts
INTCONbits.GIE = 1; // enable interrupts
while(1)
{
if ((PORTBbits.RB0 == 1) && (b == 0)) // if input goes high
{
b = 1; // set flag, so this if loop is disabled in future
USART_puts("at\r\n"); // phones responske should be "OK"
}
}
return 0;
}
void interrupt ISR(void)
{
if (PIR1bits.RCIF) // check if receive interrupt has fired
{
uart_rd = RCREG; // read received character to buffer
if (uart_rd == 'O') PORTBbits.RB1 = 1; //if incoming byte is "O", turn on LED
PIR1bits.RCIF = 0; // reset receive interrupt flag
}
}
|
|
|
Nazaj na vrh |
|
|
wicket Član
Pridružen-a: Sob 28 Maj 2011 15:19 Prispevkov: 29 Aktiv.: 0.18 Kraj: Ljubljana
|
Objavljeno: Sre Mar 19, 2014 3:02 pm Naslov sporočila: |
|
|
Hmm, v datasheetu od 18f4520 piše, da čip ne podpira hardware paritete, tudi v diagramu FERR bita ne vidim.
Če ga preberem tako kot si predlagal, se bo še vedno pravilno postavljal, ali je treba pri temu čipu uporabiti neko programsko rutino z 9-bitnim sprejemom, kjer bi bil 9. bit paritetni? |
|
Nazaj na vrh |
|
|
forest70 Član
Pridružen-a: Ned 20 Jul 2008 1:00 Prispevkov: 588 Aktiv.: 3.05 Kraj: Koper
|
Objavljeno: Sre Mar 19, 2014 3:10 pm Naslov sporočila: |
|
|
wicket je napisal/a: |
PIC Rx pin (GSM Tx) - 2,78 V |
Hm to bi lahko bilo problematično. Lahko da pic to napetost ne spozna HI .... |
|
Nazaj na vrh |
|
|
xfce Član
Pridružen-a: Čet 28 Jul 2011 8:06 Prispevkov: 521 Aktiv.: 3.34
|
Objavljeno: Sre Mar 19, 2014 9:59 pm Naslov sporočila: |
|
|
Uf. Težka, da bi odkril napako.. Najbolje, da se lotiš zadev postopoma. Ali imaš vmesnik USB-UART (TTL)? Če ga imaš najprej stestiraj povezavo z računalnikom. Ker praviš, da ti PIC pošilja ven podatke, lahko delaš preprost debug. Lahko si sporočas, katero vrednost prebere PIC v prekinitvi itd..
Če tega nimaš si pripravi ene 3 LED diode in jih prižigaj ob posameznih dogodkih.
Najprej sem opazil:
#pragma config WDT = ON // Watchdog Timer Enable bit (WDT enabled)
Tukaj imaš vklopljen watchdog, tako ti mikroprocesor stalno skače v reset. WDT je namenjen temu, da če se ti zacikla program, da naredi reset. Ampak moraš med delovanjem WDT postavljati na 0.
Kar ugasni zadevo.
Drugače pa pojdi postopoma:
najprej preveri če GSM modul res sprejema.
potem probaj prebrati znak v glavni zanki
šele potem probaj prebrati v prekinitvi
v dokumentaciji piše, da preverja:
if (RCSTAbits.FERR) {PORTBbits.RB1 = 1;}else{PORTBbits.RB1 = 0;} |
|
Nazaj na vrh |
|
|
wicket Član
Pridružen-a: Sob 28 Maj 2011 15:19 Prispevkov: 29 Aktiv.: 0.18 Kraj: Ljubljana
|
Objavljeno: Čet Mar 20, 2014 2:40 pm Naslov sporočila: |
|
|
Končno mi je uspelo. Izkazalo se je, da 2,78 V na Rx pinu ni bilo dovolj za logični high. Ker je start bit 0, je zadeva prišla v interrupt, od tam naprej pa ni več zaznavala high vhoda. Ker je vhod Schmitt-trigger in v datasheetu piše, da mora biti za high level vsaj 0,8 * Vdd = 4 V, sem bil way off.
Sem poskusil najprej s 3.6864 MHz kristalom in nato še z intosc @ 4 MHz in dela v obeh primerih.
Hvala vsem za pomoč. |
|
Nazaj na vrh |
|
|
forest70 Član
Pridružen-a: Ned 20 Jul 2008 1:00 Prispevkov: 588 Aktiv.: 3.05 Kraj: Koper
|
Objavljeno: Čet Mar 20, 2014 2:49 pm Naslov sporočila: |
|
|
wicket je napisal/a: |
Končno mi je uspelo. Izkazalo se je, da 2,78 V na Rx pinu ni bilo dovolj za logični high. Ker je start bit 0, je zadeva prišla v interrupt, od tam naprej pa ni več zaznavala high vhoda. Ker je vhod Schmitt-trigger in v datasheetu piše, da mora biti za high level vsaj 0,8 * Vdd = 4 V, sem bil way off.
Sem poskusil najprej s 3.6864 MHz kristalom in nato še z intosc @ 4 MHz in dela v obeh primerih.
Hvala vsem za pomoč. |
|
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.57
|
Objavljeno: Čet Mar 20, 2014 3:31 pm Naslov sporočila: |
|
|
wicket je napisal/a: |
... v datasheetu piše, da mora biti za high level vsaj 0,8 * Vdd = 4 V, sem bil way off. |
Skratka... če vse ostalo odpove, potem preberi navodila _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
forest70 Član
Pridružen-a: Ned 20 Jul 2008 1:00 Prispevkov: 588 Aktiv.: 3.05 Kraj: Koper
|
Objavljeno: Čet Mar 20, 2014 3:41 pm Naslov sporočila: |
|
|
gumby je napisal/a: |
wicket je napisal/a: |
... v datasheetu piše, da mora biti za high level vsaj 0,8 * Vdd = 4 V, sem bil way off. |
Skratka... če vse ostalo odpove, potem preberi navodila |
Še bolj na kratko: RTFM |
|
Nazaj na vrh |
|
|
wicket Član
Pridružen-a: Sob 28 Maj 2011 15:19 Prispevkov: 29 Aktiv.: 0.18 Kraj: Ljubljana
|
Objavljeno: Čet Mar 20, 2014 4:56 pm Naslov sporočila: |
|
|
No, roko na srce... Tudi pri 628A je minimum 4 V, pa mi vseeno fura z 2.78 V. |
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.57
|
Objavljeno: Čet Mar 20, 2014 5:01 pm Naslov sporočila: |
|
|
Saj včasih dela tudi izven specifikacij. Ampak zanašanje na take hece je izvor kasnejših glavobolov... _________________ Tule nisem več aktiven. |
|
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: 102 dni
Powered by phpBB © 2001, 2005 phpBB Group
|