- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 5 von 5

Thema: BTM222 <-UART-> ATmega32 Problem

  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von robo_tom_24
    Registriert seit
    04.02.2012
    Ort
    Burgenland, Österreich
    Beiträge
    485

    BTM222 <-UART-> ATmega32 Problem

    Anzeige

    Praxistest und DIY Projekte
    Hallo
    Ich hab jetzt mein BCA8-BTM mit BTM222 Modul endlich bekommen, nur schaff ich es nicht eine Verbindung zwischen dem BT Modul und dem AVR aufzubauen. Zwischen BTM222 und USB-BT Adapter am PC schaff ich es, erkenntlich am helleren Leuchten einer LED.

    Der Code:
    Code:
    #define BAUD 19200      // Baudrate
    #define F_CPU 8000000 
    
    // Berechnungen
    #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
    #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
    #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)		// Fehler in Promille, 1000 = kein Fehler.
     
    #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
      #error Systematischer Fehler der Baudrate groesser 1% und damit zu hoch! 
    #endif 
    
    
    
    //-------------- INCLUDES
    #include <avr/io.h>  
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    
    
    void USART_Init( void )
    {
    	/* Set baud rate */
    	UBRR0H = UBRR_VAL >> 8;
    	UBRR0L = UBRR_VAL & 0xFF;
      
    	/* Enable receiver and transmitter */
    	UCSR0B = (1<<RXEN0)|(1<<TXEN0);
      
    	/* Set frame format: 8data, 1stop bit */
    	//UCSRC = (1<<URSEL)|(3<<UCSZ0);
    	UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01);		// 1 Stopp Bit
    	UCSR0C &= ~(1<<UMSEL00)&(1<<UMSEL01);		
    }
    
    void USART_Transmit( unsigned char data )
    {
    	/* Wait for empty transmit buffer */
    	while ( !( UCSR0A & (1<<UDRE0)) );
    	
    
    	/* Put data into buffer, sends the data */
    	UDR0 = data;
    }
    
    unsigned char USART_Receive( void )
    {
    	/* Wait for data to be received */
    	while ( !(UCSR0A & (1<<RXC0)) );
    	
    	/* Get and return received data from buffer */
    	return UDR0;
    }
    
    
    int main(void)
    {	
    	DDRD |= 1<<PIND0;
    	PORTD |= 1<<PIND0;
    
    	USART_Init();			// USART einstellen
    	
    	_delay_ms(250);			
    	PORTD &= ~(1<<PIND0);	//LED aus
    	
    	USART_Transmit('O');
    	USART_Transmit('N');
    
    	_delay_ms(1000);
    	PORTD |= 1<<PIND0;		//LED ein
    	
    	while(1)
    	{
    		
    		USART_Transmit('x');
    		
    	}
    
    }//end main
    Hardware:
    -) ATmega328P
    -) BTM222
    -) Belkin USB-BT-Adapter

    Kann es sein dass ich "zu schnell" Zeichen versende? Oder gibt es für das Modul eine Art Initialisierung (AT Befehl senden o.ä.)?
    Geändert von robo_tom_24 (18.05.2012 um 23:03 Uhr) Grund: Hardware vergessen

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zuerst solltest du mal eine normale direkte Verbindung fehlerfrei zum Funktionieren bringen, bevor du anfängst diese Verbindung über ein weiteres Medium zu führen.

    Code:
    UCSR0C &= ~(1<<UMSEL00)&(1<<UMSEL01);
    Diese Zeile ist Unsinn und stellt den UART auf 5 Bit ein.
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von robo_tom_24
    Registriert seit
    04.02.2012
    Ort
    Burgenland, Österreich
    Beiträge
    485
    Wieso stell ich damit 5 Bit ein?
    Die Biteinstellung läuft ja über UCSZ*....

    Ich hab die Einstellungn jetzt hoffentlich richtig geändert:
    Code:
    void USART_Init( void )
    {	
    
    	/* Set baud rate */
    	UBRR0H = UBRR_VAL >> 8;
    	UBRR0L = UBRR_VAL & 0xFF;
    
    	/* Alternativ: */
    	//UBRR0 = UBRR_VAL;
    	
    	/* Enable receiver and transmitter */
    	UCSR0B = 1<<RXEN0 | 1<<TXEN0;  
    
      
    	/* Set frame format: 8data, 1stop bit */
    	UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01);		// 8 Bit Daten und 1 Stopp Bit
    	
    	
    }
    Aber es funktioniert noch immer nicht
    Anscheinend hängt der µC in der Initialisierung. Denn wenn ich alle Zeilen nacheinander auskommentiere funktioniert er erst wenn ich die Zeile
    Code:
    	/* Enable receiver and transmitter */
    	UCSR0B = 1<<RXEN0 | 1<<TXEN0;
    weg lasse. Ich hab mir einen kleinen Versuchsaufbau gemacht: in der while Schleife lasse ich eine LED blinken. Ausser den Porteinstellungen, dem UART_Init und der Endlosschleife mit dem Blinken ist in meinem Programm nichts. Somit sehe ich wo er hängt und ob das Programm es bis zum Blinken schafft
    Doch wo könnte da der Fehler liegen?

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von robo_tom_24 Beitrag anzeigen
    Wieso stell ich damit 5 Bit ein?
    Die Biteinstellung läuft ja über UCSZ*....
    Richtig, und die fragliche Zeile setzt diese Bits auf 0, also 5 Bit.
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von robo_tom_24
    Registriert seit
    04.02.2012
    Ort
    Burgenland, Österreich
    Beiträge
    485
    Ja danke, das Ganze hat sich aber mittlerweile erledigt
    Wenn man näheres wissen will -> Blog

Ähnliche Themen

  1. RP6 - Uart Adapter für btm222
    Von AsuroPhilip im Forum Robby RP6
    Antworten: 52
    Letzter Beitrag: 14.07.2011, 18:37
  2. ATMEGA32+Minesweeper+BTM222
    Von marcel_M im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 07.03.2011, 18:26
  3. ATMega32 UART problem --> Problem gelöst
    Von ChristophB im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 12.03.2010, 19:45
  4. ATmega32 Problem UART Reihenfolge Register
    Von vajk im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 20.09.2009, 18:54
  5. Problem mit BTM222 und RS232 und ATMEGA128
    Von bpoettker im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 11.11.2008, 23:39

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress