Forum: Mikrocontroller und Digitale Elektronik PIC18 USART Probleme


von txg (Gast)


Lesenswert?

Jetzt versuche ich seit längerer Zeit das ans laufen zu bekommen und es 
will einfach nicht...Hilfe wäre klasse!

Konkret handelt es sich um einen PIC18F45K20, der auf dem dem PICKit3 
mitgelieferten Eval-board sitzt und über das PICkit versorgt wird. am 
controller hängt natürlich ein MAX232.

Der Angehängte Code gibt zunächst einen kurzen String vom PIC zum 
Rechner durch, und soll dann vom Rechner empfangene Bytes wieder 
zurückschicken.

ich habe folgendes Problem: die Ausgabe von Zeichen vom PIC zum Rechner 
funktioniert, d.h. Baudrate und MAX232-Schaltung sind einwandfrei. 
Letzteres kann ich auch daran sehen dass der Rechner gesendete Zeichen 
korrekt zurückbekommt wenn ich RX und TX am MAX232 verbinde.

Was aber nicht funktioniert ist das Senden von Zeichen vom Rechner zum 
PIC.

Da das PICkit ja debug-fähig ist, kann ich sehen dass bereits in das 
Empfangsregister RCREG ein falscher Wert geschrieben wird (BSP: schicke 
ich eine Dezimale 10 (kein ascii) hin, kommt eine 61 zurück), außerdem 
ist ersichtlich dass das RCIF-Flag (zeigt an dass Daten im RCREG sind) 
gesetzt ist, selbst nach einem Prozessorreset und mit abgeklemmter 
RX-Leitung. Beides ist mir völlig unverständlich.

So, jetzt aber genug geschwafelt, hier ist der Quellcode:
1
//************************************************************
2
//Testing USART
3
//04.11.09
4
//************************************************************
5
6
/** C O N F I G U R A T I O N   B I T S ******************************/
7
8
#pragma config FOSC = INTIO67, FCMEN = OFF, IESO = OFF                       // CONFIG1H
9
#pragma config PWRT = OFF, BOREN = SBORDIS, BORV = 30                        // CONFIG2L
10
#pragma config WDTEN = OFF, WDTPS = 32768                                    // CONFIG2H
11
#pragma config MCLRE = OFF, LPT1OSC = OFF, PBADEN = ON, CCP2MX = PORTC       // CONFIG3H
12
#pragma config STVREN = ON, LVP = OFF, XINST = OFF                    // CONFIG4L
13
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF                   // CONFIG5L
14
#pragma config CPB = OFF, CPD = OFF                                         // CONFIG5H
15
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF                // CONFIG6L
16
#pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF                            // CONFIG6H
17
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF           // CONFIG7L
18
#pragma config EBTRB = OFF                                                  // CONFIG7H
19
20
21
22
#include <p18f45k20.h>
23
#include "delays.h"
24
25
void InterruptServiceHigh(void);
26
#pragma code InterruptVectorHigh = 0x08
27
void InterruptVectorHigh (void)
28
{
29
  _asm
30
    goto InterruptServiceHigh //jump to interrupt routine
31
  _endasm
32
}
33
34
35
int println(char buf[]) {
36
  int i;
37
  for (i = 0; i<20; i++) {
38
    while(!TXSTAbits.TRMT) {}
39
    while(!PIR1bits.TXIF){}  
40
      TXREG = buf[i];  
41
}
42
}
43
44
void main(void) {
45
46
char test[16]= "Ich bin ein PIC!\n";
47
48
OSCCON= 0b01010011; //4MHz
49
OSCTUNEbits.PLLEN = 0;  // x4 PLL disabled
50
51
SPBRG = 0b00011001; // für 9600er Baudrate
52
SPBRGH = 0x00;  
53
TRISC=0b11000000; // RX and TX enable  
54
BAUDCON = 0b11100000;
55
56
ANSEL = 0b00000000;
57
ANSELH = 0b00000000;
58
59
TXSTAbits.SYNC = 0;
60
TXSTAbits.BRGH = 1;
61
TXSTAbits.TX9 = 0;
62
TXSTAbits.TX9D = 0;
63
TXSTAbits.TXEN = 1;
64
65
RCSTAbits.SPEN = 1;
66
RCSTAbits.RX9 = 0;
67
RCSTAbits.CREN = 1;
68
RCSTAbits.ADDEN = 0;
69
70
PIE1bits.RCIE = 1;
71
      
72
INTCONbits.GIEL = 1;
73
INTCONbits.GIEH = 1;
74
INTCONbits.PEIE = 1;
75
76
TRISC=0b10011111; // RX and TX enablen
77
TRISD=0b00000000;
78
LATD = 0x00;
79
80
println (test);
81
Delay1KTCYx(30);
82
83
 while(1) {
84
85
}
86
}
87
88
#pragma interrupt InterruptServiceHigh  
89
void InterruptServiceHigh(void)
90
{
91
  if (PIR1bits.RCIF)
92
  { 
93
    int zahl = 0;
94
  zahl = RCREG;
95
   while(!PIR1bits.TXIF)
96
   {}
97
        Delay1KTCYx(10);
98
       TXREG = zahl; 
99
    LATD = zahl;
100
    PIR1bits.RCIF = 0;
101
  
102
  
103
}
104
}


Vielen Dank für die Hilfe!

von txg (Gast)


Lesenswert?

es funktioniert jetzt...
1
BAUDCON = 0b11100000;

Diese Zeile hat das Problem erzeugt, ich weiß nicht was mich da geritten 
hat...

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.