Forum: Mikrocontroller und Digitale Elektronik Xmega32A4U UART


von Michael H. (h_m)


Angehängte Dateien:

Lesenswert?

Guten Tag,

ich möchte gerne bei meinem Xmega32a4u den Uart nutzen dazu habe ich aus 
einem Tutorial den Nachfolgen Code benutzt. Zur Verbindung habe ich 
einen Usb Usart Converter Cp210X, der an com 10 erkannt wird und somit 
auch an meinem Terminal "h-term" das ich wie im Bild eingestellt habe.

verdrahtet habe ich es so

von PortC PC3----> TX Cp210x
von Portc PC2----> Rx Cp210x

mein Problem ist jetzt das nichts gesendet wird bzw. im Terminal wird 
mir nichts angezeigt habe ich hier etwas falsch gemacht??
1
/*
2
 * Hallo_Welt.c
3
 *
4
 * USARTC0, Tx Pin -> PC3.
5
 * 9600 baud mit 2 MHz clock. BSCALE = 0
6
 * BSEL = ( 32000000 / (2^0 * 16*19200)) -1 = 12
7
 * Fbaud = 32000000 / (2^0 * 16 * (12+1))  = 9615 bits/sec
8
 *
9
 *
10
 * Created: 02.05.2012 21:36:29
11
 *  Author: Daniel
12
 */ 
13
14
#include <avr/io.h>
15
#include <avr/interrupt.h>
16
#include <string.h>
17
18
//Variablen
19
char lenght = 0x00;
20
char Counter = 0x00;
21
22
int main(void)
23
{
24
  Clock_init();  
25
  Int_init();
26
  UART_init();
27
  TimerC0_init();  
28
  
29
  TimerC0_Freq(0x85ED);  
30
  
31
    while(1)
32
    {
33
    }
34
}
35
36
void Clock_init(void)
37
{  
38
  OSC.CTRL |= OSC_RC32MEN_bm;                                              // Oszillator auf 32Mhz stellen
39
  while(!(OSC.STATUS & OSC_RC32MEN_bm));                                        // Warten bis der Oszillator bereit ist
40
  CCP = CCP_IOREG_gc;
41
  CLK.CTRL = CLK_SCLKSEL_RC32M_gc;                                          // Clock auf 32MHz stellen                                              
42
}
43
44
void Int_init(void)
45
{
46
  PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;                          // Interrupts (Highlevel, Mediumlevel und Lowlevel freigeben)
47
  sei();                                                        // Globale Interruptfreigabe
48
}
49
50
void UART_init(void)
51
{
52
  PORTC.DIR = 0xEF;  
53
  
54
  USARTC0.BAUDCTRLB = 0;                                                // BSCALE = 0 
55
  USARTC0.BAUDCTRLA = 0x67;                                                // Baudrate 19200 @ 41MHz
56
  USARTC0.CTRLB = USART_TXEN_bm | USART_RXEN_bm;                                    // RX+TX Enable CLK
57
  USARTC0.CTRLC = 0x03;                                                  // Async, no parity, 8 bit data, 1 stop bit
58
  USARTC0.CTRLA = 0;    
59
}
60
61
void TimerC0_init()
62
{
63
  TCC0.CTRLA = TC_CLKSEL_DIV1024_gc;                                          // Vorteiler einstellen
64
  TCC0.CTRLB = 0x00;                                                  // Timer in Normalmodus stellen
65
  TCC0.INTCTRLA = 0x03;                                                // Interrupt konfigurieren  
66
}
67
68
void TimerC0_Freq(int TTW)
69
{
70
  TCC0.PER = TTW;                                                    // Timer-Topwert(TTW) einstellen  
71
}
72
73
void Send_UART(char data[])
74
{
75
  lenght = strlen(data);
76
  
77
  while(Counter < lenght)
78
  {
79
    while (!(USARTC0.STATUS & USART_DREIF_bm));
80
    USARTC0.DATA = data[Counter];  
81
    Counter++;
82
  }
83
    
84
  Counter = 0x00;  
85
  while (!( USARTC0.STATUS & USART_DREIF_bm));
86
  USARTC0.DATA = 0x0A;  
87
  while (!( USARTC0.STATUS & USART_DREIF_bm));
88
  USARTC0.DATA = 0x0D;
89
}
90
91
ISR(TCC0_OVF_vect)
92
{
93
  TimerC0_Freq(0x85ED);  
94
  Send_UART("Hallo Welt!");
95
}

von Bastian W. (jackfrost)


Lesenswert?

Wenn du beide Tx zusammen geschlossen hast, dann Treiben die 
gegeneinander und können kaputt gehen. Rx muss auf Tx und umgekehrt.

Tx vom xMega ist ja das Rx vom CP210x

Gruß JackFrost

von Michael H. (h_m)


Lesenswert?

Bastian W. schrieb:
> Wenn du beide Tx zusammen geschlossen hast, dann Treiben die
> gegeneinander und können kaputt gehen. Rx muss auf Tx und umgekehrt.
>
> Tx vom xMega ist ja das Rx vom CP210x
>
> Gruß JackFrost

das ist auch, wenn ich ihn tausche kommt nichts raus.

TX---->RX
RX---->TX

: Bearbeitet durch User
von Bastian W. (jackfrost)


Lesenswert?

Mit deinem Portc.dir = 0xEF hast du nur PC4 als Input
Wird nicht das Problem sein ist aber nicht gut das RX gegen GND treibt.
Nicht das der CP210x damit Probleme hat.

Gruß JackFrost

von J. Zimmermann (Gast)


Lesenswert?

- evtl. ist das PR-Bit gesetzt (Power reduction)
- Welche Entw.-Umgebung benutzt Du? Einige produzieren so lahmen Code, 
dass das setzen des CCP mehr als 4 Takte braucht, dann müsste Dein XMEGA 
mit 1MHz laufen, versuch mal mit anderer Baudrate zu empfangen.
mfg
Achim

von Timmo H. (masterfx)


Lesenswert?

Michael H. schrieb:
> OSC.CTRL |= OSC_RC32MEN_bm;
> // Oszillator auf 32Mhz stellen
>   while(!(OSC.STATUS & OSC_RC32MEN_bm));
> // Warten bis der Oszillator bereit ist
>   CCP = CCP_IOREG_gc;
>   CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
1
OSC.CTRL |= OSC_RC32MEN_bm;
2
while(!(OSC.STATUS & OSC_RC32MRDY_bm));
3
CCP = CCP_IOREG_gc;
4
CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
?
EDIT: obwohl ich sehe gerade OSC_RC32MEN_bm == OSC_RC32MEN_bm

EDIT2: Achso falls du das Modul hast 
https://www.ebay.de/itm/USB-zu-TTL-Konverter-Modul-CP2102-3-3V-5V-FTDI-Serial-Adapter-Schnellversa/253272361499?hash=item3af8358a1b:g:B6kAAOSwTOtasizQ
sind Rx Tx vertauscht. Zumindest bei meinen

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Michael H. schrieb:
> einen Usb Usart Converter Cp210X
Was für Pegel gibt der aus? RS232 oder TTL?

> verdrahtet habe ich es so
> von PortC PC3----> TX Cp210x
> von Portc PC2----> Rx Cp210x
Brauchst du da zwischen uC und USB Adapter evtl. einen MAX232 
Pegelwandler?

Michael H. schrieb:
> das ist auch, wenn ich ihn tausche kommt nichts raus.
Teile dein Problem in kleine Happen: was passiert, wenn du ganz ohne uC 
am USB Wandler RX und TX brückst?
Wenn das funktioniert,  dann sende mit dem uC fortlaufend Werte und 
mache zwischen jedem Zeichen eine kurze Pause.
Wenn das funktioniert, dann empfange Kit dem uC Zeichen und gebe die auf 
LEDs aus.
Und wenn das auch klappt, dann kannst du das Alles in dein Programm 
zusammenfassen.

: Bearbeitet durch Moderator
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.