Forum: Mikrocontroller und Digitale Elektronik PIC24F UART- Transmit funkt nicht


von PICC_DA (Gast)


Lesenswert?

Hallo,

Habe ein Problem mit meiner UART Schnittstelle von meinem PIC24F32KA302.
Kurz zur Aufgabe: Ich versuche ganz simpel eine Verbindung zwischen PC 
und µC über ein Bluetooth-Modul (RN42) aufzubauen. Als Terminal Programm 
verwende ich AccesPORT137. Es funktioniert bereits die Daten vom 
Hyperterminal in den µC zu senden und diese kommen da auch richtig an.

Das Problem ist das senden, denn es kommt nicht einmal irgendwelcher 
Blödsinn an sondern es kommt einfach gar nichts. Ich bin mir zudem 
sicher das erst garnichts vom µC ausgeht (TX-Pin) da ich mit dem Oszi 
hier nichts messen kann.

Hier die UART Initialisierung:
1
void UART1_Init(void)
2
{
3
    TRISBbits.TRISB7 = 0; //TX als Output definieren
4
    TRISBbits.TRISB2 = 1; //RX als Input definiern
5
6
    U1MODEbits.BRGH = 0;
7
    U1BRG = 25;     //9600Baud
8
9
10
    //Interrupt Flags
11
    IFS0bits.U1RXIF = 0;
12
    IFS0bits.U1TXIF = 0;
13
14
    //Interrupts Enablen
15
    IEC0bits.U1RXIE = 1;
16
    IEC0bits.U1TXIE = 1;
17
18
    U1STAbits.UTXEN = 1; //Transmit aktivieren
19
20
    U1MODEbits.UARTEN = 1; //Uart aktivieren
21
}

Hier meine Main ich will nur einmal irgendwelche Daten empfangen und 
habe deshalb das mal so gemacht:

(diese delay.. ist im programm mit einem Zähler realisiert nur gibt es 
hier probleme mit der formatierung der klammern allerdings spielt dies 
ja keine rolle)
1
int main(void)
2
{
3
    PWM_Init();
4
    Init();
5
    UART2_Init(); //GPS-Modul
6
    UART1_Init(); //Bluetooth modul
7
8
    
9
    while(1)
10
    {
11
         delay...
12
         U1TXREG = '&';
13
    
14
    return 0;
15
}

Ich hoffe das ist alles was ihr braucht um meinen hoffentlich 
stümpferhaften fehler aufzudecken.

Danke

von Max H. (hartl192)


Lesenswert?

PICC_DA schrieb:
> //Interrupts Enablen
>     IEC0bits.U1RXIE = 1;
>     IEC0bits.U1TXIE = 1;
Wenn du keine ISR hast würde ich die Interrupts sperren, sonst hängt der 
PIC im INterrupt fest weil das Flag nie gelöscht wird.

> (diese delay.. ist im programm mit einem Zähler realisiert nur gibt es
> hier probleme mit der formatierung der klammern allerdings spielt dies
> ja keine rolle)
Könnte se aber: Wenn die Klammer, die die while-Schleife abschließt im 
delay ist, wird der PIC das TXREG = '&'; nie ausführen. In deinem Code 
fehlt die nämlich. Poste besser den kompletten Code.
Wenn du einfach nur warten willst bist das vorherige Zeichen fertig 
gesendet wurde könntest du das Delay dadurch ersetzen:
1
while(U1STAbits.UTXBF);  // UTXBF = 1: Transmit buffer is full

> U1TXREG = '&';
>
>     return 0;
Ich weiß nicht was der PIC bei "return 0" aus der Main macht, vllt. mach 
das Problemen.

von PICC_DA (Gast)


Lesenswert?

Hallo Max,

Danke für die schnelle Antwort. Also ich habe durchaus ISR's die RX ISR 
funtioniert auch perfekt d.h. wenn ich daten schicke wird diese 
aufgerufen und ich kann mir die Daten beim Debuggen anschauen.

Hier nochmal die ganz Main:
1
int main(void)
2
{
3
    PWM_Init();
4
    Init();
5
    UART2_Init(); //GPS-Modul
6
    UART1_Init(); //Bluetooth modul
7
8
    //Da beim Einschalten bereits ein Ziel vorhanden sein könnte muss dieses geladen werden
9
    GPSDatenLesen();
10
    
11
    while(1)
12
    {
13
        do
14
        {
15
                Zaehler_Toggle++;
16
17
        }
18
        while(Zaehler_Toggle != 0xFFFF);
19
        Zaehler_Toggle = 0;
20
21
        GPSPunkt();
22
23
        while (!U1STAbits.TRMT); //Warten bis zum senden bereit
24
        U1TXREG = '&';
25
    }
26
    return 0;
27
}

wie du siehst ist es nur ein Zähler der mir regelmäßig die Funktion 
GPSPunkt() aufruft und damit ein Display zählen lässt (um zu sehen ob 
der PIC läuft).

Durch die Endlosschleife kommt er sowieso nicht zum return also sollte 
das kein problem sein. Ich geb zu der vorherige code schnipsel war nicht 
gerade anschaulich.

Wie gesagt das Problem ist, dass er das
1
U1TXREG = '&';
anscheinend überspringt da er weder was sendet noch in die TX ISR 
springt?!?

von Frank K. (fchk)


Lesenswert?

Drehe mal das Einschalten von UART und TX folgendermaßen um.
1
    U1MODEbits.UARTEN = 1; //Uart aktivieren
2
    U1STAbits.UTXEN = 1; //Transmit aktivieren

Eventuell ist hier die Reihenfolge wichtig.

von PICC_DA (Gast)


Lesenswert?

WOW. Auf das wäre ich niemals gekommen aber tatsache ist das es jetzt 
funktioniert! Vielen Dank. Wie bist du auf das gekommen? und warum ist 
das so?

von Chris B. (dekatz)


Lesenswert?

Vermutlich weil es genau die Vorgangsweise lt. Datenblatt ist ;-)

Zitat(PIC24F family reference manual,.... Section 21 UART.....
21.5.3. Setup for UART transmitt )
......
4. Enable the UART module by setting the UARTEN (UxMODE<15>) bit.
5. Enable the transmission by setting the UTXEN (UxSTA<10>) bit, which 
will also set the UxTXIF bit. The UxTXIF bit should be cleared in the 
software routine that services the UART transmit interrupt. The 
operation of the UxTXIF bit is controlled by the UTXISEL<1:0> control 
bits.
..........

von PICC_DA (Gast)


Lesenswert?

Achja da stehts ja ^^ Trozdem danke für die Antwort. Jetzt muss ich nur 
noch Visual Studio zum laufen bringen dann kann ich weiter machen!

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.