Hallo allerseits.
Ich und ein Kommilitone müssen als Projekt für die Hochschule einen
Microcontroller an einen CAN-Netzwerk anschließen und die Daten
"mitlauschen" und über die serielle Schnittstelle an einen PC schicken.
Mein Problem dabei ist, dass das mit der seriellen Schnittstelle nicht
ordentlich funktioniert. Ich denke es hat etwas mit der Baudrate zutun,
weil wenn ich 26 (war in einem Beispielprojekt vom Herrsteller
angegeben) nehme bekomme ich 0xFE auf die Console. Wenn ich 19200 oder
19200 & 0x1fff nehme (wiederum in anderem Beispielprojekt) bekomme ich
00 00 00 auf die Console. Dabei spielt es keine Rolle was für Zeichen
oder Zahl ich auf die Leitung der seriellen Schnittstelle lege. Baudrate
ist auf der Console auf 19200 Baud gestellt.
Mein Controllermodule: MC9S12DP512 (CardS12.DP512)
Unser Code bis jetzt:
1 | #ifndef __CARDS12_LED_H
|
2 | #define __CARDS12_LED_H
|
3 |
|
4 | #include <mc9s12dp512.h>
|
5 | #include "s12_crg.h"
|
6 |
|
7 | /* Macros */
|
8 | #define initLED() DDRH |= 0x80
|
9 | #define offLED() DDRH |= 0x80
|
10 | #define onLED() DDRH &= ~0x80
|
11 | #define toggleLED() DDRH ^= 0x80
|
12 |
|
13 | /* Functions */
|
14 |
|
15 | /* this func is called by the Startup Code: */
|
16 | void _HC12Setup(void) {
|
17 | }
|
18 |
|
19 |
|
20 | /* redirect all output by declaring a custom putchar() func
|
21 | (the following function declaration takes precedence over the
|
22 | same function name in the standard library)
|
23 | */
|
24 | void putSCI0(int c) {
|
25 | while((SCI0SR1 & 0x80) == 0) ; // loop until TDRE set
|
26 | SCI0DRL = c;
|
27 | }
|
28 |
|
29 |
|
30 | /* redirect (as above) receive channel */
|
31 | int getSCI0(void) {
|
32 | while((SCI0SR1 & 0x20) == 0) ; // loop until RDRF set
|
33 | return SCI0DRL;
|
34 | }
|
35 | //-----------------------------------------------------------------------------
|
36 |
|
37 | /*
|
38 | void delay(void) {
|
39 | unsigned n = 0;
|
40 | do {
|
41 | n--;
|
42 | } while(n);
|
43 | }*/
|
44 |
|
45 | //-----------------------------------------------------------------------------
|
46 |
|
47 | // program entry is here:
|
48 | void main(void) {
|
49 | int i = 5;
|
50 | initPLL();
|
51 | SCI0BD = 26; // 19200Bd at 8MHz ECLK
|
52 | // SCI0BD = 19200 & 0x1fff;
|
53 | SCI0CR1 = 0; // mode = 8N1
|
54 | SCI0CR2 = 0x0c; // Transmitter + Receiver enable
|
55 | DDRH |= 0x80;
|
56 | while(1) {
|
57 | //printf("e");
|
58 | putSCI0(i);
|
59 | i = getSCI0();
|
60 | }
|
61 |
|
62 | /*while(1) {
|
63 | toggleLED();
|
64 | delay();
|
65 |
|
66 | }*/
|
67 | }
|
Liegt es wirklich an der Baudrate? Was müsste ich eintragen damit es
funktioniert?