Forum: Compiler & IDEs Hilfe bei der seriell Port Kommunikation mit Atxmega64a3u


von Ji L. (g44)


Lesenswert?

Hallo nochmal,
erstmal vielen Dank für die Hilfe letztes mal, leider komme ich wieder 
nicht weiter :(
ich bin ein blutiger Anfänger (habe gerade mal das Anfängertutorial auf
der Seite durchgemacht) auf diesem Gebiet und bin gerade dabei eine
Atxmega64a3u so zu programmieren dass eine kommunikation über einen
seriellen Port am PC stattfinden kann. Ich benutze AtmelStudio 6.2 und 
programmiere in C++.

Ich habe die Ports definiert und leider ist es so, dass am PC über den 
Seriellen Anschluss nichts auslesen kann. Ich wollte euch fragen ob ihr 
mir weiterhelfen könnt und möchte mich entschuldigen, wenn es ein sehr 
trivialer Fehler ist..
1
#define F_CPU 32000000UL
2
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6
#define BAUD 9600
7
#include <util/setbaud.h>
8
#undef BAUD
9
#include <stdio.h>
10
11
12
static int uart_putchar(char c, FILE *stream);
13
14
FILE * uart_str;
15
16
void io_init(void){
17
  PORTC_DIR |= (1<<4);
18
}
19
void clock_init(void){
20
  OSC.CTRL |= OSC_RC32MEN_bm;
21
  while(!(OSC.STATUS & OSC_RC32MRDY_bm));
22
  CCP = CCP_IOREG_gc;
23
  CLK.CTRL = (CLK.CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_RC32M_gc;
24
}
25
void setUPSerial()
26
{
27
  PORTC_REMAP |= 0x16;
28
  PORTC_OUTSET = PIN3_bm;
29
  PORTC_DIRSET = PIN3_bm;
30
  
31
  PORTC_OUTCLR = PIN2_bm;
32
  PORTC_DIRCLR = PIN2_bm;
33
  
34
  
35
  USARTC0_BAUDCTRLB = 0;
36
  USARTC0_BAUDCTRLA = 0x22;
37
  USARTC0_CTRLA =0;
38
  USARTC0_CTRLC = USART_CHSIZE_8BIT_gc;
39
  USARTC0_CTRLB = USART_TXEN_bm | USART_RXEN_bm;
40
}
41
  
42
void sendChar(char c)
43
{
44
    
45
  while( !(USARTC0_STATUS & USART_DREIF_bm) ); 
46
    
47
  USARTC0_DATA = c;
48
    
49
}
50
void sendString(char *text)
51
{
52
  while(*text)
53
  
54
  {
55
    sendChar(*text++);
56
  }
57
}
58
  
59
static int uart_putchar (char c, FILE *stream)
60
{
61
  if (c == '\n')
62
  uart_putchar('\r', stream);
63
    
64
    while (  !(USARTC0_STATUS & USART_DREIF_bm) );
65
    
66
    USARTC0_DATA = c;
67
    
68
    return 0;
69
  }
70
  
71
char usart_receiveByte()
72
{
73
  while( !(USARTC0_STATUS & USART_RXCIF_bm) ); 
74
  return USARTC0_DATA;
75
}
76
77
int uart_getchar(FILE *stream)
78
{
79
  while( !(USARTC0_STATUS & USART_RXCIF_bm) ); 
80
  char data = USARTC0_DATA;
81
  if(data == '\r')
82
  data = '\n';
83
  uart_putchar(data, stream);
84
  return data;
85
}
86
87
int main()
88
{
89
  io_init();
90
  clock_init();
91
  setUPSerial();
92
  uart_str = fdevopen(uart_putchar, uart_getchar); 
93
  stdout = stdin = uart_str;
94
  printf("Hello World!\n\r");       
95
  while(1)
96
  {
97
    _delay_ms(100);
98
    PORTC_OUT &= ~(1<<4);
99
    _delay_ms(100);
100
    PORTC_OUT |= (1<<4);
101
  }
102
  return 0;
103
}

von Timmo H. (masterfx)


Lesenswert?

> PORTC_REMAP |= 0x16;
dass du jetzt mit RX/TX an PortC an Pin 6 und 7 hängst ist dir aber 
bewusst?

> USARTC0_BAUDCTRLB = 0;
> USARTC0_BAUDCTRLA = 0x22;
9600 Baud?
Müsste das dann nicht
USARTC0_BAUDCTRLA = 25;
USARTC0_BAUDCTRLB = 0x30;

sein?

von Ji L. (g44)


Lesenswert?

danke, das mit dem Pins für TX/RX ist mir nicht wirklich bewusst, kannst 
du es mir vielleicht erklären? Und beim BAUD hast du natürlich Recht!

von Timmo H. (masterfx)


Lesenswert?

Dann schau mal im Datenblatt unter Port remapping

von Ji L. (g44)


Lesenswert?

sry, ich wurde daraus nicht wirklich schlau. Heißt das, dass ich das 
remappen nicht machen muss um Rx auf Pin2 und Tx auf Pin3 zu setzen?

von Karl H. (kbuchegg)


Lesenswert?

Mit welchem Teil von
1
13.13.14 REMAP – Pin Remap register
2
  The pin remap functionality is available for PORTC - PORTF only.
3
4
....
5
6
+************************************************************************+
7
| Bit 4 – USART0: USART0 Remap                                           |
8
| Setting this bit to one will move the pin location of USART0 from      |
9
| Px[3:0] to Px[7:4].                                                    |
10
+************************************************************************+
11
....

hast du Schwierigkeiten, bzw. was daran ist unklar?

Bit auf 0: Die UART benutzt die Pins im unteren Nibble
Bit auf 1: Die UART benutzt die Pins im oberen Nibble

http://www.atmel.com/Images/Atmel-8331-8-and-16-bit-AVR-Microcontroller-XMEGA-AU_Manual.pdf

von Ji L. (g44)


Lesenswert?

ich habe schwierigkeiten mit der Schreibweise Px[3:0] und Px[7:4]. 
kannst du mir vielleicht sagen wie ich das in meinem Beispiel (Pin 2 auf 
Rx und Pin3 auf Tx) lösen kann? dann kann ich denke ich relativ leicht 
reverse ingenuieren.

von Karl H. (kbuchegg)


Lesenswert?

Ji Luo schrieb:
> ich habe schwierigkeiten mit der Schreibweise Px[3:0] und Px[7:4].

Px  ... der Port von dem die Rede ist.
[3:0] .. die Bits 3 bis 0

von Ji L. (g44)


Lesenswert?

ah okay, das heißt ich muss sie nur remappen wenn ich die Pins 7 bis 4 
ansprechen will?

: Bearbeitet durch User
von Ji L. (g44)


Lesenswert?

Es scheint jetzt auf jedem Fall zu funktionieren, am Oszilloskop kann 
ich lesen dass am COM Port etwas ankommt, allerdings kann ich die 
gesendete Strings am PC (putty Serial) nicht auslesen. Habt ihr 
vielleicht eine Ahnung woran es liegen kann?

von Timmo H. (masterfx)


Lesenswert?

Da du eh ein Oscar dran hast... Vielleicht mal geschaut ob die baudrate 
passt?

von spontan (Gast)


Lesenswert?

Passen die Signalpegel?

von Timmo H. (masterfx)


Lesenswert?

Natürlich sollte da schon ein Max oder USB=> TTL UART dran sein. Guter 
Einwand von spontan

von Ji L. (g44)


Lesenswert?

BAUDrate und Signalpegel sollten eigentlich passen, ich habe geschafft 
dass der Chip von PC ein Signal empfängt (und daraufhin eine LED anfängt 
zu blinken), allerdings funktioniert die Kommunikation auf der anderen 
Seiten irgendwie immer noch nicht...

EDIT: Achso ein Max3211E hängt dran

: Bearbeitet durch User
von Ausgeloggt (Gast)


Lesenswert?

Warum hast du ein "sendChar()" und ein "uart_putchar()", sowie 
"usart_receiveByte()" und "uart_getchar()" -- die mehr oder weniger 
funktionsgleich sind?

Schmeiss doch erst mal alles raus was nicht gebraucht wird,
formattier dein Code "gscheid".

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.