Hallo Ihr,
ich scheitere kläglich daran die serielle Schnittstelle zu verwenden.
Verwendet habe ich den Beispielcode von Microchip, angepasst auf das
Curiosity Board. Hier liegt der CDC-Port auf USART3 PB0/PB1(laut
Dokumentation)
1 | #define F_CPU 3333333UL
|
2 | #define USART3_BAUD_RATE(BAUD_RATE) ((float)(F_CPU * 64 / (16 * (float)BAUD_RATE)) + 0.5)
|
3 | #define MAX_COMMAND_LEN 8
|
4 | #define INIT_DELAY 10 /* Delay to invalidate the after-reset noise on the PC0 pin (TX) */
|
5 |
|
6 | #include <avr/io.h>
|
7 | #include <stdio.h>
|
8 | #include <string.h>
|
9 | #include <util/delay.h>
|
10 |
|
11 | void USART3_init(void);
|
12 | void USART3_sendChar(char c);
|
13 | void USART3_sendString(char *str);
|
14 | char USART3_readChar(void);
|
15 | void LED_on(void);
|
16 | void LED_off(void);
|
17 | void LED_init(void);
|
18 | void executeCommand(char *command);
|
19 |
|
20 | void USART3_init(void)
|
21 | {
|
22 | USART3.BAUD = (uint16_t)USART3_BAUD_RATE(9600);
|
23 |
|
24 | USART3.CTRLB |= USART_RXEN_bm | USART_TXEN_bm;
|
25 |
|
26 | PORTB.DIR |= PIN0_bm;
|
27 | PORTB.DIR &= ~PIN1_bm;
|
28 | }
|
29 |
|
30 | void USART3_sendChar(char c)
|
31 | {
|
32 | while (!(USART3.STATUS & USART_DREIF_bm))
|
33 | {
|
34 | ;
|
35 | }
|
36 | USART3.TXDATAL = c;
|
37 | }
|
38 |
|
39 | void USART3_sendString(char *str)
|
40 | {
|
41 | for(size_t i = 0; i < strlen(str); i++)
|
42 | {
|
43 | USART3_sendChar(str[i]);
|
44 | }
|
45 | }
|
46 |
|
47 | char USART3_readChar(void)
|
48 | {
|
49 | while (!(USART3.STATUS & USART_RXCIF_bm))
|
50 | {
|
51 | ;
|
52 | }
|
53 | return USART3.RXDATAL;
|
54 | }
|
55 |
|
56 | void LED_on(void)
|
57 | {
|
58 | PORTF.OUT &= ~PIN5_bm;
|
59 | }
|
60 |
|
61 | void LED_off(void)
|
62 | {
|
63 | PORTF.OUT |= PIN5_bm;
|
64 | }
|
65 |
|
66 | void LED_init(void)
|
67 | {
|
68 | PORTF.DIR |= PIN5_bm;
|
69 | LED_off();
|
70 | }
|
71 |
|
72 | void executeCommand(char *command)
|
73 | {
|
74 | if(strcmp(command, "ON") == 0)
|
75 | {
|
76 | LED_on();
|
77 | USART3_sendString("OK, LED ON.\r\n");
|
78 | }
|
79 | else if (strcmp(command, "OFF") == 0)
|
80 | {
|
81 | LED_off();
|
82 | USART3_sendString("OK, LED OFF.\r\n");
|
83 | }
|
84 | else
|
85 | {
|
86 | USART3_sendString("Type ON/OFF to control the LED.\r\n");
|
87 | }
|
88 | }
|
89 |
|
90 | int main(void)
|
91 | {
|
92 | PORTF_DIR &= ~PIN6_bm;
|
93 |
|
94 | char command[MAX_COMMAND_LEN];
|
95 | uint8_t index = 0;
|
96 | char c;
|
97 |
|
98 | /* This delay invalidates the initial noise on the TX line, after device reset. */
|
99 | _delay_ms(10);
|
100 |
|
101 | USART3_init();
|
102 | LED_init();
|
103 | LED_on();
|
104 | USART3_sendString("Type ON/OFF to control the LED.\r\n");
|
105 | _delay_ms(1000);
|
106 | LED_off();
|
107 | _delay_ms(1000);
|
108 | while (1)
|
109 | {
|
110 | if(!(PORTF.IN & PIN6_bm)){
|
111 | LED_on();
|
112 | _delay_ms(1000);
|
113 | LED_off();
|
114 | }
|
115 | LED_on();
|
116 | _delay_ms(100);
|
117 | LED_off();
|
118 | _delay_ms(250);
|
119 | /* c = USART3_readChar();
|
120 | if(c != '\n' && c != '\r')
|
121 | {
|
122 | command[index++] = c;
|
123 | if(index > MAX_COMMAND_LEN)
|
124 | {
|
125 | index = 0;
|
126 | }
|
127 | }
|
128 |
|
129 | if(c == '\r')
|
130 | {
|
131 | command[index] = '\0';
|
132 | index = 0;
|
133 | executeCommand(command);
|
134 | }
|
135 | */
|
136 | }
|
137 | }
|
Das lesen von Serialport blockiert weil er da pollt (auskommentiert).
Zum Testen habe ich die Ledsteuerung etwas geändert -> funktioniert ->
F_CPU ist auch richtig eingestellt.
Auf dem COM3 (am PC) kommt jedoch nichts an was ich sende.
Das Boad hat die Softwareversion:
1 | Currently loaded versions:
|
2 | Application version...........1.21.37 (0x01.0x15.0x25)
|
3 | Tool pack version .............1.6.222
|
Was habe ich übersehen?
Gruß
Anselm