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 das1 | 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