USART Fifo Problem - geht nur bei vorherigem Manuellem senden

OP #2138523
Lesenswert?

Moin,

ich habe diesen Fifo hier genommen:
http://www.gjlay.de/pub/c-code/fifo.html
Wenn er leer ist, gibt er -1 zurück. Zum test sende ich Daten mit einem 
XBee Pro zum Atmega1284P und die Daten werden dann in den XBee_IN Fifo 
geladen. In der Main Funktion soll geprüft werden, ob im XBee_IN Fifo 
Daten drin sind, wenn ja, sollen die an den XBee_OUT Fifo übergeben 
werden, und das Interrupt für TX Complet wird aktiviert. Ganz am anfang 
übergebe ich an den Xbee_OUT Fifo " World ", das wird dann auch ohne 
Props gesendet, aber im weiteren Verlauf geht das nicht mehr. Hier der 
Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h> 
3

4
#include "fifo.h"
5
#include "functions.h"
6
#include "uarts.h"
7

8

9
fifo_t xbee_in;
10
fifo_t xbee_out;
11
uint8_t xbee_in_buffer[20];
12
uint8_t xbee_out_buffer[20];
13

14

15
int main(void){  
16
  
17
  sei();
18
  uart_init();
19
  
20
  fifo_init (&xbee_in, xbee_in_buffer, 100); 
21
  fifo_init (&xbee_out, xbee_out_buffer, 100);   
22

23
  DDRC |= 0xff;
24
  DDRD |= 0xff;
25

26
  set_leds(0xff);
27
  
28
  uart_puts("Hello");
29

30
  uint8_t t[] = {" World "};
31

32
  for(int i=0;i<7;i++){
33
    fifo_put(&xbee_out,t[i]);
34
  }
35
  UCSR1B |= (1<<TXCIE1);
36

37
  while(1){
38
    
39
    int tmp = fifo_get(&xbee_in);
40
    if(tmp!=-1){
41
      //uart_putc('I');
42
      fifo_put(&xbee_out,(unsigned char)tmp);
43
      UCSR1B |= (1<<TXCIE1);
44
    }
45
  }
46
}
47

48

49
ISR(USART1_RX_vect){
50
  uint8_t tmp = UDR1;
51
  fifo_put(&xbee_in,tmp);
52

53
}
54

55
ISR(USART1_TX_vect){
56
  int tmp = fifo_get(&xbee_out);
57
  if(tmp!=-1){ 
58
    UDR1 = (unsigned char)tmp;
59
  }else{
60
    UCSR1B &= ~(1<<TXCIE1);
61
  }
62
}

Uarts.h
1
#include "uarts.h"
2

3
void uart_init(void)
4
{
5
  //UART0 GPS
6
    UCSR0B |= (1<<RXEN0)|(1<<RXCIE0);     
7
    UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
8
 
9
    UBRR0H = UBRR_VAL_GPS >> 8;
10
    UBRR0L = UBRR_VAL_GPS & 0xFF;
11

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

16
  UBRR1H = UBRR_VAL_XBee >> 8;
17
  UBRR1L = UBRR_VAL_XBee & 0xFF;
18
}
19

20
int uart_putc(unsigned char c)
21
{
22
    while (!(UCSR1A & (1<<UDRE1)))
23
    ;                             
24
    UDR1 = c;                   
25
    return 0;
26
}
27

28
void uart_puts (char *s)
29
{
30
    while (*s)
31
    {
32
        uart_putc(*s);
33
        s++;
34
    }
35
}

In der Main Funktion habe ich ein "uart_putc('I');" ausgeklammert. Wenn 
ich das wieder im Programm mit aufnehme, geht das senden wieder, aber 
sobald es wieder ausgeklammert ist, kommt vom Mega nichts mehr zurück.

Das gleiche habe ich auch, wenn ich über der while(1) das " World " 
sende, kommt das auch nur an, wenn ich vorher irgentetwas mit 
uart_puts() oder uart_putc senden.
Woran kann das liegen?
Ich habe schon versucht das
1
while (!(UCSR1A & (1<<UDRE1)))
2
    ;
in die USART1_TX_vect Routine mit aufzunehmen. aber das geht auch nicht.

Könnt ihr mir helfen?

MfG
Philipp Maricek

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