Forum: Mikrocontroller und Digitale Elektronik Problem mit Mega1284P und XBee


von Philipp M. (lord-maricek)


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

von Fabian K. (fabian_k)


Lesenswert?

Vielleicht Fuse Bits nicht auf External Clock gestellt, oder am PC 
Baudrate falsch eingestellt?

von holger (Gast)


Lesenswert?

>habt ihr ne Idee, was falsch ist?

Denk mal über TXCIE1 nach.

von Philipp M. (lord-maricek)


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

von Philipp M. (lord-maricek)


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

von Philipp M. (lord-maricek)


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
}

von holger (Gast)


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?

von Philipp M. (lord-maricek)


Lesenswert?

In den Fuses auf
1
Ext. Crystal Osc. 8.0-    MHz; Start-up time: 16K CK + 65 ms
gesetzt.

Passen die berechnungen? Die Formel habe ich aus dem USART Tutorial 
kopiert.

von holger (Gast)


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;
}

von Philipp M. (lord-maricek)


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.

von holger (Gast)


Lesenswert?

Lösch mal die CKDIV8 Fuse.

von Philipp M. (lord-maricek)


Lesenswert?

Ah, cool jetzt gehts,
vielen dank :)

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.