Hallo,

ich habe hier ein mir unerkärliches Phänomen. Ich möchte genau ein Byte übertragen. Deshalb habe ich nach dem Transfer eine Schleife, die in sich alle Ewigkeit wiederholen sollte.
Die While-Schleife davor
while (!(PIND & (1<<1)))
funktioniert auch. Aber solange PD1==1 ist, läuft das Programm immer wieder von vorne durch und überträgt ein 0xAA nach dem anderen. Warum?

Das Pogramm ist ganz einfach. Sobald sich jemand mit dem Bluetooth-Modul verbunden hat, setzt das Modul PD1 auf High. Anschließend wird das Byte 0xAA übertragen.

Code:
#define F_CPU 14745600

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>


unsigned char c=0;  // Zähler für empfangene Bytes

void UART1_Transmit( unsigned char data ) {
    /* Wait for empty transmit buffer */
    while ( !( UCSR1A & (1<<UDRE1)) )
    ;
    /* Put data into buffer, sends the data */
    UDR1 = data;
}

unsigned char UART1_Receive( void )
{
    while ( !(UCSR1A & (1<<RXC1)) )
    ; // wait for Receive Complete
    return UDR1;
}


// =================
//  Interrupts
// =================

SIGNAL (SIG_UART1_RECV)
{
  // zählt die Anzahl der eingehenden Datenbytes und gibt
  // die Zahl auf die LEDs aus
  unsigned char temp;
  temp = UDR1;
  c++;
  PORTC = c;
}

// ===============
//  Main program
// ===============
int main (void){
	DDRC = 0xFF;		// LEDs als out
	PORTC = 0;	// LEDs ausschalten
    
    DDRD = 0x09;      // 
	PORTD = (1<<0);	// Bluetooth-Modul aktivieren
 
    // Blinken und Meldung des BTM überbrücken
    int i;
    for (i=10;i!=0;i--){
        PORTC ^= 0x01;
        _delay_ms(200);
        _delay_ms(200);
        _delay_ms(200);
        _delay_ms(200);
    }


    // ===================================
    // Konfiguration für UART1 - Bluetooth
    // ===================================
    //UBRR1 = 7;  // für 115200 Baud bei 14MHz
    UBRR1H = 0x00;
    UBRR1L = 0x07;
    
    // 7   : 1 RXC-Int
    // 6   : 1 TXC-Int
    // 5   : 0 Buffer-Empty Int
    // 4   : 1 Rx Enable
    // 3   : 1 Tx Enable
    // 2   : 0 8 Bit Paylod
    // 1   : 0 9th Data Bit
    // 0   : 0 9th Data Bit
    // => 1101 1000 = 0xD8
    UCSR1B = 0xD8;

    // 7   : 0  not used
    // 6   : 0  asyncr.
    // 5,4 : 00 Parity disabled
    // 3   : 0  1 Stop Bit
    // 2,1 : 11 8 Bit Payload
    // 0   : 0  not used for asyncr.
    // => 0000 0110 = 0x06
    UCSR1C = 0x06;

    sei(); // Global enable interrupts
    
    while (!(PIND & (1<<1)))
    ; // wait

    PORTC = 0xFF;
    UART1_Transmit(0xAA);

    // wait forever
    while (1){
        PORTC ^= 0x02;
    }

	return 0;
} // main
Irgendwie hängt das mit dem UART-Kram zusammen. Ich habe ja das Gefühl, dass die Schleife einfach wegoptimiert wird oder so. Deshalb habe ich auch schon Assembler-no-operations eingefügt. Hat aber nix verändert.

Irgendwelche Ideen?

Arne