Forum: Mikrocontroller und Digitale Elektronik PIC24 Uart Problem


von Stefan (Gast)


Lesenswert?

Hi habe da ein Problem wo ich nicht weiter komme,  vielleicht könnt ihr 
mir helfen!

Egal was ich ans Terminal über
1
U1TXREG
 schicke es kommt nur was falsches raus.

Wo mache ich einen Fehler?

Systemtakt 8 Mhz

Vielleicht habe ich auch was bei Uart falsch verstanden und lasse mich 
da gerne belehren.
1
 
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <p24FJ128GB108.h>
5
6
7
_CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & FWDTEN_OFF & ICS_PGx1)
8
_CONFIG2( PLL_96MHZ_ON & IESO_OFF & FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS & FNOSC_PRIPLL & PLLDIV_DIV2 & IOL1WAY_OFF)
9
10
11
void initUART( void)
12
{
13
    U1BRG = 51;     //9600 Baud 8 Bit data 1 Stop bit
14
    U1STA = 0;
15
    U1MODE = 0x8000;
16
    U1STAbits.UTXEN = 1; 
17
} 
18
19
20
21
int main(int argc, char** argv) {
22
23
    TRISBbits.TRISB6 = 1;
24
    TRISBbits.TRISB7 = 1;
25
    AD1PCFGLbits.PCFG6 = 1;
26
    AD1PCFGLbits.PCFG7 = 1;
27
28
    // Unlock Registers
29
    __builtin_write_OSCCONL(OSCCON & 0xBF);
30
    RPINR18bits.U1RXR = 7;
31
    RPOR3bits.RP6R = 3;
32
    __builtin_write_OSCCONL(OSCCON | 0x40);
33
        
34
35
    initUART();  // 1. init the UART2 serial port
36
37
    while (1)
38
    {
39
        U1TXREG = 0x62;
40
        while(U1STAbits.UTXBF);
41
    } // main loop
42
43
    return (EXIT_SUCCESS);
44
}

von Max H. (hartl192)


Lesenswert?

Stefan schrieb:
> Systemtakt 8 Mhz
Meinst du damit 8MHz Fosc oder Fcy (FCY = FOSC/2)?

von Stefan (Gast)


Lesenswert?

Max H. schrieb:
>> Systemtakt 8 Mhz
> Meinst du damit 8MHz Fosc oder Fcy (FCY = FOSC/2)?

Systemtakt 8 Mhz ist mein Quarz.

von Max H. (hartl192)


Lesenswert?

Stefan schrieb:
> Systemtakt 8 Mhz ist mein Quarz.
Der PIC24 Teilt den Quarztakt intern durch zwei. Für einen 8MHz Quarz 
ergeben sich also Fcy=4Mhz, du musst das U1BGR Register also für 
Fcy=4MHz berechnen:
Das ergibt dann eine effektive Baudrate von
Der Fehler ist:
Das ist in Ordnung.

Stefan schrieb:
> U1BRG = 51;
Dein Code ergibt eine Baudrate von

: Bearbeitet durch User
von Stefan (Gast)


Lesenswert?

Jetzt habe bei  U1BRG 25 eingetragen für 9600 trotzdem das gleiche 
Problem.

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Das Bild zeigt was ich mit den Einstellungen raus bekomme.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <p24FJ128GB108.h>
4
5
6
_CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & FWDTEN_OFF & ICS_PGx1)
7
_CONFIG2( PLL_96MHZ_ON & IESO_OFF & FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS & FNOSC_PRIPLL & PLLDIV_DIV2 & IOL1WAY_OFF)
8
9
10
void initUART( void)
11
{
12
    U1BRG = 25;     //9600 Baud 8 Bit data 1 Stop bit
13
    U1STA = 0;
14
    U1MODE = 0x8000;
15
    U1STAbits.UTXEN = 1;
16
}
17
18
19
20
int main(int argc, char** argv) {
21
22
    TRISBbits.TRISB6 = 1;
23
    TRISBbits.TRISB7 = 1;
24
    AD1PCFGLbits.PCFG6 = 1;
25
    AD1PCFGLbits.PCFG7 = 1;
26
27
    // Unlock Registers
28
    __builtin_write_OSCCONL(OSCCON & 0xBF);
29
    RPINR18bits.U1RXR = 7;
30
    RPOR3bits.RP6R = 3;
31
    __builtin_write_OSCCONL(OSCCON | 0x40);
32
33
34
    initUART();  // 1. init the UART2 serial port
35
36
    while (1)
37
    {
38
        U1TXREG = 0x62;
39
        while(U1STAbits.UTXBF);
40
    } // main loop
41
42
    return (EXIT_SUCCESS);
43
}

von Frank M. (frank_m35)


Lesenswert?

Da du das PLL Module verwendest:
FNOSC_PRIPLL

vermute ich mal schwer, dass dein PIC nicht mit 8MHz läuft,
sondern 8MHz * 4 = 32MHz.

von Stefan (Gast)


Lesenswert?

Frank M. schrieb:
> Da du das PLL Module verwendest:
> FNOSC_PRIPLL

Habe gerade auf FNOSC_PRI geändert das gleiche Problem.

von Frank M. (frank_m35)


Lesenswert?

Finde gerade keinen Fehler, hast du mal HTerm benutzt, vielleicht stimmt 
an der Konfiguration (Anzeige des Empfangenen) des Terminals etwas 
nicht, denn gesendet wird ja etwas, und auch immer das gleiche. Nur eben 
nicht das was du willst.

Du kannst auch mal das Senden was du empfängst:
http://www.engscope.com/pic24-tutorial/9-1-uart-setup/
sodass du vielleicht leichter einen Fehler entdecken kasst.

Ansonsten müssten die BRG=25 nun stimmen.

von Hans-Georg L. (h-g-l)


Lesenswert?

Bei meinem PIC24FJ128(GC010) ist PLLDIV_XXX im CONFIG4 und nicht im 
CONFIG2.

von Stefan (Gast)


Lesenswert?

Hans-Georg Lehnard schrieb:
> Bei meinem PIC24FJ128(GC010) ist PLLDIV_XXX im CONFIG4 und nicht im
> CONFIG2.

Nein bei diesem Typ CONFIG2

von hcr (Gast)


Lesenswert?

gib mal zusätzlich

XTAL_FREQ  EQU  80000000
ein

von Max H. (hartl192)


Angehängte Dateien:

Lesenswert?

In meinem Datenblatt hat der PIC gar kein CONFIG4 und PLLDIV ist im 
CONFIG2.
http://ww1.microchip.com/downloads/en/DeviceDoc/39897c.pdf
Seite: 290

Alternativ könnte man auch in einer Endlosschleife einen IO Togglen 
lassen, die Frequenz messen und daraus die Tatsächliche CPU Frequenz 
bestimmen. Wie viele ASM-Befehle der Compiler aus der Endlosschleife 
macht, kann man im ASM-Listing oder mit dem Simulator herausfinden.

In Anhang der Teil des p24FJ128GB108.h in dem die Configs beschrieben 
sind. Das Hilft mir, zusätzlich zum Datenblatt (ab S.287) immer viel 
beim Schreiben der Configs.

: Bearbeitet durch User
von Frank M. (frank_m35)


Lesenswert?

Zzgl. dem Versuch ein anderes Terminal zu verwenden noch etwas bzgl. 
Frequenz noch:
Verwende doch einfach mal den internen Oszillator, gehe auf 32MHz, 
berechne dementsprechend die BRG neu und teste es erneut.
1
#define PLL_96MHZ_OFF   0xFFFF
2
#define PLL_96MHZ_ON    0xF7FF
3
4
// Using the FRC (8MHz)    // NOTE: USB operation is not guaranteed
5
_CONFIG2(IESO_OFF & PLL_96MHZ_ON & PLLDIV_DIV2 & FNOSC_FRCPLL & POSCMOD_NONE & IOL1WAY_OFF) // Primary osc disabled, FRC OSC with PLL, USBPLL /2
6
_CONFIG1(JTAGEN_OFF & ICS_PGx2 & FWDTEN_OFF)        // JTAG off, watchdog timer off

von Peter C. (peter_c49)


Lesenswert?

die 96Mhz pll ist für USB.

hier ein kleines test beispiel mit dem ich prüfe ob meine FCY wirklich 
so ist wie ich es erwarte.
1
// PIC24FJ128GA010 Configuration Bit Settings
2
3
// 'C' source line config statements
4
5
#include <xc.h>
6
7
// CONFIG2
8
#pragma config POSCMOD = HS             // Primary Oscillator Select (HS Oscillator mode selected)
9
#pragma config OSCIOFNC = ON            // Primary Oscillator Output Function (OSC2/CLKO/RC15 functions as port I/O (RC15))
10
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor (Clock switching and Fail-Safe Clock Monitor are disabled)
11
#pragma config FNOSC = PRIPLL           // Oscillator Select (Primary Oscillator with PLL module (HSPLL, ECPLL))
12
#pragma config IESO = OFF               // Internal External Switch Over Mode (IESO mode (Two-Speed Start-up) disabled)
13
14
// CONFIG1
15
#pragma config WDTPS = PS32768          // Watchdog Timer Postscaler (1:32,768)
16
#pragma config FWPSA = PR128            // WDT Prescaler (Prescaler ratio of 1:128)
17
#pragma config WINDIS = ON              // Watchdog Timer Window (Standard Watchdog Timer enabled,(Windowed-mode is disabled))
18
#pragma config FWDTEN = OFF             // Watchdog Timer Enable (Watchdog Timer is disabled)
19
#pragma config ICS = PGx2               // Comm Channel Select (Emulator/debugger uses EMUC2/EMUD2)
20
#pragma config GWRP = OFF               // General Code Segment Write Protect (Writes to program memory are allowed)
21
#pragma config GCP = OFF                // General Code Segment Code Protect (Code protection is disabled)
22
#pragma config JTAGEN = OFF             // JTAG Port Enable (JTAG port is disabled)
23
24
#define FCY 16000000UL // 8 mhz * pll(*4) => 32Mhz == 16Mhz FCY
25
26
#include <stdio.h>
27
#include <stdlib.h>
28
29
void toggle_d9(void) {
30
    __builtin_btg((unsigned int *) &LATA, 6);
31
}
32
33
// timing and baud rate calculations
34
// UBRGx = ( FCY / (  4 * Baud ) ) -1   IF BRGH = 1
35
// UBRGx = ( FCY / ( 16 * Baud ) ) -1   IF BRGH = 0
36
#define BRATE    34         // 115200 baud (BREGH=1)
37
#define U_ENABLE 0x8008     // enable the UART peripheral
38
#define U_TX     0x0400     // enable transmission
39
40
// initialize the UART2 serial port
41
42
void InitU2(void) {
43
    U2BRG = BRATE;
44
    U2MODE = U_ENABLE;
45
    U2STA = U_TX;
46
    //RTS     = 1;        // set RTS default status
47
    //TRTS    = 0;        // make RTS output
48
} // initU2
49
50
// send a character to the UART2 serial port
51
52
int putU2(int c) {
53
    //while ( CTS);               // wait for !CTS, clear to send
54
    while (U2STAbits.UTXBF); // wait while Tx buffer full
55
    U2TXREG = c;
56
    return c;
57
} // putU2
58
59
// wait for a new character to arrive to the UART2 serial port
60
61
char getU2(void) {
62
    //RTS = 0;                    // assert Request To Send !RTS
63
    while (!U2STAbits.URXDA); // wait
64
    //RTS = 1;
65
    return U2RXREG; // read from the receive buffer
66
}// getU2
67
68
/*
69
 * 
70
 */
71
int main(int argc, char** argv) {
72
73
    unsigned int c = 0x41;
74
75
    LATAbits.LATA7 = 0; // LED D10 off
76
    TRISAbits.TRISA7 = 0; // output
77
    LATAbits.LATA6 = 1; // LED D9 off
78
    TRISAbits.TRISA6 = 0; // output
79
80
    // setup/start timer1
81
    T1CONbits.TCKPS = 0b11; // 1:256
82
    T1CONbits.TCS = 0; // drive from internal clock
83
    T1CONbits.TON = 1; // timer on
84
85
    InitU2();
86
87
    while (1) {
88
        __builtin_btg((unsigned int *) &LATA, 7); // toggle LED D10
89
        TMR1 = 0;
90
        while (TMR1 < 31250) // ~500ms delay if we realy run at 16Mhz FCY.
91
        {
92
        }
93
94
        putU2(c++);
95
96
        if (c > (0x41 + 25)) { // A-Z should be received on other end.
97
            c = 0x41;
98
            putU2('\r');
99
            putU2('\n');
100
            toggle_d9(); // toggle LED D9 every time A-Z characters send.
101
        }
102
    }
103
104
    return (EXIT_SUCCESS

benutze hier einen PIC24FJ128GA010, der sollte nicht so unterschiedlich 
sein.
Ich benutze ein 8Mhz Quartz hier.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.