Forum: Mikrocontroller und Digitale Elektronik USART Fifo Problem - geht nur bei vorherigem Manuellem senden


von Philipp M. (lord-maricek)


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

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.