PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem Atmega - BTM222 - Android



damfino
23.03.2014, 14:29
Hallo,
Ich möchte auch in die Welt von Android Apps und Fernbedienungen einsteigen, und habe deswegen meinen Robi mit einem BTM222 ausgerüstet. Nach vielen Versuchen gelingt endlich das Senden an ein Android Bluetooth Terminal. Aber an den Atmega kann ich nur maximal 12 Zeichen schicken, dann hängt der Atmega in der Routine zum USART Buffer auslesen, dh Buffer ist leer obwohl noch Zeichen ausständig sind.
BTM222 läuft mit Standardeinstellung.
RX/TX angeschlossen über Levelshifter, diese waren schon auf der Platine mit dem BTM222 Modul.


Ausgewertet wird es mit einem Atmega1284p an USART2.

Die Routinen sind analog zu meiner GPS Auswertung, das Protokoll dazu werde ich ähnlich aufbauen:



#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#define BAUD2 19200UL
#define UBRR_BAUD2 ((F_CPU/(16UL*BAUD2))-1) // Probleme, Werte laut Datenblatt Atmega unten für UBRR verwendet

#if defined( __AVR_ATmega1284P__ )||( __AVR_ATmega644P__ )
#define USART_Daten (UCSR0A & (1<<RXC0))
#define USART_FrameError (UCSR0A & (1<<FE0))
#define USART_Overrun (UCSR0A & (1<<DOR0))


#define USART_Daten_Trans (UCSR0A & (1<<UDRE0))
#define USART_Buffer UDR0

#define ISR_Timer2 TIMER2_COMPA_vect


#define USART2_Daten (UCSR1A & (1<<RXC1))
#define USART2_FrameError (UCSR1A & (1<<FE1))
#define USART2_Overrun (UCSR1A & (1<<DOR1))
#define USART2_Daten_Trans (UCSR1A & (1<<UDRE1))
#define USART2_Buffer UDR1
#define CR "\r"
#endif

#elif defined( __AVR_ATmega1284P__ )||( __AVR_ATmega644P__ )

/*+++++++Timer2++++++++++++++++*/
TCCR2A = (1<<WGM21);// CTC Mode
TCCR2B = (1<<CS20) | (1<<CS21) | (1<<CS22); // Prescaler 1024
TIMSK2 = (1<<OCIE2A); //Interupt compare match enable
OCR2A=15; // alle 1ms 1 Interrupt

/* Set baud rate */
UBRR0H = (unsigned char)(UBRR_BAUD1>>8);
UBRR0L = (unsigned char)UBRR_BAUD1;
/*+++ UART +++++++++*/
/* Enable receiver and transmitter */
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
// UCSR0B = (1<<RXEN0);
/* 8data, 1stop bit */
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);

UBRR1H = 0; //(unsigned char)(UBRR_BAUD2>>8);//0
UBRR1L = 51; //(unsigned char)UBRR_BAUD2;//51
/*+++ UART +++++++++*/
/* Enable receiver and transmitter */
UCSR1B = (1<<RXEN1)|(1<<TXEN1);

/* 8data, 1stop bit */
UCSR1C = (1<<UCSZ11)|(1<<UCSZ10);


#endif


unsigned char Get_UART2()
{

unsigned char c,i,x,komma;
komma = ',';
x=0;
i=0;

c=USART2_Receive();
if (c=='*')
{
do
{
c=USART2_Receive();

if(c==komma) return i; //Ende eines Wertes erreicht

// if((c!=komma)&&(c!='\n')&&(c!='\r')&&(c!='\0')&&(c!=0))
{
rx_funk[i]=(char)c;
i++;
if (i>=20) {rx_funk[i]=0;x=1;break;}
rx_funk[i]=0; //End of String updaten
}
// else {rx_funk[i]=0;x=1;break;} //End of String updaten

}while(x!=1);
}
return i;

}


static inline unsigned char USART2_Receive( void )
{unsigned short timeout=0;
/* Wait for data to be received */


while (!(USART_Daten))
{timeout++;
if (timeout>30000) break;
}

if (USART2_FrameError||USART2_Overrun) // bei Fehler 0 zurückgeben, USART lesen um Flags zu löschen
{USART2_Buffer; return(0);}

/* Get and return received data from buffer */
else return USART2_Buffer;

}


void USART2_Transmit (unsigned char s)
{

while ( !( USART2_Daten_Trans) );
// Put data into buffer, sends the data
USART2_Buffer = s;
}

// string über Uart2
void USART2_Transmit_s (char *s)
{

do
{
USART2_Transmit (*s);
}
while (*s++);

}

// Aufruf in Endlosschleife in "main" zum Testen
if (USART2_Daten)
{
rx_funk_l=Get_UART2(); // Länge des empfangenen Strings

if (rx_funk_l!=0) // 0 == ungültig in Get_UART2()
{
lcd_clrscr();

lcd_gotoxy(0,1);lcd_puts(rx_funk);


_delay_ms(50);
USART2_Transmit_s("yyyyxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzz"CR);// Test Echo
}





Vielleicht weiss jemand was ich noch beachten muss damit man mehr Zeichen sicher übertragen kann? Bei meinem GPS Empfang habe ich kein timeout wie in USART2_Receive() und es funktioniert im Gegensatz zu hier problemlos.

Die AT Befehle kommen vom Atmega aus anscheinend auch nicht am BTM222 an, Beispielcode der AT Befehle ist von hier übernommen: http://xennis.org/wiki/Bluecontroller_%28BCA8-BTM%29

Zum Testen habe ich halt nur das Tablett, hab keinen Bluetooth Adapter am PC.

LG!