www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Mega1284P und XBee


Autor: Philipp Maricek (lord-maricek)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <stdlib.h>
#include <inttypes.h>
#include <util/delay.h>
#include <avr/interrupt.h> 

#ifndef F_CPU
  #define F_CPU 20000000
#endif 

#define BAUD 57600L
 
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))

int b = 0;

ISR(USART0_RXC0_vect)
{
}

ISR(USART1_RXC1_vect)
{
  uint8_t a = UDR1;
  while (!(UCSR1A & (1<<UDRE1)))
    ;
  UDR1 = a;
}

void uart_init(void)
{
  //UART0 GPS
    UCSR0B |= (1<<RXEN0)|(1<<RXCIE0);     
    UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
 
    UBRR0H = UBRR_VAL >> 8;
    UBRR0L = UBRR_VAL & 0xFF;

  //UART1 XBee
  UCSR1B |= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(1<<TXCIE1);                      
    UCSR1C = (1<<UCSZ11)|(1<<UCSZ10); 
 
    UBRR1H = UBRR_VAL >> 8;
    UBRR1L = UBRR_VAL & 0xFF;
}
 
void delay_ms(unsigned int t)
{
  for(int i=0;i<t;i++)
  {
    _delay_ms(1);
  }
}
 
int main(void)
{
  sei();
  uart_init();
  while (1) 
  {
  }
  return 0;
}

habt ihr ne Idee, was falsch ist?

MfG
Philipp

Autor: Fabian K. (fabian_k)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>habt ihr ne Idee, was falsch ist?

Denk mal über TXCIE1 nach.

Autor: Philipp Maricek (lord-maricek)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Maricek (lord-maricek)
Datum:

Bewertung
0 lesenswert
nicht 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:
  #include <avr/io.h>
#include <stdlib.h>
#include <inttypes.h>
#include <util/delay.h>
#include <avr/interrupt.h> 

#ifndef F_CPU
  #define F_CPU 20000000
#endif 

#define BAUD 57600L
 
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))

int b = 0;

ISR(USART0_RX_vect)
{
}

ISR(USART1_RX_vect)
{
  uint8_t a = UDR1;
  while (!(UCSR1A & (1<<UDRE1)))
    ;
  UDR1 = a;
}

void uart_init(void)
{
  //UART0 GPS
    UCSR0B |= (1<<RXEN0)|(1<<RXCIE0);     
    UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
 
    UBRR0H = UBRR_VAL >> 8;
    UBRR0L = UBRR_VAL & 0xFF;

  //UART1 XBee
  UCSR1B |= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);                      
    UCSR1C |= (1<<UCSZ11)|(1<<UCSZ10); 
 
    UBRR1H = UBRR_VAL >> 8;
    UBRR1L = UBRR_VAL & 0xFF;
}
 
void delay_ms(unsigned int t)
{
  for(int i=0;i<t;i++)
  {
    _delay_ms(1);
  }
}
 
int main(void)
{
  sei();
  uart_init();
  while (1) 
  {
  }
  return 0;
}

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

Autor: Philipp Maricek (lord-maricek)
Datum:

Bewertung
0 lesenswert
nicht 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?
#include <avr/io.h>
#include <stdlib.h>
#include <inttypes.h>
#include <util/delay.h>
#include <avr/interrupt.h> 

#ifndef F_CPU
  #define F_CPU 20000000
#endif 

#define BAUD 57600L
 
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))


volatile uint8_t in_byte = 0; 

ISR(USART0_RX_vect)
{
}

ISR(USART1_RX_vect)
{
  in_byte = UDR1;
  while (!(UCSR1A & (1<<UDRE1)))
    ;
  UDR1 = in_byte;
}

int uart_putc(unsigned char c)
{
    while (!(UCSR1A & (1<<UDRE1)))  
    {
    }                             
 
    UDR1 = c;                   
    return 0;
}


void uart_puts (char *s)
{
    while (*s)
    {
        uart_putc(*s);
        s++;
    }
}

void uart_init(void)
{
  //UART0 GPS
    UCSR0B |= (1<<RXEN0)|(1<<RXCIE0);     
    UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
 
    UBRR0H = UBRR_VAL >> 8;
    UBRR0L = UBRR_VAL & 0xFF;

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

  UBRR1L = UBRR_VAL & 0xFF;
    UBRR1H = UBRR_VAL >> 8;
}
 
void delay_ms(unsigned int t)
{
  for(int i=0;i<t;i++)
  {
    _delay_ms(1);
  }
}
 
int main(void)
{
  DDRC |= 0xff;
  PORTC |= 0xff;
  sei();
  uart_init();
  char s[10] = {"asdfghjkl"};
  s[9] = '\n';
  uart_puts(s);
  PORTC &= ~PORTC;
  while (1) 
  {
    USART0_RX_vect();
  }
  return 0;
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Philipp Maricek (lord-maricek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In den Fuses auf
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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Philipp Maricek (lord-maricek)
Datum:

Bewertung
0 lesenswert
nicht 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:
UBRR1H = (unsigned char)21 >> 8;
  UBRR1L = (unsigned char)21 & 0xFF;

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lösch mal die CKDIV8 Fuse.

Autor: Philipp Maricek (lord-maricek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, cool jetzt gehts,
vielen dank :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.