Forum: Mikrocontroller und Digitale Elektronik PIC24FJ64GB002


von Lucky (Gast)


Lesenswert?

Hallo Leute,

Ich bin ein absoluter Frischling was Microcontroller angeht! Vor einer 
Woche wusste ich nichtmal was Microcontroller sind...

Ich habe einen PIC24FJ64GB002 Kit. Ich versuche über UART an Putty eine 
Nachricht zu schicken aber das will einfach nicht hinhauen. Ich habe mir 
die Header Dateien von MPLAB angeschaut und alles so gemacht wie es drin 
beschrieben ist. Das was nicht beschrieben war habe ich mir ergooglet.

Wo sind hier meine Fehler?
1
#define SYSCLK                  16000000UL   /*!< SYSCLK frequency in Hz */
2
#define UART_BAUDRATE 19200UL
3
4
#include <stdio.h>
5
#include <stdlib.h>
6
#include <string.h>
7
#include <uart.h>
8
9
#include <p24FJ64GB002.h>
10
#include <PPS.h>
11
#include <adc.h>
12
#include <libpic30.h>
13
14
#include "genericTypeDefs.h"
15
16
17
18
_CONFIG1( WDTPS_PS1 & FWPSA_PR32 & WINDIS_OFF & FWDTEN_OFF & ICS_PGx1 & GWRP_OFF & GCP_OFF & JTAGEN_OFF )
19
_CONFIG2( POSCMOD_NONE & I2C1SEL_SEC/*I2C1SEL_PRI*/ & IOL1WAY_OFF & OSCIOFNC_ON & FCKSM_CSDCMD & FNOSC_FRCPLL & PLL96MHZ_ON & PLLDIV_NODIV & IESO_ON)
20
_CONFIG3( WPFP_WPFP0 & SOSCSEL_IO & WUTSEL_LEG & WPDIS_WPDIS & WPCFG_WPCFGDIS & WPEND_WPENDMEM )
21
_CONFIG4( DSWDTPS_DSWDTPS3 & DSWDTOSC_LPRC & RTCOSC_SOSC & DSBOREN_OFF & DSWDTEN_OFF )
22
23
24
25
        void main(){
26
    
27
    char test[50] = "Hallo! Ich bin ein PIC";
28
    
29
    AD1PCFG = 0xFFFF;
30
    
31
    
32
    TRISBbits.TRISB10 = 0; // Configure the TX pin (RB10)
33
    TRISBbits.TRISB11 = 1; // Configure the RX pin (RB11)
34
35
     PPSUnLock; // Unlock the PPS functionality
36
37
// Configure UART PPS pins
38
// Assign the Uart RX function to the correct pin
39
    iPPSInput( IN_FN_PPS_U1RX, IN_PIN_PPS_RP10 );
40
41
// Assign the Uart Tx function to the correct pin
42
    iPPSOutput( OUT_PIN_PPS_RP11, OUT_FN_PPS_U1TX );
43
44
    PPSLock; // Lock the PPS functionality
45
    UART_UEN_10;
46
    UART_1STOPBIT;
47
    UART_NO_PAR_8BIT;
48
    UART_TX_ENABLE;
49
    UART_EN;
50
51
    putcUART1(*test);
52
    
53
            
54
}

Ich hoffe nur, dass ich nicht alles falsch gemacht habe!

von Chris B. (dekatz)


Lesenswert?

Lucky schrieb:
> #define UART_BAUDRATE 19200UL
Ob das zur Einstellung der Baudrate genügt, bezweifle ich. Zudem auch 
die
BRGH-Einstellung (UART_BRGH_FOUR oder UART_BRGH_SIXTEEN) weiter unten 
fehlt.

>     UART_UEN_10;
Damit werden die RTS und CTS Leitungen aktiviert. Dafür fehlt aber die 
Zuordnung der entsprechenden Pin via PPS!

>  Ich bin ein absoluter Frischling was Microcontroller angeht! Vor einer
>  Woche wusste ich nichtmal was Microcontroller sind...
>  ......
>  Ich habe mir die Header Dateien von MPLAB angeschaut und alles so
>  gemacht wie es drin beschrieben ist.
>  Das was nicht beschrieben war habe ich mir ergooglet.

Wie wäre es mit dem "PIC24 Family data sheet" DS39940D und dem 
"S21_UART" Datasheet "DS39708B".

: Bearbeitet durch User
von Marco S (Gast)


Lesenswert?

putcUART1 ist identisch zu WriteUART1, und selbiges wie folgt 
deklariert:
void WriteUART1(unsigned int data)

Diese Funktion schreibt nur ein Zeichen in den Ausgangspuffer. In deinem 
Fall ein 'H'. Für einen String musst du da noch was machen.

von Lucky (Gast)


Lesenswert?

Hallo,

Ich habe mir die PDFs angeschaut und das Programm folgendermaßen 
umgebaut:
1
#define FOSC    8000000L
2
#define FCY    (FOSC/2)
3
#define BAUD_RATE_UART1    9600L
4
5
#include <stdio.h>
6
#include <stdlib.h>
7
#include <string.h>
8
#include <uart.h>
9
10
#include <p24FJ64GB002.h>
11
#include <PPS.h>
12
#include <adc.h>
13
14
#include "genericTypeDefs.h"
15
16
17
18
19
// OSCIOFNC_ON: get RA3 as digital I/O
20
// SOSCSEL_IO: get RA4 and RB4 as digital I/O
21
22
_CONFIG1( WDTPS_PS1 & FWPSA_PR32 & WINDIS_OFF & FWDTEN_OFF & ICS_PGx1 & GWRP_OFF & GCP_OFF & JTAGEN_OFF )
23
_CONFIG2( POSCMOD_NONE & I2C1SEL_SEC/*I2C1SEL_PRI*/ & IOL1WAY_OFF & OSCIOFNC_ON & FCKSM_CSDCMD & FNOSC_FRCPLL & PLL96MHZ_ON & PLLDIV_NODIV & IESO_ON)
24
_CONFIG3( WPFP_WPFP0 & SOSCSEL_IO & WUTSEL_LEG & WPDIS_WPDIS & WPCFG_WPCFGDIS & WPEND_WPENDMEM )
25
_CONFIG4( DSWDTPS_DSWDTPS3 & DSWDTOSC_LPRC & RTCOSC_SOSC & DSBOREN_OFF & DSWDTEN_OFF )
26
27
28
void UARTinit(){
29
    
30
    
31
    IN_PIN_PPS_RP10;
32
    IN_FN_PPS_U1RX;
33
    OUT_PIN_PPS_RP11;
34
    OUT_FN_PPS_U1TX;
35
    U1MODE = 0; // Clear UART1 mode register
36
    U1STA = 0;    // Clear UART1 status register
37
    U1BRG = (FCY/(16*BAUD_RATE_UART1))-1; // Calculate value of baud rate register
38
    UART_BRGH_FOUR;
39
    UART_1STOPBIT;
40
    UART_NO_PAR_8BIT;
41
    U1MODEbits.UARTEN = 1;   // Enable UART1 module
42
    U1STAbits.UTXEN = 1;     // Enable UART1 transmit
43
    AD1PCFG = 0xFFFF;
44
        
45
    TRISBbits.TRISB10 = 0; // Configure the TX pin (RB10)
46
    TRISBbits.TRISB11 = 1; // Configure the RX pin (RB11)
47
}
48
49
        void main(){
50
    
51
            UARTinit();
52
53
            while(1){
54
            printf("Hallo! Ich bin ein PIC\n");
55
            }
56
57
        
58
            
59
}

Aber leider geht immer noch nichts! Habt ihr vielleicht Rat für mich?

Vielen Dank!

von Chris B. (dekatz)


Lesenswert?

>             printf("Hallo! Ich bin ein PIC\n");

Bin mir nicht sicher ob das überhaupt direkt geht. Zumindest beim C30 
Compiler kann man mit
__C30_UART = 2;
die printf - Ausgabe auf UARTn umleiten.

Ich würde es mal mit:
putsUART1("Hallo! Ich bin ein PIC\n");
versuchen, und wenn der Compiler meckert, mit
putsUART1((unsigned int *)"Hallo! Ich bin ein PIC\n");

von Peter C. (peter_c49)


Lesenswert?

IN_PIN_PPS_RP10;
    IN_FN_PPS_U1RX;
    OUT_PIN_PPS_RP11;
    OUT_FN_PPS_U1TX;
was sollen diese zeilen machen?

hier ein PPS für SPI, da siehst du wie man es benutzt.

    PPSUnLock;
    iPPSInput(IN_FN_PPS_SDI1, IN_PIN_PPS_RP14);
    iPPSOutput(OUT_PIN_PPS_RP13, OUT_FN_PPS_SDO1);
    iPPSOutput(OUT_PIN_PPS_RP12, OUT_FN_PPS_SCK1);
    PPSLock;

unten eine meiner minimal uart test inits.
dort benutze ich nicht das PPS macro aus der plib.

void initUART(void) {
    // uart1
    // PPS first
    __builtin_write_OSCCONL(OSCCON & -(1 << 6)); // unlock
    RPINR18bits.U1RXR = 10; // assign U1 RX to pin RP10 ???
    RPOR5bits.RP11R = 3; // U1 TX to RP11
    __builtin_write_OSCCONL(OSCCON | (1 << 6)); // lock

    TRISBbits.TRISB10 = 1; // input
    TRISBbits.TRISB11 = 0; // output

    U1BRG = Baud2BRG(BAUD);
    U1MODE = 0; // reset and disable all
    U1MODEbits.BRGH = 1;
    U1STA = 0;
    U1MODEbits.UARTEN = 1;
    U1STAbits.UTXEN = 1;
}

das macro für die baudrate ist

#define BAUD 115200

//#define Baud2BRG(desiredBAUD) ( ( FCY / (16*desiredBAUD)) -1 ) // IF 
BRGH=0 !!
#define Baud2BRG(desiredBAUD) ( ( FCY / ( 4*desiredBAUD)) -1 ) // IF 
BRGH=1 !!

wichtig ist das dein FCY stimmt und auch definiert ist.
zb
#define FOSC 79227500UL
#define FCY  FOSC/2

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.