Hey Leute,
habe mal mit dem USART des xmegas rumgespielt und auch schon eine
Verbindung zum PC herstellen können, doch leider kommen bei mir in HTerm
immer nur 00 an, wenn ich was an den MC sende.
Wisst ihr woran das liegen kann? Ist die interne Clock vielleicht zu
ungenau?
Hier der Code:
1 | #include <stdint.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | int main(void)
|
6 | {
|
7 | PORTE.DIR = 0xff; // LED-Port als Ausgang schalten
|
8 | PORTE.OUT = 0xff; // LEDs ausschalten
|
9 |
|
10 | cli(); // Globale Interrupts deaktivieren
|
11 |
|
12 | USARTC0.BAUDCTRLA = 0x67; // Baudrate einstellen (19200)
|
13 | USARTC0.BAUDCTRLB = 0; // BSEL = 0
|
14 | USARTC0.CTRLA = USART_RXCINTLVL_HI_gc; // Receive Interrupt Enable, Interrupt Level High
|
15 | USARTC0.CTRLC = USART_CHSIZE_8BIT_gc | // Bit Größe auf 8 Bit stellen
|
16 | USART_CMODE_ASYNCHRONOUS_gc | // Asynchroner Modus
|
17 | USART_PMODE_DISABLED_gc; // Parity Bit deaktivieren
|
18 | USARTC0.CTRLB = USART_TXEN_bm | USART_RXEN_bm; // Transmitt + Receive Enable
|
19 | PORTC.DIR = 0x08; // TxD Pin als Ausgang schalten
|
20 |
|
21 | PMIC.CTRL = PMIC_HILVLEN_bm; // High Level Interrupts aktivieren
|
22 | sei(); // Globale Interrupts aktivieren
|
23 |
|
24 | while(1)
|
25 | {
|
26 | PORTE.OUTTGL = 0x01;
|
27 | }
|
28 | }
|
29 |
|
30 | ISR(USARTC0_RXC_vect)
|
31 | {
|
32 | PORTE.OUTTGL = 0x88; // wird ISR auch wirklich aufgerufen ?
|
33 | while (!(USARTC0.STATUS & USART_DREIF_bm)); // Warte bis das Data Register Empty Flag gesetzt ist
|
34 | USARTC0.DATA = USARTC0.DATA; // Schreibe den Wert des Receive Buffers gleich wieder in das TX Register
|
35 | }
|
Ich habe nochmal ein Screenshot von HTerm gemacht, damit ihr seht was
ich meine.
Viele Grüße