Problem mit Mega1284P und XBee

OP #2061226
Lesenswert?

Moin,

ich habe ein XBee Pro an einen AtMega1284P angeschlossen. An RXD1/TXD1. 
Ich hab alles richtig verbunden. Am Mega1284P habe ich das XBee mit dem 
http://www.watterott.com/de/XBee-Explorer-Regulated angeschlossen, und 
am PC hängt das gleiche Board mit USB. Die XBees sind auch richtig 
konfiguriert und schon öfters getestet. Ich habe jetzt versucht, Daten 
zum Mega zusenden, und die dann zurück zusenden. Es kommen aber keine 
Daten zurück.
Hier der Code:
1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include <inttypes.h>
4
#include <util/delay.h>
5
#include <avr/interrupt.h> 
6

7
#ifndef F_CPU
8
  #define F_CPU 20000000
9
#endif 
10

11
#define BAUD 57600L
12
 
13
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
14
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
15

16
int b = 0;
17

18
ISR(USART0_RXC0_vect)
19
{
20
}
21

22
ISR(USART1_RXC1_vect)
23
{
24
  uint8_t a = UDR1;
25
  while (!(UCSR1A & (1<<UDRE1)))
26
    ;
27
  UDR1 = a;
28
}
29

30
void uart_init(void)
31
{
32
  //UART0 GPS
33
    UCSR0B |= (1<<RXEN0)|(1<<RXCIE0);     
34
    UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
35
 
36
    UBRR0H = UBRR_VAL >> 8;
37
    UBRR0L = UBRR_VAL & 0xFF;
38

39
  //UART1 XBee
40
  UCSR1B |= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(1<<TXCIE1);                      
41
    UCSR1C = (1<<UCSZ11)|(1<<UCSZ10); 
42
 
43
    UBRR1H = UBRR_VAL >> 8;
44
    UBRR1L = UBRR_VAL & 0xFF;
45
}
46
 
47
void delay_ms(unsigned int t)
48
{
49
  for(int i=0;i<t;i++)
50
  {
51
    _delay_ms(1);
52
  }
53
}
54
 
55
int main(void)
56
{
57
  sei();
58
  uart_init();
59
  while (1) 
60
  {
61
  }
62
  return 0;
63
}

habt ihr ne Idee, was falsch ist?

MfG
Philipp
OP #2061973
Lesenswert?

Moin,

External Clock ist in den Fuses eingestellt, aber wenn ich mit der 
delay_ms Funktion z.b. Leds blinken lasse, ist die Funktion nicht 
solange, wie sie sein sollte. Das TXCIE1 hatte ich gesetzt, weil ich 
vorher damit was Probiert habe. Kann man TXCIE1 und RXCIE1 nicht 
gleichzeitig aktivieren?

MfG
Philipp
OP #2064496
Lesenswert?

Moin,

ich hatte "UCSR1C = .." und nicht "|=". Jetzt sehe ich anhand der LEDs, 
die auf dem XBee Explorer Board sind, dass Daten gesendet werden, und 
dass auch welche zurück kommen. Jetzt sieht mein Codestück so aus:
1
  #include <avr/io.h>
2
#include <stdlib.h>
3
#include <inttypes.h>
4
#include <util/delay.h>
5
#include <avr/interrupt.h> 
6

7
#ifndef F_CPU
8
  #define F_CPU 20000000
9
#endif 
10

11
#define BAUD 57600L
12
 
13
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
14
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
15

16
int b = 0;
17

18
ISR(USART0_RX_vect)
19
{
20
}
21

22
ISR(USART1_RX_vect)
23
{
24
  uint8_t a = UDR1;
25
  while (!(UCSR1A & (1<<UDRE1)))
26
    ;
27
  UDR1 = a;
28
}
29

30
void uart_init(void)
31
{
32
  //UART0 GPS
33
    UCSR0B |= (1<<RXEN0)|(1<<RXCIE0);     
34
    UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
35
 
36
    UBRR0H = UBRR_VAL >> 8;
37
    UBRR0L = UBRR_VAL & 0xFF;
38

39
  //UART1 XBee
40
  UCSR1B |= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);                      
41
    UCSR1C |= (1<<UCSZ11)|(1<<UCSZ10); 
42
 
43
    UBRR1H = UBRR_VAL >> 8;
44
    UBRR1L = UBRR_VAL & 0xFF;
45
}
46
 
47
void delay_ms(unsigned int t)
48
{
49
  for(int i=0;i<t;i++)
50
  {
51
    _delay_ms(1);
52
  }
53
}
54
 
55
int main(void)
56
{
57
  sei();
58
  uart_init();
59
  while (1) 
60
  {
61
  }
62
  return 0;
63
}

Aber in der XBee Software, XCTU, sind nur Punkte zusehen, und nicht die 
Buchstaben, die ich hinsende.

Was könnte n0och falsch sein?

MfG
Philipp
OP #2065989
Lesenswert?

Moin,

ich habe auch nochmal versucht, manuel irgentwelche Daten zusenden, aber 
da kommen ebenfalls nur Punkte bei raus. Ich habe es auch nochmal mit 
der dem Terminal in der Arduino IDE Versucht, aber da kommen nur 
quadrate (also undefinierbare Zeichen). Kann mir niemal helfen?
1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include <inttypes.h>
4
#include <util/delay.h>
5
#include <avr/interrupt.h> 
6

7
#ifndef F_CPU
8
  #define F_CPU 20000000
9
#endif 
10

11
#define BAUD 57600L
12
 
13
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
14
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
15

16

17
volatile uint8_t in_byte = 0; 
18

19
ISR(USART0_RX_vect)
20
{
21
}
22

23
ISR(USART1_RX_vect)
24
{
25
  in_byte = UDR1;
26
  while (!(UCSR1A & (1<<UDRE1)))
27
    ;
28
  UDR1 = in_byte;
29
}
30

31
int uart_putc(unsigned char c)
32
{
33
    while (!(UCSR1A & (1<<UDRE1)))  
34
    {
35
    }                             
36
 
37
    UDR1 = c;                   
38
    return 0;
39
}
40

41

42
void uart_puts (char *s)
43
{
44
    while (*s)
45
    {
46
        uart_putc(*s);
47
        s++;
48
    }
49
}
50

51
void uart_init(void)
52
{
53
  //UART0 GPS
54
    UCSR0B |= (1<<RXEN0)|(1<<RXCIE0);     
55
    UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
56
 
57
    UBRR0H = UBRR_VAL >> 8;
58
    UBRR0L = UBRR_VAL & 0xFF;
59

60
  //UART1 XBee
61
  UCSR1B |= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);                      
62
    UCSR1C |= (1<<UCSZ11)|(1<<UCSZ10); 
63

64
  UBRR1L = UBRR_VAL & 0xFF;
65
    UBRR1H = UBRR_VAL >> 8;
66
}
67
 
68
void delay_ms(unsigned int t)
69
{
70
  for(int i=0;i<t;i++)
71
  {
72
    _delay_ms(1);
73
  }
74
}
75
 
76
int main(void)
77
{
78
  DDRC |= 0xff;
79
  PORTC |= 0xff;
80
  sei();
81
  uart_init();
82
  char s[10] = {"asdfghjkl"};
83
  s[9] = '\n';
84
  uart_puts(s);
85
  PORTC &= ~PORTC;
86
  while (1) 
87
  {
88
    USART0_RX_vect();
89
  }
90
  return 0;
91
}
Gast #2066356
Lesenswert?

>aber da kommen nur
>quadrate (also undefinierbare Zeichen). Kann mir niemal helfen?

Falsche Baudrate. Wahrscheinlich läuft dein Programm
gar nicht mit 20MHz. Sind die Fuses auf "Crystal Osc" gestellt?
Gast #2066406
Lesenswert?

Mach das mal so:

int main(void)
{
  DDRC |= 0xff;
  PORTC |= 0xff;
  uart_init();

  sei();

  uart_puts("asdfghjkl\n");
  PORTC &= ~PORTC;
  while (1)
  {
//    USART0_RX_vect(); // was soll das denn werden?
  }
  return 0;
}
OP #2066431
Lesenswert?

Immer noch das gleiche, nur Punkte bzw. Quadrate. Ich habe auch die XBee 
Konfiguration nochmal geprüft, die Baud steht da auf 57600.

USART0_RX_vect(); (manueller Interrupt aufruf) hatte ich noch drin, weil 
ich mich schon durch ein Foren gearbeitet habe, und darauf gestoßen bin, 
und das mal probieren wollte. Habs aber vergessen raus zunehmen.

Ich habe mit dieser Tabelle nochmal versucht, direkt 21 (20Mhz bei 
57600) in das UBRR einzugeben:
1
UBRR1H = (unsigned char)21 >> 8;
2
  UBRR1L = (unsigned char)21 & 0xFF;

Geht aber auch nicht, ich versuch es morgen mal mit einer anderen 
Baudrate.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren