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 Prejšnja  1, 2
 
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
xfce
Član
Član



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

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

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
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: Tor Mar 18, 2014 8:42 pm    Naslov sporočila:   Odgovori s citatom

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
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: Sre Mar 19, 2014 2:39 pm    Naslov sporočila:   Odgovori s citatom

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
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: Sre Mar 19, 2014 3:02 pm    Naslov sporočila:   Odgovori s citatom

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
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: Sre Mar 19, 2014 3:10 pm    Naslov sporočila:   Odgovori s citatom

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
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: Sre Mar 19, 2014 9:59 pm    Naslov sporočila:   Odgovori s citatom

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
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: Čet Mar 20, 2014 2:40 pm    Naslov sporočila:   Odgovori s citatom

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č. Smile
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: Čet Mar 20, 2014 2:49 pm    Naslov sporočila:   Odgovori s citatom

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č. Smile

Cool
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: Čet Mar 20, 2014 3:31 pm    Naslov sporočila:   Odgovori s citatom

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 Very Happy

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
forest70
Član
Član



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

PrispevekObjavljeno: Čet Mar 20, 2014 3:41 pm    Naslov sporočila:   Odgovori s citatom

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 Very Happy


Še bolj na kratko: RTFM Mr. Green
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: Čet Mar 20, 2014 4:56 pm    Naslov sporočila:   Odgovori s citatom

No, roko na srce... Tudi pri 628A je minimum 4 V, pa mi vseeno fura z 2.78 V. Smile
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: Čet Mar 20, 2014 5:01 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-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 Prejšnja  1, 2
Stran 2 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: 47 dni


Powered by phpBB © 2001, 2005 phpBB Group